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