[SOLUCIONADO]toba_ei_arbol y popups

Hola gente, como siempre, trayendo cosas raras a colación:
Si bien he usado el toba_ei_arbol, y le he agregado utilerias con vínculos y todo a funcionado bien, hoy quiero hacer algo distinto y no le encuentro la vuelta.

Tengo un formulario en el cual hay un ef_popup. Este debe recibir un valor que, para seleccionarlo, es más cómodo hacerlo a partir de un toba_ei_arbol que del tradicional cuadro.

En primer lugar, el arbol no me muestra los eventos a nivel fila aunque en la definición me permite seleccionarlo.
Lo que no se es como hacer para que la utilería funcione como un evento popup en lugar de como vínculo.

Tal vez sea una pavada, tal vez imposible.
Si alguien hizo algo similar y me orienta, estaré sumamente agradecido.

Un cordial saludo a todos.

Bueno, muchachos, por suerte le encontré el agujero al mate.
Pongo la solución que se me ocurrió por si alguien necesita hacer algo similar:

1 - En el ci del árbol (operación popup) , al definir los nodos les agrego la utilería con el siguiente código:
$vector=array( ‘imagen’ => $this->s__path_img.‘editar.gif’
,‘ayuda’ => “Editar dependencia”
,‘javascript’ =>“onclick = ‘iniciar_respuesta_popup("{$registro[‘c01depresu’]}","{$registro[‘c01leyen’]}");’”
,‘plegado’ => false
);
$obj->agregar_utileria($vector);

                $this->items[] = $obj;

2- Al objeto árbol le creo una extensión javascript con el siguiente código.
class ar_dependencias_pp_js extends expedig_ei_arbol
{
function extender_objeto_js()
{
echo "
function iniciar_respuesta_popup(clave, leyenda) {
window.opener.popup_callback(‘“.toba::memoria()->get_parametro(‘ef_popup’).”’, clave, leyenda);
window.close();
}

	";
}

}

Y listo. Con esto logré invocar una operación popup que abre un árbol y devuelve cave y escripción del nodo seleccionado a través de una utilería.

Saludos y gracias a todos los que dedicaron unos minutos al menos para pensar este asunto.

Amigo, buenas tardes

Me puedes regalar un pantallazo de la interfaz al hacer click en el ef_popup, y el código completo del CI, para entenderlo mejor

La idea es genial y me gustaría cambiarme a este estilo, en algunos proyectos que tengo.

Gracias y Saludos

Te muestro como quedaría el llamado popup.

A la extensión del arbol le hice una pequeña modificación para que funcione con el filtro, ya que al refrescarse la operación popup perdía el parámetro ‘ef_popup’ y no podía recibir los datos. Te agrego el código modificado:

<?php
class ar_dependencias_pp_js extends expedig_ei_arbol
{
    protected $s__ef_popup = null;
    
	function extender_objeto_js()
	{
        if(!is_null(toba::memoria()->get_parametro('ef_popup'))){
            $this->s__ef_popup = toba::memoria()->get_parametro('ef_popup');
        }
        
		echo "
        function iniciar_respuesta_popup(clave, leyenda) {
            window.opener.popup_callback('".$this->s__ef_popup."', clave, leyenda);
			window.close();
        }
		";
	}

}
?>

Espero que te sea de ayuda, si deseas ampliación de lo que hice, gustos te lo mando.

Saludos.


panta1.jpg

panta1.png

panta2.jpg

panta2.png

Código del CI de la operación popup:

<?php
require_once('contrib/lib/toba_nodo_basico.php');

/** ------------------------------------------------
//  Clase para construir el arbol de dependencias --
//------------------------------------------------*/
class nodo_dependencia extends toba_nodo_basico 
{

	function __construct($nombre, $padre=null, $id=null, $id_padre=null)
	{ 
		$this->nombre_corto = $nombre;
		$this->nombre_largo = $nombre;
		$this->padre = $padre;
		$this->id = $id;
		$this->id_padre = $id_padre;
	}
	
} 

/** ------------------------------------------------
//  Clase del CI -----------------------------------
//------------------------------------------------*/

class ci_dependencias_pp extends expedig_ci
{
	protected $s__feinvi = null;
	protected $s__dep_encontradas = null;
	protected $s__path_img = null;
    protected $s__filtro = null;
    protected $s__where = '1=1';
	
	#------
    function ini__operacion()
	{
	   $rs = toba::db()->consultar('select max(c01feinvi) as feinvi from public.scm001');
       if(count($rs) > 0){
            $this->s__feinvi = $rs[0]['feinvi'];
       }
       
      $this->s__path_img = toba_recurso::url_proyecto().'/img/';
	}


	#------
	/** ---------------------------------------------------------------------------------
	// arb_organigrama 
	//-----------------------------------------------------------------------------------*/

	function conf__ar_dependencias_pp(expedig_ei_arbol $arbol)
	{	
		$arbol->set_ancho_nombres(100);
		
		if(strlen($this->s__feinvi)>0){	
            $arbol->set_titulo($arbol->get_titulo().' '.substr($this->s__feinvi,6,2).'/'.substr($this->s__feinvi,4,2).'/'.substr($this->s__feinvi,0,4));
			#-- Cargo el organigrama seleccionado
			$sql = "select 	c01feinvi,
							c01depsecr,
							c01depsubs,
							c01depersu,
							c01depdire,
							c01depdpto,
							c01depdivi,
							c01leyen,
							c01depresu
					from
							public.scm001 
                    where 
                            c01feinvi = '".$this->s__feinvi."' order by c01depresu ";
			
			$resultado = toba::db()->consultar($sql);
            
			#-- Comienzo a armar los objetos-nodo que conforman los items del árbol
			$this->items = array();
			
	        #-- Creo el nodo raíz 
            $obj = new nodo_dependencia( 'Municipalidad',null,'00.0.0.0.0.0',null);

			$obj->agregar_icono(array('imagen'=>$this->s__path_img.'universidad.png', 'ayuda' => ''));
						
			$parametros = array('valor'=>$this->s__feinvi.'0000000');
			
           	$this->items[] = $obj;  
			#-- Termina la creación del nodo raíz 
			
			#-- Crea el resto de los nodos 
			foreach($resultado as $i => $registro)   
			{
				$parametros = array(); #- Dato que envia en el link
       			$nombre = $registro['c01leyen'];
       			if(stripos($nombre,trim($this->s__filtro['c01leyen']['valor'])) !== false){
       				$nombre = '<font color="blue">'.$nombre.'</font>';
       			}
       			
       			$id = 	$registro['c01depsecr'].'.'.
						$registro['c01depsubs'].'.'.
						$registro['c01depersu'].'.'.
						$registro['c01depdire'].'.'.
						$registro['c01depdpto'].'.'.
						$registro['c01depdivi'];
				
				#-- Creo el objeto		
	   			$obj = new nodo_dependencia( $nombre ,null,$id,$this->busco_padre($registro));
       			
       			#-- Agrego icono del item al objeto
       			$obj->agregar_icono($this->agrego_icono_item($registro));
       			
				#--	Comienzo a agregar los vínculos 
				
				#-- Utilería que permite la devolución popup
				$parametros['accion']='editar';
                $imagen = 'seleccionable.png';
                if(toba::memoria()->get_parametro('c01depresu') == $registro['c01depresu']){
                    $imagen = 'seleccionado.png';    
                }
                
                
	           	$vector=array(	'imagen' => $this->s__path_img.$imagen
								,'ayuda' => "Seleccionar"
                                ,'javascript' =>"onclick = 'iniciar_respuesta_popup(\"{$registro['c01depresu']}\",\"{$registro['c01leyen']}\");'"
								,'plegado' => false
                             );
    			$obj->agregar_utileria($vector);
        		
	            $this->items[] = $obj;
			}
			#-- Fín de la creación de los nodos
			
			/** -- Busco los hijos de cada item */
			foreach($this->items as $i => $dependencia){
				if($i == 0){   #-- Identifica al nodo raíz de todo el árbol
					$nodos = $this->get_hijos('00.0.0.0.0.0');
	        		$this->items[0]->set_hijos($nodos);
	        		$organigrama[0]=$this->items[0];
   				}
				else{
					$nodos = $this->get_hijos($dependencia->get_id());
					if(!is_null($nodos)){
					   $this->items[$i]->set_hijos($nodos);
                    }
				}	
			}
		
			$arbol->set_datos($organigrama);
			$nodos_abiertos = array();
			
			if(toba::memoria()->get_parametro('c01depresu') <> ''){
			     $nodos_abiertos = $this->nodos_abiertos(toba::memoria()->get_parametro('c01depresu'));
            }
					
			if(isset($this->s__dep_encontradas)){
				foreach($this->s__dep_encontradas as $i => $fila){
					$nodos_abiertos = array_merge($nodos_abiertos,$this->nodos_abiertos($fila['c01depresu']));
				}				
			}
		
			if(isset($nodos_abiertos)){
			     $arbol->set_apertura_nodos($nodos_abiertos);
            }

		}		
	}

	#------
	/**  Retorna un arreglo con los arboles que componen los hijos de un nodo raiz dado */

	function get_hijos($raiz)
	{
		$hijos = null;
		foreach ($this->items as $item){
			if($item->get_id_padre() == $raiz){
			     $hijos[] = $item;
            }
		}
        
		return $hijos;
	}

	#------
	/** Retorna un arreglo con la lista de nodos que deben mostrarse abiertos */
	function nodos_abiertos($depresu)
	{
		$nodos_abiertos = array();
		$registro = array(	'c01depdivi' => substr($depresu,14,1),
							'c01depdpto' => substr($depresu,13,1),
							'c01depdire' => substr($depresu,12,1),
							'c01depersu' => substr($depresu,11,1),
							'c01depsubs' => substr($depresu,10,1),
							'c01depsecr' => substr($depresu,8,2)
						  );
							
		foreach($registro as $key => $contenido){
			if($key == 'c01depsecr'){
				$registro[$key] = '00';
            }
            elseif($key <> 'c01depdivi'){
				$registro[$key] = '0';
            }
			
			$padre = $this->busco_padre($registro);
			$nodos_abiertos[$padre] = true;
		}
		
		return $nodos_abiertos;
		
	}
	
	#------
	
	/**  Devuelve el padre de un nodo dado */
	function busco_padre($registro)
	{
		if($registro['c01depdivi'] > 0):
			$registro['c01depdivi'] = '0';
		elseif ($registro['c01depdpto'] > 0):
			$registro['c01depdpto'] = '0';
		elseif ($registro['c01depdire'] > 0):
			$registro['c01depdire'] = '0';	
		elseif ($registro['c01depersu'] > 0):
			$registro['c01depersu'] = '0';		
		elseif ($registro['c01depsubs'] > 0):
			$registro['c01depsubs'] = '0';
		elseif ($registro['c01depsecr'] > 0):
			$registro['c01depsecr'] = '00';
		endif;
		
		$padre =	$registro['c01depsecr'].'.'.
					$registro['c01depsubs'].'.'.
					$registro['c01depersu'].'.'.
					$registro['c01depdire'].'.'.
					$registro['c01depdpto'].'.'.
					$registro['c01depdivi'];
		
		return $padre;
	}
	
	#------
	function agrego_icono_item($registro)
	{
		$vector = array();
		
		if($registro['c01depdivi'] > 0):
			$vector = array('imagen' => $this->s__path_img.'division.gif','ayuda' => '
División');
		elseif ($registro['c01depdpto'] > 0):
			$vector = array('imagen' => $this->s__path_img.'departamento.gif','ayuda' => '
Departamento');
		elseif ($registro['c01depdire'] > 0):
			$vector = array('imagen' => $this->s__path_img.'direccion.gif','ayuda' => '
Dirección');	
		elseif ($registro['c01depersu'] > 0):
			$vector = array('imagen' => $this->s__path_img.'dirgral.gif','ayuda' => '
Dirección General');		
		elseif ($registro['c01depsubs'] > 0):
			$vector = array('imagen' => $this->s__path_img.'subsecretaria.gif','ayuda' => '
Subsecretaría');
		elseif ($registro['c01depsecr'] > 0):
			$vector = array('imagen' => $this->s__path_img.'secretaria.gif','ayuda' => '
Secretaría');
		endif;
		
		return $vector;
	}

	/** ---------------------------------------------------------------------------------
	//---- fi_dependencias_pp -----------------------------------------------------------
	//---------------------------------------------------------------------------------*/

	function conf__fi_dependencias_pp(expedig_ei_filtro $filtro)
	{
	   $filtro->set_datos($this->s__filtro);
	}

    #------
	function evt__fi_dependencias_pp__filtrar($datos)
	{
	   $this->s__filtro = $datos;
       $this->s__where = $this->dep('fi_dependencias_pp')->get_sql_where();
       
       $sql = "SELECT 
					c01depresu from public.scm001 
			   WHERE 	 
					substring(c01depresu,1,8) = '".$this->s__feinvi."' 
                    AND ".$this->s__where;
                    
		$this->s__dep_encontradas = toba::db()->consultar($sql);
	}

    #------
	function evt__fi_dependencias_pp__cancelar()
	{
	   $this->s__filtro = null;
       $this->s__dep_encontradas = null;
       $this->s__where = '1=1';
	}

    #------
}
?>

El filtro no actúa como normalmente hacemos, lo que este produce es la apertura de todos los nodos que tengan en su descripción lo especificado en el filtro y lo escribe con color azul para facilitar la detección en el árbol a simple vista.

Tiene también un detalle consistente en que, si invocás el popup y este tenía un valor significativo, abre el nodo correspondiente y coloca otra imagen a la derecha (en vez de un circulo verde, uno rojo)

Saludos

Claudio, mil gracias

Lo probaré y te molestaré, inicialmente veo que tienes un include a una lib, es propia ? o se encuentra en toba

Saludos

Es de toba, solo le hago una extensión en las primeras lineas del php donde está el CI.
Fijate que en ese archivo hay dos clases, la extensión de la que hago el include, que es al único efecto de definir unas variables de memoria que necesito
/** ------------------------------------------------
// Clase para construir el arbol de dependencias –
//------------------------------------------------*/
class nodo_dependencia extends toba_nodo_basico {…

y la clase del CI propiamente dicho en el que uso “nodo_dependencia” para crear los objetos

Claudio,

me ganaste de mano con la respuesta :D, muy bien!

Saludos

Gracias Richard, tuve un buen maestro y buenos compañeros en el grupo, siempre me han dado una mano, sea por respuesta directa o buscando hilos anteriores.
Esta vez se me prendió la lamparita cuando, al analizar el código de la clase toba_ei_arbol, encontré que se le podia enviar un parámetro llamado “javascript” con código asociado.

Abrazo y que sigan los éxitos.