Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
0.00% |
0 / 188 |
|
0.00% |
0 / 23 |
CRAP | |
0.00% |
0 / 1 |
| appRelateBase | |
0.00% |
0 / 187 |
|
0.00% |
0 / 23 |
12656 | |
0.00% |
0 / 1 |
| __construct | n/a |
0 / 0 |
n/a |
0 / 0 |
1 | |||||
| bread_crumps | |
0.00% |
0 / 18 |
|
0.00% |
0 / 1 |
110 | |||
| hoja_label | |
0.00% |
0 / 5 |
|
0.00% |
0 / 1 |
20 | |||
| sql_options_get | |
0.00% |
0 / 13 |
|
0.00% |
0 / 1 |
42 | |||
| cache_query | |
0.00% |
0 / 3 |
|
0.00% |
0 / 1 |
6 | |||
| sql_link_read | |
0.00% |
0 / 20 |
|
0.00% |
0 / 1 |
72 | |||
| sql_link_fields_posible | |
0.00% |
0 / 10 |
|
0.00% |
0 / 1 |
6 | |||
| sql_deduce_field_index | |
0.00% |
0 / 15 |
|
0.00% |
0 / 1 |
132 | |||
| enum_get | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
30 | |||
| enum_getClassed | |
0.00% |
0 / 10 |
|
0.00% |
0 / 1 |
42 | |||
| enum_value_class | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
12 | |||
| log | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
30 | |||
| log_tema_to_id | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
| log_action_to_id | |
0.00% |
0 / 3 |
|
0.00% |
0 / 1 |
6 | |||
| toLabel | |
0.00% |
0 / 3 |
|
0.00% |
0 / 1 |
2 | |||
| campos_incorpora | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
30 | |||
| table_child_gridAtribute | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
| childs_order | |
0.00% |
0 / 12 |
|
0.00% |
0 / 1 |
72 | |||
| child_hide | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
| table_link_delete_allRule | |
0.00% |
0 / 8 |
|
0.00% |
0 / 1 |
30 | |||
| table_link_delete_rules | |
0.00% |
0 / 9 |
|
0.00% |
0 / 1 |
20 | |||
| table_child_type | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
30 | |||
| table_make_child | |
0.00% |
0 / 21 |
|
0.00% |
0 / 1 |
132 | |||
| table_unmake_child | |
0.00% |
0 / 8 |
|
0.00% |
0 / 1 |
30 | |||
| 1 | <?php |
| 2 | |
| 3 | // permisos default, a menos que clase ponga el suyo propio |
| 4 | define('PERMISO_POR_TIPO_TABLA',1); // si tabla tipo es catalogo solo tipo de usuario>=power user |
| 5 | define('PERMISO_POR_PERMISO_VARS',2); // iacase->permiso_[list|insert...] sin reajustar por db |
| 6 | define('PERMISO_POR_TABLE_PERMISSIONS',4); // iacase usa permisos de db iac_table |
| 7 | define('PERMISO_POR_FIELD_PERMISSIONS',8); // hay permisos por cada campo |
| 8 | define('PERMISO_POR_SECTION_PERMISSIONS',16); // hay segregados por un campo en el registro |
| 9 | define('PERMISO_POR_EDITORS',32); // de existir campo iac_editors user debe estar ahi para editar |
| 10 | define('PERMISO_POR_READRES',64); // de existir campo iac_readers user debe estar ahi para editar |
| 11 | global $PERMISOS_APP; |
| 12 | $PERMISOS_APP = PERMISO_POR_TIPO_TABLA+PERMISO_POR_PERMISO_VARS+PERMISO_POR_EDITORS+PERMISO_POR_READRES; // suma de los de arriba deseados |
| 13 | |
| 14 | class appRelateBase { |
| 15 | public $tables=array(); |
| 16 | public $enums=array(); |
| 17 | public $links=array(); |
| 18 | public $link_dont_cache=array(); // ie array('cliente_id') no traera SQL_CACHE |
| 19 | public $iac_enum_class=array(); // cache para iac_class_enum usado en enum_getClassed |
| 20 | function __construct() { |
| 21 | } |
| 22 | |
| 23 | ///////////////// |
| 24 | //APP SPECIFIC |
| 25 | ////////////////// |
| 26 | |
| 27 | ///////////////// |
| 28 | // CUSTOMIZIBLE |
| 29 | ////////////////// |
| 30 | |
| 31 | public function bread_crumps($table='',$h='',$recordLabel='') { |
| 32 | $at=$this->hoja_label($table); |
| 33 | $iconoHome=''; |
| 34 | if($table!='' && isset($this->tables[$table]['icono_table']) && $this->tables[$table]['icono_table']!='' ) |
| 35 | $iconoTable="<img src='".$this->tables[$table]['icono_table']."' />"; |
| 36 | else |
| 37 | $iconoTable=''; |
| 38 | |
| 39 | if($_SERVER['SCRIPT_NAME']=='index.php') |
| 40 | return "$iconoHome<a class='bcen' href='index.php'>Inicio</a>"; |
| 41 | if($h=='e') |
| 42 | $haciendo='editando '.$recordLabel; |
| 43 | elseif($h=='a') |
| 44 | $haciendo='creando '.$recordLabel; |
| 45 | elseif($h=='r') |
| 46 | $haciendo='consultando '.$recordLabel; |
| 47 | elseif($h=='b') |
| 48 | $haciendo='confirmando elminar '.$recordLabel; |
| 49 | else |
| 50 | $haciendo=''; |
| 51 | |
| 52 | if($haciendo!='') |
| 53 | $haciendo=" <i>($haciendo)</i>"; |
| 54 | |
| 55 | return "$iconoHome<a href='index.php'>Inicio</a> -> $iconoTable<a class=bcen href=$_SERVER[SCRIPT_NAME]>$at</a> $haciendo"; |
| 56 | } |
| 57 | |
| 58 | public function hoja_label($table='') { |
| 59 | if($table!='' && isset($this->tables[$table]['label_table']) && $this->tables[$table]['label_table']!='' ) |
| 60 | return $this->tables[$table]['label_table']; |
| 61 | $at= basename($_SERVER['SCRIPT_NAME']); |
| 62 | $at=str_replace(array('.php','.html','.htm','_'),' ',$at); |
| 63 | return $at; |
| 64 | } |
| 65 | |
| 66 | public function sql_options_get($table,$fieldName,$linkItem=null,$iacase=null,$selectedId=null,$for_edit=true,$for_read=false,$inGrid=false) { |
| 67 | if(array_key_exists($linkItem,$this->links)) |
| 68 | return $this->cache_query($fieldName, $this->links[$linkItem]['options']); |
| 69 | $use=str_replace(array('_id'),array(''),$fieldName); |
| 70 | if(array_key_exists($use,$this->links)) |
| 71 | return $this->cache_query($fieldName,$this->links[$use]['options']); |
| 72 | $altField = $this->sql_deduce_field_index($table,$fieldName); |
| 73 | if(array_key_exists($altField,$this->links)) |
| 74 | return $this->cache_query($fieldName,$this->links[$altField]['options']); |
| 75 | |
| 76 | $arr=$this->sql_link_fields_posible($table,$fieldName); |
| 77 | foreach($arr as $field) |
| 78 | if(array_key_exists($field,$this->links)) |
| 79 | return $this->cache_query($fieldName, $this->links[$field]['options']); |
| 80 | //echo "<h1>NOT FOUND t=$table f=$fieldName id=$id</h1>"; |
| 81 | //echo "<pre>links".print_r($this->links,true)."<pre>arr".print_r($arr,true); |
| 82 | //die("FINITO"); |
| 83 | return "SELECT '$altField','$fieldName link NOT FOUND'"; |
| 84 | } |
| 85 | |
| 86 | public function cache_query($fieldName,$sql) { |
| 87 | if( in_array($fieldName,$this->link_dont_cache)) |
| 88 | return $sql; |
| 89 | return str_replace('xSELECT','SELECT '.SQL_CACHE, 'x'.$sql); |
| 90 | } |
| 91 | |
| 92 | public function sql_link_read($table,$fieldName,$id='') { |
| 93 | |
| 94 | $use=str_replace(array('_id'),array(''),$fieldName); |
| 95 | if(array_key_exists($use,$this->links)) |
| 96 | return str_replace( array('%id%'), array($id), $this->links[$use]['read']); |
| 97 | $altField=$this->sql_deduce_field_index($table,$fieldName); |
| 98 | if(array_key_exists($altField,$this->links)) |
| 99 | return str_replace( array('%id%'), array($id), $this->links[$altField]['read']); |
| 100 | $tmp=explode('_',$use); |
| 101 | if(array_key_exists($tmp[0],$this->links)) |
| 102 | return str_replace( array('%id%'), array($id), $this->links[$tmp[0]]['read']); |
| 103 | $use=strtolower($use); |
| 104 | if(array_key_exists($use,$this->links)) |
| 105 | return str_replace( array('%id%'), array($id), $this->links[$use]['read']); |
| 106 | $altField=strtolower($altField); |
| 107 | if(array_key_exists($altField,$this->links)) |
| 108 | return str_replace( array('%id%'), array($id), $this->links[$altField]['read']); |
| 109 | $arr=$this->sql_link_fields_posible($table,$fieldName); |
| 110 | foreach($arr as $field) |
| 111 | if(array_key_exists($field,$this->links)) |
| 112 | return str_replace( array('%id%'), array($id), $this->links[$field]['read']); |
| 113 | return "SELECT '$altField','$fieldName link NOT FOUND'"; |
| 114 | } |
| 115 | |
| 116 | public function sql_link_fields_posible($table,$fieldName,$linkItem=null,$for_edit=true,$for_read=false) { |
| 117 | $ret=array(); |
| 118 | $ret[]=$use=str_replace(array('_id'),array(''),$fieldName); |
| 119 | $ret[]=$this->sql_deduce_field_index($table,$fieldName); |
| 120 | $tmp=explode('_',$use); |
| 121 | $ret[]=$tmp[0]; |
| 122 | $arr=array(); |
| 123 | foreach($ret as $k=>$d) { |
| 124 | $arr[]=$ret[$k]; |
| 125 | $arr[]=strtolower($ret[$k]); |
| 126 | } |
| 127 | return $arr; |
| 128 | } |
| 129 | |
| 130 | public function sql_deduce_field_index($table,$fieldName) { |
| 131 | $split=explode('_',$fieldName); |
| 132 | if(sizeof($split)<=2) |
| 133 | return $fieldName; |
| 134 | $split=array_reverse($split); |
| 135 | foreach($split as $try) if($try!='id' && $try!=$table ) { // no self joins,next loop |
| 136 | if(array_key_exists($try,$this->links)) { |
| 137 | return $try; |
| 138 | } elseif(array_key_exists(strtolower($try),$this->links)) |
| 139 | return strtolower($try); |
| 140 | } |
| 141 | foreach($split as $try) if($try!='id' ) { |
| 142 | if(array_key_exists($try,$this->links)) { |
| 143 | return $try; |
| 144 | } elseif(array_key_exists(strtolower($try),$this->links)) |
| 145 | return strtolower($try); |
| 146 | } |
| 147 | return $fieldName; |
| 148 | } |
| 149 | |
| 150 | public function enum_get($table,$fieldName,$campos=array(),$alter='') { |
| 151 | if(!empty($alter) && array_key_exists("$table.$fieldName.$alter",$this->enums)) |
| 152 | return $this->enums["$table.$fieldName.$alter"]; |
| 153 | if(array_key_exists("$table.$fieldName",$this->enums)) |
| 154 | return $this->enums["$table.$fieldName"]; |
| 155 | if(array_key_exists($fieldName,$this->enums)) |
| 156 | return $this->enums[$fieldName]; |
| 157 | |
| 158 | //if(array_key_exists($fieldName,$campos) && array_key_exists('options_array',$campos[$fieldName]) ) return $campos[$fieldName]['options_array']; |
| 159 | return array("$fieldName enum NOT FOUND","$fieldName enum NOT FOUND"); |
| 160 | } |
| 161 | |
| 162 | public function enum_getClassed($table,$fieldName) { |
| 163 | $arr=$this->enum_get($table,$fieldName); |
| 164 | if(empty($this->iac_enum_class) ) |
| 165 | $this->iac_enum_class=ia_sqlArray("SELECT ".SQL_CACHE." valor_enum,class FROM iac_enum_class",'valor_enum'); |
| 166 | |
| 167 | foreach($arr as $k=>$v) { |
| 168 | if( array_key_exists($k,$this->iac_enum_class) ) { |
| 169 | $arr[$k]=array('id'=>$k, 'label'=>$v,'class'=>$this->iac_enum_class[$k]['class']); |
| 170 | } elseif($table=='iac_enum_class' && $fieldName=='class') |
| 171 | $arr[$k]=array('id'=>$k ,'label'=>$v,'class'=>$v); |
| 172 | else |
| 173 | $arr[$k]=array('id'=>$k ,'label'=>$v,'class'=>'negro_blanco'); |
| 174 | } |
| 175 | return $arr; |
| 176 | } |
| 177 | public function enum_value_class($table,$fieldName,$value) { |
| 178 | if(empty($this->iac_enum_class) ) |
| 179 | $this->iac_enum_class=ia_sqlArray("SELECT ".SQL_CACHE." valor_enum,class FROM iac_enum_class",'valor_enum'); |
| 180 | if(array_key_exists($value,$this->iac_enum_class)) |
| 181 | return $this->iac_enum_class[$value]['class']; |
| 182 | return ''; |
| 183 | } |
| 184 | |
| 185 | function log($action,$tema,$id,$msg,$usuario=null,$documento='') { |
| 186 | if(empty($usuario)) |
| 187 | $usuario= array_key_exists('usuario',$_SESSION) ? $_SESSION['usuario'] : '?'; |
| 188 | if(!is_numeric($tema)) |
| 189 | $tema=$this->log_tema_to_id($tema); |
| 190 | if(!is_numeric($action)) |
| 191 | $action=$this->log_action_to_id($action); |
| 192 | ia_query("INSERT INTO iac_log(fecha,usuario,iac_log_hecho_id,iac_table_id,record,documento,nota) VALUES(NOW(),".stritc($usuario).stritc($action).stritc($tema).stritc($id).stritc($documento).strit($msg).")"); |
| 193 | } |
| 194 | |
| 195 | function log_tema_to_id($tema) { |
| 196 | return ia_singleread("SELECT ".SQL_CACHE." iac_table_id FROM iac_table WHERE tabla=".strit($tema)." LIMIT 1","0"); |
| 197 | } |
| 198 | |
| 199 | function log_action_to_id($action) { |
| 200 | $to=array( 'sin permiso'=>1,'bad login'=>2 |
| 201 | ,'view'=>10,'edit'=>11,'update'=>11,'insert'=>12,'delete'=>13,'reordenar'=>14 |
| 202 | ,'list'=>20,'export'=>22,'print'=>23,'send as email'=>24,'report'=>25,'search'=>29 |
| 203 | ,'login'=>31,'logout'=>32 |
| 204 | ,'other'=>254,'Sistema'=>0 |
| 205 | ); |
| 206 | if(array_key_exists($action,$to)) |
| 207 | return $to[$action]; |
| 208 | return ia_singleread("SELECT ".SQL_CACHE." iac_log_hecho_id FROM iac_log_hecho WHERE hecho=".strit($action)." LIMIT 1","0"); |
| 209 | } |
| 210 | |
| 211 | ///////////////// |
| 212 | // GENERAL |
| 213 | ////////////////// |
| 214 | public function toLabel($s) { |
| 215 | $s=str_replace(array('_id','_'),array('',' '),$s); |
| 216 | $s=ucwords($s); |
| 217 | return $s; |
| 218 | } |
| 219 | |
| 220 | |
| 221 | |
| 222 | function campos_incorpora($tabla,&$campos) { |
| 223 | return $campos; |
| 224 | $iac_limits=ia_sqlArray("SELECT /* appRelateBase:campos_incorpora limites */ campo, maximo, minimo, warn_maximo, warn_minimo, label, title FROM iac_limits WHERE iac_table='$tabla'",'campo'); |
| 225 | if($iac_limits) |
| 226 | foreach($iac_limits as $fieldName=>$data) |
| 227 | if(array_key_exists($fieldName,$campos)) |
| 228 | foreach($data as $k=>$v) |
| 229 | $campos[$fieldName][$k]=$v; |
| 230 | return $campos; |
| 231 | } |
| 232 | |
| 233 | ///////////////// |
| 234 | // CHILDS / LINKS |
| 235 | ////////////////// |
| 236 | public function table_child_gridAtribute($tableParent,$tableChild,$childLink,$gridAtribute,$valor) { |
| 237 | $this->tables[$tableChild]['links_to'][$tableParent][$childLink][$gridAtribute]=$valor; |
| 238 | } |
| 239 | |
| 240 | |
| 241 | public function childs_order($tableParent,$order=array()) { |
| 242 | if(!array_key_exists($tableParent,$this->tables) || empty($order)) |
| 243 | return; |
| 244 | if(array_key_exists('links_from',$this->tables[$tableParent])) { |
| 245 | $links=$this->tables[$tableParent]['links_from']; |
| 246 | $arr=array(); |
| 247 | foreach($order as $child) |
| 248 | if(array_key_exists($child,$links)) |
| 249 | $arr[$child]=$links[$child]; |
| 250 | foreach($links as $child=>$d) |
| 251 | if(!array_key_exists($child,$arr)) |
| 252 | $arr[$child]=$d; |
| 253 | $this->tables[$tableParent]['links_from']=$arr; |
| 254 | } |
| 255 | } |
| 256 | |
| 257 | public function child_hide($tableParent,$tableChild,$fieldName,$hide=true) { |
| 258 | $this->tables[$tableParent]['links_from'][$tableChild][$fieldName]['hide']=$hide; |
| 259 | } |
| 260 | |
| 261 | public function table_link_delete_allRule($tableRestrict,$restrict_delete,$delete_with_parent) { |
| 262 | if(!array_key_exists($tableRestrict,$this->tables)) |
| 263 | return " appRelateBase::table_link_delete_allRule no tableRestrict $tableRestrict"; |
| 264 | if(!array_key_exists('links_from',$this->tables[$tableRestrict])) |
| 265 | return " appRelateBase::table_link_delete_allRule 'links_from' for table $tableRestrict"; |
| 266 | |
| 267 | foreach($this->tables[$tableRestrict]['links_from'] as $table_from=>$d) |
| 268 | foreach($d as $fieldName=>$v) { |
| 269 | $this->tables[$tableRestrict]['links_from'][$table_from][$fieldName]['restrict_delete']=$restrict_delete; |
| 270 | $this->tables[$tableRestrict]['links_from'][$table_from][$fieldName]['delete_with_parent']=$delete_with_parent; |
| 271 | } |
| 272 | //echo "<h1>OUT $tableRestrict. </h1> <pre>".print_r($this->tables[$tableRestrict]['links_from'],true)."</pre><hr>"; |
| 273 | } |
| 274 | |
| 275 | public function table_link_delete_rules($tableRestrict,$tableToCheck,$fieldName,$restrict_delete=true,$delete_with_parent=false,$on_delete_set_to='0') { |
| 276 | if(!array_key_exists($tableRestrict,$this->tables)) |
| 277 | return " appRelateBase::table_link_delete_rules no tableRestrict $tableRestrict"; |
| 278 | if(!array_key_exists($tableToCheck,$this->tables[$tableRestrict]['links_from'])) |
| 279 | return " appRelateBase::table_link_delete_rules no tableToCheck $tableToCheck"; |
| 280 | if(!array_key_exists($fieldName,$this->tables[$tableRestrict]['links_from'][$tableToCheck])) |
| 281 | return " appRelateBase::table_link_delete_rules no linkField $tableToCheck.$fieldName"; |
| 282 | $this->tables[$tableRestrict]['links_from'][$tableToCheck][$fieldName]['restrict_delete']=$restrict_delete; |
| 283 | $this->tables[$tableRestrict]['links_from'][$tableToCheck][$fieldName]['delete_with_parent']=$delete_with_parent; |
| 284 | $this->tables[$tableRestrict]['links_from'][$tableToCheck][$fieldName]['on_delete_set_to']=$on_delete_set_to; |
| 285 | } |
| 286 | |
| 287 | public function table_child_type($parent,$child,$esChild='single_catalog',$formato='link_one_select') { |
| 288 | global $gAppRelate; |
| 289 | if(array_key_exists('links_to',$this->tables[$child]) ) { |
| 290 | if(array_key_exists($parent,$this->tables[$child]['links_to']) ) { |
| 291 | $es=''; |
| 292 | foreach( $this->tables[$child]['links_to'][$parent] as $es=>$d ) |
| 293 | break; |
| 294 | if($es) { |
| 295 | $this->tables[$child]['links_to'][$parent][$es]['es']=$esChild; |
| 296 | $this->tables[$child]['links_to'][$parent][$es]['formato']=$formato; |
| 297 | //$this->tables[$child]['links_to'][$parent][$es]['es']=$esParent; |
| 298 | } |
| 299 | } |
| 300 | } |
| 301 | } |
| 302 | |
| 303 | public function table_make_child($parent,$child,$parent_link='',$child_link='' |
| 304 | ,$restrict_delete=false,$delete_with_parent=true,$on_delete_set_to=0,$formato='addanother',$es='child') { |
| 305 | $this->tables[$parent]['has_child']=true; |
| 306 | |
| 307 | if(!array_key_exists('links_from',$this->tables[$parent]) ) |
| 308 | $this->tables[$parent]['links_from']=array(); |
| 309 | |
| 310 | if(empty($parent_link)) |
| 311 | $parent_link=$this->tables[$child]['pk_single_field']; |
| 312 | if(empty($child_link)) |
| 313 | $parent_link=$this->tables[$child]['pk_single_field']; |
| 314 | |
| 315 | if(array_key_exists($child,$this->tables[$parent]['links_from']) ) { |
| 316 | if($parent_link=='') { |
| 317 | foreach( $this->tables[$parent]['links_from'][$child] as $es=>$d ) |
| 318 | break; |
| 319 | |
| 320 | } |
| 321 | } else { |
| 322 | $this->tables[$parent]['links_from'][$child]=array(); |
| 323 | } |
| 324 | |
| 325 | $this->tables[$parent]['links_from'][$child][$parent_link]=array( |
| 326 | 'formato'=>$formato, |
| 327 | 'campo'=>$child_link, |
| 328 | 'es'=>$es, |
| 329 | 'to_table' => $child, |
| 330 | 'to_field' => $child_link, |
| 331 | 'this_table' => $parent, |
| 332 | 'this_field' => $parent_link, |
| 333 | 'restrict_delete'=>$restrict_delete, |
| 334 | 'delete_with_parent'=>$delete_with_parent, |
| 335 | 'on_delete_set_to'=>$on_delete_set_to |
| 336 | ); |
| 337 | |
| 338 | if(!array_key_exists($child,$this->tables)) |
| 339 | $this->tables[$child]=array(); |
| 340 | if(!array_key_exists('links_to',$this->tables[$child])) |
| 341 | $this->tables[$child]['links_to']=array(); |
| 342 | if(!array_key_exists($parent,$this->tables[$child]['links_to'])) |
| 343 | $this->tables[$child]['links_to'][$parent]=array(); |
| 344 | if(!array_key_exists($child_link,$this->tables[$child]['links_to'][$parent])) |
| 345 | $this->tables[$child]['links_to'][$parent][$child_link]=array(); |
| 346 | $this->tables[$child]['links_to'][$parent][$child_link]['es']='parent'; |
| 347 | } |
| 348 | |
| 349 | public function table_unmake_child($parent,$child,$esParent='catalog_entry',$esChild='single_catalog',$formato='link_one_select') { |
| 350 | global $gAppRelate; |
| 351 | |
| 352 | if(array_key_exists('links_from',$this->tables[$parent]) ) { |
| 353 | if(array_key_exists($child,$this->tables[$parent]['links_from']) ) { |
| 354 | $es=''; |
| 355 | foreach( $this->tables[$parent]['links_from'][$child] as $es=>$d ) |
| 356 | break; |
| 357 | if($es) { |
| 358 | $this->tables[$parent]['links_from'][$child][$es]['es']=$esChild; |
| 359 | $this->tables[$parent]['links_from'][$child][$es]['formato']=$formato; |
| 360 | $this->tables[$child]['links_to'][$parent][$es]['es']=$esParent; |
| 361 | } |
| 362 | } |
| 363 | } |
| 364 | } |
| 365 | |
| 366 | } |
| 367 | ?> |