| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Link tool for DB_DataObject | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PHP versions 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LICENSE: This source file is subject to version 3.01 of the PHP license | 
					
						
							|  |  |  |  * that is available through the world-wide-web at the following URI: | 
					
						
							|  |  |  |  * http://www.php.net/license/3_01.txt.  If you did not receive a copy of | 
					
						
							|  |  |  |  * the PHP License and are unable to obtain it through the web, please | 
					
						
							|  |  |  |  * send a note to license@php.net so we can mail you a copy immediately. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category   Database | 
					
						
							|  |  |  |  * @package    DB_DataObject | 
					
						
							|  |  |  |  * @author     Alan Knowles <alan@akbkhome.com> | 
					
						
							|  |  |  |  * @copyright  1997-2006 The PHP Group | 
					
						
							|  |  |  |  * @license    http://www.php.net/license/3_01.txt  PHP License 3.01 | 
					
						
							|  |  |  |  * @version    : FIXME | 
					
						
							|  |  |  |  * @link       http://pear.php.net/package/DB_DataObject | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Example of how this could be used.. | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |  * The lind method are now in here. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Currenly only supports existing methods, and new 'link()' method | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Links class | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @package DB_DataObject | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  | class DB_DataObject_Links | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |      * @property {DB_DataObject}      do   DataObject to apply this to. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |     public $do = false; | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @property {Array|String} load    What to load, 'all' or an array of properties. (default all) | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |     public $load = 'all'; | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @property {String|Boolean}       scanf   use part of column name as resulting | 
					
						
							|  |  |  |      *                                          property name. (default false) | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |     public $scanf = false; | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @property {String|Boolean}       printf  use column name as sprintf for resulting property name.. | 
					
						
							|  |  |  |      *                                     (default %s_link if apply is true, otherwise it is %s) | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |     public $printf = false; | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @property {Boolean}      cached  cache the result, so future queries will use cache rather | 
					
						
							|  |  |  |      *                                  than running the expensive sql query. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |     public $cached = false; | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @property {Boolean}      apply   apply the result to this object, (default true) | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |     public $apply = true; | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     //------------------------- RETURN ------------------------------------
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @property {Array}      links    key value associative array of links. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |     public $links; | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Constructor | 
					
						
							|  |  |  |      *   -- good ole style.. | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |      * @param {DB_DataObject}           do  DataObject to apply to. | 
					
						
							|  |  |  |      * @param array $cfg | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function __construct($do, $cfg = array()) | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         // check if do is set!!!?
 | 
					
						
							|  |  |  |         $this->do = $do; | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         foreach ($cfg as $k => $v) { | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |             $this->$k = $v; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |      *  a generic geter/setter provider.. | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |      *  provides a generic getter setter for the referenced object | 
					
						
							|  |  |  |      *  eg. | 
					
						
							|  |  |  |      *  $link->link('company_id') returns getLink for the object | 
					
						
							|  |  |  |      *  if nothing is linked (it will return an empty dataObject) | 
					
						
							|  |  |  |      *  $link->link('company_id', array(1)) - just sets the | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |      *  also array as the field speck supports | 
					
						
							|  |  |  |      *      $link->link(array('company_id', 'company:id')) | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |      * | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |      * @param string|array $field the field to fetch or link spec. | 
					
						
							|  |  |  |      * @param array $args | 
					
						
							|  |  |  |      * @return mixed true of false on set, the object on getter. | 
					
						
							|  |  |  |      * @params array          $args    the arguments sent to the getter setter | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |     public function link($field, $args = array()) | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |         $info = $this->linkInfo($field); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!$info) { | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |             $this->do->raiseError( | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |                 "getLink:Could not find link for row $field", | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |                 DB_DATAOBJECT_ERROR_INVALIDCONFIG | 
					
						
							|  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |         $field = $info[2]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($args)) { // either an empty array or really empty....
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!isset($this->do->$field)) { | 
					
						
							|  |  |  |                 return $info[0]; // empty dataobject.
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             $ret = $this->getLink($field); | 
					
						
							|  |  |  |             // nothing linked -- return new object..
 | 
					
						
							|  |  |  |             return ($ret === 0) ? $info[0] : $ret; | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |         $assign = is_array($args) ? $args[0] : $args; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // otherwise it's a set call..
 | 
					
						
							|  |  |  |         if (!is_a($assign, 'DB_DataObject')) { | 
					
						
							|  |  |  |             if (is_numeric($assign) && is_integer($assign * 1)) { | 
					
						
							|  |  |  |                 if ($assign > 0) { | 
					
						
							|  |  |  |                     if (!$info) { | 
					
						
							|  |  |  |                         return false; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     // check that record exists..
 | 
					
						
							|  |  |  |                     if (!$info[0]->get($info[1], $assign)) { | 
					
						
							|  |  |  |                         return false; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $this->do->$field = $assign; | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return false; | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // otherwise we are assigning it ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->do->$field = $assign->{$info[1]}; | 
					
						
							|  |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * get link information for a field or field specification | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * alll link (and join methods accept the 'link' info ) in various ways | 
					
						
							|  |  |  |      * string : 'field' = which field to get (uses ???.links.ini to work out what) | 
					
						
							|  |  |  |      * array(2) : 'field', 'table:remote_col' << just like the links.ini def. | 
					
						
							|  |  |  |      * array(3) : 'field', $dataobject, 'remote_col'  (handy for joinAdd to do nested joins.) | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |      * @param string|array $field or link spec to use. | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |      * @return array|bool (false|array) array of dataobject and linked field or false. | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |     public function linkInfo($field) | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         if (is_array($field)) { | 
					
						
							|  |  |  |             if (count($field) == 3) { | 
					
						
							|  |  |  |                 // array with 3 args:
 | 
					
						
							|  |  |  |                 // local_col , dataobject, remote_col
 | 
					
						
							|  |  |  |                 return array( | 
					
						
							|  |  |  |                     $field[1], | 
					
						
							|  |  |  |                     $field[2], | 
					
						
							|  |  |  |                     $field[0] | 
					
						
							|  |  |  |                 ); | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |             list($table, $link) = explode(':', $field[1]); | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |             return array( | 
					
						
							|  |  |  |                 $this->do->factory($table), | 
					
						
							|  |  |  |                 $link, | 
					
						
							|  |  |  |                 $field[0] | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // work out the link.. (classic way)
 | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         $links = $this->do->links(); | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         if (empty($links) || !is_array($links)) { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         if (!isset($links[$field])) { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |         list($table, $link) = explode(':', $links[$field]); | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         //??? needed???
 | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |         if ($p = strpos($field, ".")) { | 
					
						
							|  |  |  |             $field = substr($field, 0, $p); | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         return array( | 
					
						
							|  |  |  |             $this->do->factory($table), | 
					
						
							|  |  |  |             $link, | 
					
						
							|  |  |  |             $field | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |      * return name from related object | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |      * The relies on  a <dbname>.links.ini file, unless you specify the arguments. | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |      * you can also use $this->getLink('thisColumnName','otherTable','otherTableColumnName') | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |      * | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |      * @param string $field |array    either row or row.xxxxx or links spec. | 
					
						
							|  |  |  |      * @param bool $table (optional) name of table to look up value in | 
					
						
							|  |  |  |      * @param string $link (optional)  name of column in other table to match | 
					
						
							|  |  |  |      * @return mixed object on success false on failure or '0' when not linked | 
					
						
							|  |  |  |      * @author Tim White <tim@cyface.com> | 
					
						
							|  |  |  |      * @access public | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |     public function getLink($field, $table = false, $link = '') | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |         static $cache = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // GUESS THE LINKED TABLE.. (if found - recursevly call self)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($table == false) { | 
					
						
							|  |  |  |             $info = $this->linkInfo($field); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if ($info) { | 
					
						
							|  |  |  |                 return $this->getLink($field, $info[0], $link === false ? $info[1] : $link); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // no links defined.. - use borked BC method...
 | 
					
						
							|  |  |  |             // use the old _ method - this shouldnt happen if called via getLinks()
 | 
					
						
							|  |  |  |             if (!($p = strpos($field, '_'))) { | 
					
						
							|  |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $table = substr($field, 0, $p); | 
					
						
							|  |  |  |             return $this->getLink($field, $table); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $tn = is_string($table) ? $table : $table->tableName(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!isset($this->do->$field)) { | 
					
						
							|  |  |  |             $this->do->raiseError("getLink: row not set $field", DB_DATAOBJECT_ERROR_NODATA); | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // check to see if we know anything about this table..
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($this->do->$field) || $this->do->$field < 0) { | 
					
						
							|  |  |  |             return 0; // no record.
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($this->cached && isset($cache[$tn . ':' . $link . ':' . $this->do->$field])) { | 
					
						
							|  |  |  |             return $cache[$tn . ':' . $link . ':' . $this->do->$field]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $obj = is_string($table) ? $this->do->factory($tn) : $table;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!is_a($obj, 'DB_DataObject')) { | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |             $this->do->raiseError( | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |                 "getLink:Could not find class for row $field, table $tn", | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |                 DB_DATAOBJECT_ERROR_INVALIDCONFIG | 
					
						
							|  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |         // -1 or 0 -- no referenced record..
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $ret = false; | 
					
						
							|  |  |  |         if ($link) { | 
					
						
							|  |  |  |             if ($obj->get($link, $this->do->$field)) { | 
					
						
							|  |  |  |                 $ret = $obj; | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // this really only happens when no link config is set (old BC stuff)
 | 
					
						
							|  |  |  |         } elseif ($obj->get($this->do->$field)) { | 
					
						
							|  |  |  |             $ret = $obj; | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |         if ($this->cached) { | 
					
						
							|  |  |  |             $cache[$tn . ':' . $link . ':' . $this->do->$field] = $ret; | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |         return $ret; | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * load related objects | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Generally not recommended to use this. | 
					
						
							|  |  |  |      * The generator should support creating getter_setter methods which are better suited. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Relies on  <dbname>.links.ini | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Sets properties on the calling dataobject  you can change what | 
					
						
							|  |  |  |      * object vars the links are stored in by  changeing the format parameter | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |      * @param string format (default _%s) where %s is the table name. | 
					
						
							|  |  |  |      * @return boolean , true on success | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |      * @author Tim White <tim@cyface.com> | 
					
						
							|  |  |  |      * @access public | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |     public function applyLinks($format = '_%s') | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         // get table will load the options.
 | 
					
						
							|  |  |  |         if ($this->do->_link_loaded) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         $this->do->_link_loaded = false; | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |         $cols = $this->do->table(); | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         $links = $this->do->links(); | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         $loaded = array(); | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |         if ($links) { | 
					
						
							|  |  |  |             foreach ($links as $key => $match) { | 
					
						
							|  |  |  |                 list($table, $link) = explode(':', $match); | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |                 $k = sprintf($format, str_replace('.', '_', $key)); | 
					
						
							|  |  |  |                 // makes sure that '.' is the end of the key;
 | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |                 if ($p = strpos($key, '.')) { | 
					
						
							|  |  |  |                     $key = substr($key, 0, $p); | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |                 $this->do->$k = $this->getLink($key, $table, $link); | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |                 if (is_object($this->do->$k)) { | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |                     $loaded[] = $k; | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $this->do->_link_loaded = $loaded; | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // this is the autonaming stuff..
 | 
					
						
							|  |  |  |         // it sends the column name down to getLink and lets that sort it out..
 | 
					
						
							|  |  |  |         // if there is a links file then it is not used!
 | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |         // IT IS DEPRECATED!!!! - DO NOT USE
 | 
					
						
							|  |  |  |         if (!is_null($links)) { | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         foreach (array_keys($cols) as $key) { | 
					
						
							|  |  |  |             if (!($p = strpos($key, '_'))) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             // does the table exist.
 | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |             $k = sprintf($format, $key); | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |             $this->do->$k = $this->getLink($key); | 
					
						
							|  |  |  |             if (is_object($this->do->$k)) { | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |                 $loaded[] = $k; | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         $this->do->_link_loaded = $loaded; | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * getLinkArray | 
					
						
							|  |  |  |      * Fetch an array of related objects. This should be used in conjunction with a | 
					
						
							|  |  |  |      * <dbname>.links.ini file configuration (see the introduction on linking for details on this). | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * You may also use this with all parameters to specify, the column and related table. | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |      * @access public | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |      * @param string $field - either column or column.xxxxx | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |      * @param string $table (optional) name of table to look up value in | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  |      * @param bool $fkey (optional) fetchall key see DB_DataObject::fetchAll() | 
					
						
							|  |  |  |      * @param bool $fval (optional) fetchall method DB_DataObject::fetchAll() | 
					
						
							|  |  |  |      * @param bool $fmethod | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |      * @return array - array of results (empty array on failure) | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |      * Example - Getting the related objects | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |      * $person = new DataObjects_Person; | 
					
						
							|  |  |  |      * $person->get(12); | 
					
						
							|  |  |  |      * $children = $person->getLinkArray('children'); | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |      * echo 'There are ', count($children), ' descendant(s):<br />'; | 
					
						
							|  |  |  |      * foreach ($children as $child) { | 
					
						
							|  |  |  |      *     echo $child->name, '<br />'; | 
					
						
							|  |  |  |      * } | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |     public function getLinkArray($field, $table = null, $fkey = false, $fval = false, $fmethod = false) | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         $ret = array(); | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |         if (!$table) { | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |             $links = $this->do->links(); | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |             if (is_array($links)) { | 
					
						
							|  |  |  |                 if (!isset($links[$field])) { | 
					
						
							|  |  |  |                     // failed..
 | 
					
						
							|  |  |  |                     return $ret; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |                 list($table, $link) = explode(':', $links[$field]); | 
					
						
							|  |  |  |                 return $this->getLinkArray($field, $table); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (!($p = strpos($field, '_'))) { | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |                 return $ret; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |             return $this->getLinkArray($field, substr($field, 0, $p)); | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-04-27 18:21:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $c = $this->do->factory($table); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |         if (!is_object($c) || !is_a($c, 'DB_DataObject')) { | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |             $this->do->raiseError( | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |                 "getLinkArray:Could not find class for row $field, table $table", | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |                 DB_DATAOBJECT_ERROR_INVALIDCONFIG | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |             return $ret; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // if the user defined method list exists - use it...
 | 
					
						
							|  |  |  |         if (method_exists($c, 'listFind')) { | 
					
						
							|  |  |  |             $c->listFind($this->id); | 
					
						
							|  |  |  |             while ($c->fetch()) { | 
					
						
							|  |  |  |                 $ret[] = clone($c); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return $ret; | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-08-12 12:32:39 +02:00
										 |  |  |         return $c->fetchAll($fkey, $fval, $fmethod); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-04-16 00:20:20 +01:00
										 |  |  | } |