Hola compañeros, he realizado una clase para gestionar un menú. Durante el constructor del controlador inicializo dicho menú, y despues, es el usuario el que va expandiendo o contrayendo las ramas del mismo. Para mantener la situación me he visto obligado a almacenar dicho objeto como una variable de sesión, utilizando Session::set_data y Session::get_data.
Durante la función menu del controlador, recupero el menú, y compruebo si dicho nodo está expandido o no... y es aquí donde tengo el problema, porque siempre me dice que no está expandido. He comprobado que siempre me dice esto porque como se inicializa en el constructor de la clase. He llegado a la conclusión de que cada vez que recupero el menú se inicializan de nuevo los constructores del punto de menú que estoy recuperando.
Espero vuestro consejo con mucho agradecimiento.
FUNCION menu (web_controller.php)
function menu($id){
$menu = Session::get_data('smenu');
$nodo = $menu->buscar($id);
if (isset($nodo)){
// invertimos el estado del nodo (Expandido/Contraido)
if ($nodo->expandido_sn == 'N'){
$nodo->expandir();
}
else{
$nodo->contraer();
}
// guardamos los cambios del menú y los almacenamos en Session
$this->menu = $menu;
Session::set_data('smenu',$menu);
}
$this->set_response('view');
}
}
CLASE Menu
class Menu {
public $id;
public $nombre;
public $nodo_menu_id;
public $tipo;
public $url;
public $orden_nivel;
public $observaciones;
public $activo_sn;
public $expandido_sn;
public $nodo_hijo = array();
function __construct($id){
$modNodoMenu = new NodoMenu();
$nodo = $modNodoMenu->find($id);
$this->id = $nodo->id;
$this->nombre = $nodo->nombre;
$this->nodo_menu_id = $nodo->nodo_menu_id;
$this->tipo = $nodo->tipo;
$this->url = $nodo->url;
$this->orden_nivel = $nodo->orden_nivel;
$this->observaciones = $nodo->observaciones;
$this->activo_sn = $nodo->activo_sn;
$this->expandido_sn = 'N';
}
function contraer(){
// desvinculamos los nodos hijos y marcamos el nodo como no expandido.
for($i=0;$i<count($this->nodo_hijo);$i++)
unset($this->nodo_hijo[$i]);
$this->expandido_sn = 'N';
}
function expandir(){
// buscamos los nodos hijos
$modNodoMenu = new NodoMenu();
$nodos = $modNodoMenu->find("conditions: nodo_menu_id='$this->id'");
// creamos un nuevo punto de menú por cada hijo
$i = 0;
foreach($nodos as $rw_nodos){
$this->nodo_hijo[$i] = new Menu($rw_nodos->id);
$i++;
}
// marcamos el punto de menú como expandido
$this->expandido_sn = 'S';
}
function buscar($id){
if (isset($this->nodo_hijo)){
for($i = 0; $i < count($this->nodo_hijo); $i++){
if ($this->nodo_hijo[$i]->id == $id)
return $this->nodo_hijo[$i];
else{
$nodo = $this->nodo_hijo[$i]->buscar($id);
if (isset($nodo))
return $nodo;
}
}
}
return null;
}
}