function __construct($tabla_padre, $tabla_padre_clave, $tabla_padre_id, $tabla_hijo, $tabla_hijo_clave, $tabla_hijo_id) { toba_asercion::arrays_igual_largo($tabla_padre_clave, $tabla_hijo_clave); $this->tabla_padre = $tabla_padre; $this->tabla_padre_claves = $tabla_padre_clave; $this->tabla_padre_id = $tabla_padre_id; $this->tabla_hijo = $tabla_hijo; $this->tabla_hijo_claves = $tabla_hijo_clave; $this->tabla_hijo_id = $tabla_hijo_id; //Notifico la existencia de la relacion a las tablas $this->tabla_padre->agregar_relacion_con_hijo($this, $this->tabla_hijo_id); $this->tabla_hijo->agregar_relacion_con_padre($this, $this->tabla_padre_id); $this->mapear_campos(); }
/** * Carga el datos_tabla asociado CON clausulas WHERE y FROM especificas, el entorno no incide en ellas * @param array $where Clasulas que seran concatenadas con un AND * @param array $from Tablas extra que participan (la actual se incluye automaticamente) * @param boolean $anexar_datos Si es false borra todos los datos actuales de la tabla, sino los mantiene y adjunto los nuevos * @param boolean $usar_cursores En caso de anexar datos, fuerza a que los padres de la fila sean los cursores actuales de las tablas padre * @return boolean Falso si no se encontro ningún registro */ function cargar_con_where_from_especifico($where = null, $from = null, $anexar_datos = false, $usar_cursores = false) { toba_asercion::es_array_o_null($where, "AP [{$this->_tabla}] El WHERE debe ser un array"); toba_asercion::es_array_o_null($from, "AP [{$this->_tabla}] El FROM debe ser un array"); $sql = $this->generar_sql_select($where, $from); return $this->cargar_con_sql($sql, $anexar_datos, $usar_cursores); }
/** * Se cargan las tablas de la relación restringiendo por las claves de las tablas raiz * @param array $clave Asociativo campo=>valor correspondientes a campos de la(s) tabla(s) raiz * @return boolean Verdadero si al menos se carga una tabla */ function cargar_por_clave($clave) { toba_asercion::es_array($clave, "Error cargando la relación, se esperaba un arreglo asociativo por ejemplo " . "<pre>\$relacion->cargar(array('campo'=> 'valor'))</pre>", true); $this->objeto_relacion->resetear(); $tablas_raiz = $this->objeto_relacion->get_tablas_raiz(); toba_asercion::es_array($tablas_raiz, "Error cargando la relación, se esperaba un arreglo con las tablas raiz de la relacion.", true); $tablas = $this->objeto_relacion->orden_carga(); $ok = false; foreach ($tablas as $id_tabla => $tabla) { if (in_array($id_tabla, $tablas_raiz)) { //Si es una tabla raiz se le restringue por los campos pasados $res = $tabla->persistidor()->cargar_por_clave($clave); } else { //Sino se hace una carga común (en base a las cargas de los padres) $res = $tabla->persistidor()->cargar_por_clave(array()); } $ok = $ok || $res; } $this->objeto_relacion->set_cargado($ok); return $ok; }
/** * Carga las dependencias y las inicializa * @param unknown_type $dependencias * @ignore */ protected function inicializar_dependencias($dependencias) { toba_asercion::es_array($dependencias, "[Inicializar_dependencias] No se definio la lista de dependencias a inicializar"); $this->_log->debug($this->get_txt() . "[ inicializar_dependencias ]\n" . var_export($dependencias, true), 'toba'); //Parametros a generales $parametro["nombre_formulario"] = $this->_nombre_formulario; foreach ($dependencias as $dep) { if (isset($this->_dependencias[$dep])) { //La dependencia ya se encuentra cargada continue; } //-[0]- Creo la dependencia $this->cargar_dependencia($dep); //-[1]- La inicializo $parametro['id'] = $dep; $this->inicializar_dependencia($dep, $parametro); } }
/** * Procesa los cambios masivos de filas * * El id de la fila se asume que la key del registro o la columna apex_datos_clave_fila * Para procesar es necesario indicar el estado de cada fila utilizando una columna referenciada con la constante 'apex_ei_analisis_fila' los valores pueden ser: * - 'A': Alta * - 'B': Baja * - 'M': Modificacion * * @param array $filas Filas en formato RecordSet, cada registro debe contener un valor para la constante apex_ei_analisis_fila * @param mixed $ids_padres Asociativo padre =>id de las filas padres de esta nueva fila, * en caso de que no se brinde, se utilizan los cursores actuales en estas tablas padres */ function procesar_filas($filas, $ids_padres = null) { toba_asercion::es_array($filas, "toba_datos_tabla - El parametro no es un array."); //--- Controlo estructura foreach (array_keys($filas) as $id) { if (!isset($filas[$id][apex_ei_analisis_fila])) { throw new toba_error_def("Para procesar un conjunto de registros es necesario indicar el estado " . "de cada uno utilizando una columna referenciada con la constante 'apex_ei_analisis_fila'.\n\t\t\t\t\t\t\t\t\tSi los datos provienen de un ML, active la opción de analizar filas."); } } //--- Se asume que el id de la fila es la key del registro o la columna apex_datos_clave_fila. foreach ($filas as $id => $fila) { $id_explicito = false; if (isset($fila[apex_datos_clave_fila])) { $id = $fila[apex_datos_clave_fila]; $id_explicito = true; } $accion = $fila[apex_ei_analisis_fila]; unset($fila[apex_ei_analisis_fila]); switch ($accion) { case "A": //--- Si el ML notifico explicitamente el id, este es el id de la nueva fila, sino usa el mecanismo interno $nuevo_id = $id_explicito ? $id : null; $this->nueva_fila($fila, $ids_padres, $nuevo_id); break; case "B": $this->eliminar_fila($id); break; case "M": $this->modificar_fila($id, $fila); break; } } }