[SOLUCIONADO] Problemas con visibilidad de propiedad ¿?

Hola, quería saber si se les puede ocurrir porqué está sucediendo lo siguiente:
Tengo un ci de seleccion y otro de edicion. El de edición, tiene 4 pantallas tabuladas en forma vertical, y dentro de cada uno de ellos hay un ABM independiente.
El ci de seleccion me permite seleccionar una persona desde un datos_tabla Personas. Al seleccionar una persona, se muestra la pantalla de edición.
El ci de edicion, posee 4 datos_tabla asociados que tiene como parte de la clave, el id de la persona.
En el ci de edición, recupero el valor del id en una propiedad de la clase para luego utilizarla al dar de operar sobre los datos seleccionados, incluso, para filtar los datos de los cuadros de los 4 abms.

Hasta ahí, la descripción. El problema es el que esa propiedad, pierde su valor al salir del evento ¿?
Por lo que pude observar, se ejecuta el ini() y luego el conf__cuadro().


<?php
class ci_personas_edicion extends toba_ci
{
	protected $s__id_persona;
	protected $s__datos_filtro;
	protected $s__where_filtro;
	
	function get_persona()	
	{
		return $this->controlador->dep('personas');
	}
	
	function ini()
	{
		$s__id_persona= $this->get_persona()->get_columna('id');
  		toba::notificacion()->agregar('ini '.$s__id_persona); //MUESTRA POR EJEMPLO, 21
	}

	function conf__cuadro(toba_ei_cuadro $cuadro)
	{
		toba::notificacion()->agregar('conf cargo1 '.$s__id_persona); //MUESTRA conf cargo1 (SE PERDIO EL VALOR)
		toba::notificacion()->agregar('conf cargo2 '.$this->s__id_persona); //MUESTRA conf cargo2 (SE PERDIO EL VALOR)
		if (isset($this->s__where_filtro)) {
			$cuadro->set_datos($this->dep('personas_detalle')->get_listado(21, $this->s__cargos_where_filtro));
		} else {
			$cuadro->set_datos($this->dep('personas_detalle')->get_listado(21)); //ESTOY FORZANDO EL VALOR 21.. SI ES ASI, FUNCIONA... 
		}
	}

Cabe aclarar que las otras 2 propiedades, que utilizo para tomar los valores del filtro, funcionan perfectamente, en los 4 abms.
Desde ya, mil gracias!!

Estará relacionado de alguna manera con esta pregunta?
http://comunidad.siu.edu.ar/index.php?topic=1802.0

Hola Martin,

el problema te surge porque se te mezclaron los scopes de la variable…te voy a toquetear un poco el codigo con unos comentarios y estoy seguro que te das cuenta de la diferencia muy rapidamente.


<?php
class ci_personas_edicion extends toba_ci
{
	protected $s__id_persona;                                    //Variables declaradas para toda la clase
	protected $s__datos_filtro;
	protected $s__where_filtro;
	
	function ini()
	{
		$s__id_persona= $this->get_persona()->get_columna('id');          //Variable local al metodo
  		toba::notificacion()->agregar('ini '.$s__id_persona); 
	}

	function conf__cuadro(toba_ei_cuadro $cuadro)
	{
		toba::notificacion()->agregar('conf cargo1 '.$s__id_persona);                                    //Acceso a variable local al metodo
		toba::notificacion()->agregar('conf cargo2 '.$this->s__id_persona);                         //Acceso a variable de clase
		if (isset($this->s__where_filtro)) {
			$cuadro->set_datos($this->dep('personas_detalle')->get_listado(21, $this->s__cargos_where_filtro));
		} else {
			$cuadro->set_datos($this->dep('personas_detalle')->get_listado(21)); 
		}
	}

Como veras es un simple detalle de codificacion pero eso te diferencia el scope en el que PHP busca la variable, por ello es que no podes recuperar el valor :). Obviamente vos queres acceder a la variable de clase.

Saludos
Richard

La aclaración está buena, ya que sirve para clarificarme algo las cosas, por eso probé con las 2 maneras de hacerlo, pero las 2 me llegan con valor NULL. El valor que muestro en el INI… tomemos 21, se “pierde” al tomarlo en el cartel del conf… por ende, no se pasa como parámetro al método get_listado de la tabla (y me tira un error).
Eso luego funciona, ya que si el valor 21 lo paso como constante… funciona.
Igual, no pareciera ser un NULL lo que pasa como parámetro, ya que entre las pruebas que hice, le puse valor 21 por defecto al parámetro. Y no me lo asigna ya que debe estar llegando como cadena vacía y no como NULL.

Un par de formas de resolverlo son las siguientes:

1.- Recuperar el valor directamente en el conf del cuadro.
2.- Usar una variable en el CI de seleccion para almacenar el valor y simplemente recuperarlo sin acceder al DT, eso lo podes hacer con un metodo $this->controlador()->get_id_editado().
3.- Usar datos_relacion… despues de todo las tablas estan relacionadas entre si, de esta forma al cargar la tabla padre (‘personas’) se te cargan automaticamente los registros de los hijos, aunque si no optaron por este camino sus razones tendran.

De todas formas es extraño que si podes visualizar el valor en la notificacion del ini, despues al llegar a la configuracion del cuadro se te palme y no tenga nada, salvo que el valor de dicha variable de clase se este modificando en algun otro metodo extra aparte del ini().

1.- Recuperar el valor directamente en el conf del cuadro.
Probé pero no funcionó tampoco.
2.- Usar una variable en el CI de seleccion para almacenar el valor y simplemente recuperarlo sin acceder al DT, eso lo podes hacer con un metodo $this->controlador()->get_id_editado().
Puedo probar.
3.- Usar datos_relacion... despues de todo las tablas estan relacionadas entre si, de esta forma al cargar la tabla padre ('personas') se te cargan automaticamente los registros de los hijos, aunque si no optaron por este camino sus razones tendran.
Ninguno, solo que se me ocurrió hacerlo así porque los ABMs subordinados son independientes. Si armo la relación, ¿puedo tomar cada datos_tabla de la misma en forma independiente? o a la hora de sincronizar con la base debo hacerlo a travès de la relación?

Si esto tampoco funciono entonces el DT no quedo bien cargado.

2.- Usar una variable en el CI de seleccion para almacenar el valor y simplemente recuperarlo sin acceder al DT, eso lo podes hacer con un metodo $this->controlador()->get_id_editado().
Puedo probar.
Fijate y avisame.. aunque no creo que tengas drama.
3.- Usar datos_relacion... despues de todo las tablas estan relacionadas entre si, de esta forma al cargar la tabla padre ('personas') se te cargan automaticamente los registros de los hijos, aunque si no optaron por este camino sus razones tendran.
Ninguno, solo que se me ocurrió hacerlo así porque los ABMs subordinados son independientes. Si armo la relación, ¿puedo tomar cada datos_tabla de la misma en forma independiente? o a la hora de sincronizar con la base debo hacerlo a travès de la relación?

En realidad vas a poder trabajar sobre cada tabla … la unica diferencia es que los cursores te van a relacionar todo al docente que tengas cargado en ese momento y que cuando sincronices vas a tener que hacerlo a traves de la relacion. Si necesitas guardar datos parciales de manera independiente mientras mantengas la transaccion a mano no creo que tengas drama.

Saludos

Pude solucionarlo!!!
En su momento se nos pasó a ambos y de tanto verlo, se evitan ver obviedades.
El problema estaba en la asignación, no en el uso de la propiedad. Se quería acceder a la variable de clase, como vos me dijiste más arriba, y la asignación se estaba haciendo a $s__id_docente y debía ser hecha a $this->s__id_docente.
MIL GRACIAS!!!