Acciones AjaxPhp - Bibliotools

Biblioteca encadenadora de comportamientosReferencia para desarrollo

\Biblio2ls\Model\BindedAccion (Acción Ajax)

Esta clase permite definir "rutas nominales" designadas mediante una locución (token) que puede contener letras, guiones normales, bajos y numeros sin espacios intermedios. Dichas rutas admiten un parámetro adicional (para recorrer identificadores de registros en tablas) y eventualmente identificadores de página y letra para consultas extendidas. A cada acción (ruta) se puede asociar una familia de orígenes de datos, constituida por elementos presentes en la página (pasados por id) y estableciendo qué atributos se usarán como valores asociados para ser pasada como parámetros del llamado. Y, finalmente se le puede indicar qué elementos de la página serán actualizados cuando sea devuelta por el servidor la respuesta a la solicitud ajax asociada a la ruta.

validar-ajax

Ejemplo de acción Ajax

Llene o modifique los textos en la zona de entrada de datos y elija uno de los enlaces disparadores de acciones situados en el panel "Objetivo vinculado", que se muestra a la derecha.

Texto simple


objetivo vinculado

En esta zona se desplegará una parte del contenido devuelto por el servidor ante la solicitud ajax lanzada por el enlace invocar acción de prueba.


 

Prueba de Barra AZ de navegación lanzadora.

 

Creación de acciones AJAX

Presentación

Una acción se puede entender como una "pseudoruta" que es "cargada" o "llamada" mediante un script, para enviar una parte de (o toda) la información recogida en una página web al servidor con el fin de "intercambiarla" o "registrarla" y recibir de vuelta una notificación o un bloque de datos para mostrar al usuario sin necesidad de recargar la página completa. Los datos de respuesta podrán mostrarse en la forma de un mensaje emergente, reemplazando algunos elementos de la misma, o adicionando nuevos.

La clase BindedAccion hace posible registrar acciones y crear enlaces (variables) con instrucciones muy sencillas.

Conceptos básicos:

Vista genéricamente, una acción ajax se compone de los siguientes elementos:

  • Un nombre identificador (que será usado como pseudoruta)
  • Un pequeño grupo de parámetros opcionales a usar como modificadores de la pseudoruta.
    Pueden ser por ejemplo los Ids de los registros de una tabla, de modo que al recorrerla para presentarla, cada registro se asocie con la acción modificada por su id.
  • Un conjunto de objetivos (opcional) que serán modificados como resultado de enviar la solicitud asociada con la acción al servidor. Cada objetivo puede, eventualmente, incluir información que identifica al mecanismo procesador que tratará la información enviada para devolver la parte de información que va a mostrar.
  • Un conjunto de fuentes (orígenes) de datos en el que se establece qué elementos presentes en la página y cuáles de sus atributos contienen los valores que serán enviados con la solicitud al servidor.
  • Un juego de enlaces o de elementos ligados con la acción que la lanzan cuando se producen eventos como click, change o similares por acción del usuario sobre ellos.

PHP - Bibliotools ofrece un juego de clases php y archivos JavaScript completamente integrados y funcional para facilitar la creación de acciones de modo que a la hora de implementarlas sólo se debe pensar en qué datos se van a recoger, qué se hará con ellos y cuál es la respuesta adecuada y cómo o dónde ofrecerla.

  • \Biblio2ls\Model\AccionAjaxInterface
    Establece las condiciones que debe cumplir una clase que vaya a ofrecer acciones o vaya a vincular elementos de una página web de modo que los cambios hechos en uno (subordinante) se reflejen en sus subordinados (en cascada)
  • \Biblio2ls\Model\BindedElementEvent
    Implementa AccionAjaxInterface para ofrecer mecanismos para enlazar juegos de elementos subordinados.
  • \Biblio2ls\Model\BindedAccion
    extiende BindedElementEvent para ofrecer un mecanismo que facilita crear acciones ejecutables mediante "enlaces simbólicos abstractos" que sean asociables con cualquier elemento o familia de elementos de una página web.
  • \Biblio2ls\Model\ObjetivoDeAccionInterface
    Establece las condiciones que debe cumplir la definición correcta de un objetivo de acción o un elemento subordinado.
  • \Biblio2ls\Model\ObjetivoDeEvento
    Implementa ObjetivoDeAccionInterface para ofrecer un mecanismo para establecer los objetivos a modificar al lanzar acciones.
  • \Biblio2ls\Model\ProcesadorInterface
    Establece las condiciones de definición de los procesadores que generan la información que será devuelta a los objetivos de eventos
  • \Biblio2ls\Model\DefineProcesador
    Implementa ProcesadorInterface para crear definiciones de procesadores que puedan ser correctamente registradas para responder a acciones y tratar la información originada en las mismas y devolver la que alimentará cada objetivo.
  • \Biblio2ls\Model\ProcesadorDeObjetivo
    Extiende la clase DefineProcesador y encadena y ejecuta los procesadores y devuelve las salidas a la clase AjaxController para asegurar que todo el proceso de tratamiento de acciones sea enrutado correctamente.
  • \Biblio2ls\Controller\AjaxController
    Atiende las solicitudes ajax de modo centralizado, prepara el acceso a la base de datos y organiza los parámetros enviados por las acciones para pasarlos al procesador de objetivos, y recoge las respuestas para devolverlas debidamente formateadas a la página solicitante.
  • \Biblio2ls\Library\XmlAccionJsCall
    Ofrece una plantilla, como atributo privado dentro de las definiciones de acciones para generar familias de enlaces asociados con su ejecución.
    Se implementa mediante el método BindedAccion->setLinkPad()
  • \public\js\Biblio2lsncadenador_ajax_generico.js
    Ejecuta las acciones, hace las solicitudes ajax, tramita las respuestas, distribuye los resultados entre los objetivos y agrega las secciones nuevas al DOM y rebobina el sistema de eventos para asegurar el comportamiento de las partes nuevas o las que sufren cambios en su sistema de identificadores y nexos.

Definición y registro de una acción:

Antes de iniciar el proceso se deben tener en cuenta algunos detalles:

  • Qué elementos serán fuentes de datos, puede no haberlos, e igualmente,
  • qué elementos serán modificados (objetivos) y si necesitan o no procedimientos para preparar sus modificaciones.
  • Debe definirse un procedimiento por defecto, que será el objetivo principal de la acción, y dónde se mostrará el resultado, o si simplemente se notifica.
  • Algunas veces el procedimiento por defecto "sabe armar la notificación" y la prepara para todos los posibles objetivos

Como las definiciones de objetivos y de procesadores se necesitan para alimentar la definición de la acción, conviene prepararlas antes:

  // Definición de una acción
  // 1. Definición de al menos un objetivo. Si no existe alguno se debe establecer
  //    la clave 'pordefecto' para poder asociarle el método que
  //    va a procesar la información.
  // 1.a Declarar el procesador que atenderá el objetivo (debe apuntar a un método existente)
  $procesadorDef = new \Biblio2ls\Model\DefineProcesador();
  $procesadorDef->setMetodo('nombreMetodo')
                ->setCallKey('namespace' | 'classpath' | 'factory_key_path' | 'store_key')
                ->setTipoDeLlamado('static' | 'invokable' | 'factory' | 'stored');
  // 1.b Establecer la definición del objetivo
  $objetivoDef = new \Biblio2ls\Model\ObjetivoDeEvento();
  $objetivoDef->setObjetivo('idDelElemento' | 'pordefecto')
              ->setProcesadorDef($procesadorDef)
              ->setAttribute('atributeName' | 'atributos sparados por espacios'); //'htm' es el defaut si no se establece
  // 1.c Repetir 1.a y 1.b para los objetivos a afectar
  // 2. Instanciar la definición de la acción, para el ejemplo se indicará una fuente de
  //    datos. En general no es necesario si se van a establecer parámetros de llamado
  $accionDef = new \Biblio2ls\Model\BindedAccion();
  $accionDef->setElemento('nombre-de-la-accion')
             ->setEvento('click')
             ->agregarFuenteDeDatos('idDelElementoFuente')
             ->agregarObjetivo($objetivoDef)
             ->registrarAccion() // pasa la acción a los scripts de encabezado y carga los js necesarios
             ->setLinkPad(); // prepara una plantilla generadora de enlaces
  // 3. Generar enlaces para ubicar en los lugares de la página que deban lanzar la acción
  //    si la acción se asocia a una tabla, cada registro pasará su id y algún texto a su
  //    enlace correspondiente
  $link = $accionDef->getLink(IdDelDatoVinculado, 'Texto a mostrar en el enlace');
  // los enlaces resultantes tendrán la forma:
  <a href="javascript:ejecutar_accion_lgqbinded('nombre-de-la-accion/IdDelDatoVinculado');">Texto a mostrar en el enlace</a>

Ejecución de comando estático almacenado

Este panel se generó usando el llamado:
  $cmdstatic::$fnt(4, $panel1);
  donde:
    $cmdstatic = '\Biblio2ls\Library\WriteHtml5';
    $fnt = 'simplePannelsRow';
    $panel1  = [
        [
            'tit' => '<h4>'.\Biblio2ls\Library\WriteHtml5::glyphIcon('link').'Ejecución de comando estático almacenado</h4>',
            'txt' => $cmtstatic,
            'col' => 12,
        ],
    y 
    $cmtstatic = El texto que se lee en esta zona del panel.
Se debe resaltar que $cmdstatic = '\Biblio2ls\Library\WriteHtml5' contiene el path calificado a la clase abstracta WriteHtml5 construido con su namespace iniciando con "\" (backslash). Y, el archivo "WriteHtml5.php" que ofrece la clase se encuentra cargado.
Por otra parte, La funcion a llamar se encuentra en otra variable: $fnt = 'simplePannelsRow' y el operador :: se usa explícito. (Se trató de usarlo dentro de una sola variable y no funcionó)

Ejecución de comando en clase invocable desde variables

Observaciones para pruebas
Necesito un mecanismo para validar primer caracter en clase ProcesadorObjetivo de modo que pueda hacer construcción correcta de llamados. Pruebas:
  • La cadena $BSLSH = \ tiene longitud uno
  • $test_dbl_slash = '\\'.'TwBs2l\Component';
    $clase_invocable = '\TwBs2l\Component';
    ($clase_invocable === $test_dbl_slash) = Asignación correcta
  • Verificación de primer caracter:
    $test_primerchr = (substr($clase_invocable, 0, 1) === $BSLSH) ? TRUE : FALSE;
    devuelve TRUE
  • La clase ProcesadorDeObjetivo va a contar con un metodo privado getNamespaceCalificado($nameSpaceKey) que verifica si el primer caracter de un espacio de nombres pasado en una variable contiene o no primer caracter BSLASH y en caso negativo lo agrega

Prueba 2 Verificar que método exista

  • Las funciones de validación de existencia de método piden como primer parámetro un objeto y tampoco se si existe o no; y no necesariamente voy a instanciarlo. Estas pruebas se orientan a resolver el tema.
  • BsButton no existe
  • \TwBs2l\Component\BsButton existe
  • Como App ejecutó autoload no tengo problemas con los warnings anotados en la documentación de referencia. Allí sugieren un autoload previo a las validaciones. Como zend lo hace no tengo por qué preocuparme.
  • Una vez validado verifico si metodo existe, caso 1 sin construir el objeto
    \TwBs2l\Component\BsButton->rebuildFromDef() existe
  • caso 2 construyendo una instancia antes (no hace falta primer caso funciona)
  • Prueba invocar metodo usando variables muestro result ejecuto:
    $button = new $componente_calificado("Botón danger", "", "", 0, "danger");
        $botondanger = $button->$toStringMethod
        echo $botondanger
        // y se muestra:

Prueba 3 verificar que metodo admita los parámetros a pasar
No encuentro documentación para identificar la signatura de un método. Pero, de acuerdo con el paso de argumentos de longitud variable puedo establecer una regla de sintaxis para los métodos a pasar a las definiciones de objetivos así:

  • La primera variable pasa el array de parámetros.
  • La segunda variable usa el token ...$extra para admitir un número variable de parametros que podrán ser la conn a basa de datos y los atributos a establecer

Conclusión de la prueba:
Los métodos estaticos a llamar y los métodos en invocables, que serán declarados en la definición de procesador de objetivos, deben tener una de las siguientes signaturas:

  • procesador(...$parametros);
  • procesador($parametros, ...$extra);
  • procesador($parametros, $dbService2l, ...$extra);

El procesador usará el llamado: $metodo($parametros, $dbService2l, $atributos);
La estructura propuesta es bastante flexible con el fin de permitir que los métodos sean empleados en otros procedimientos, que no necesariamente responden a la necesidad de alimentar objetivos de llamados ajax.
Importante: La salida de estos métodos debe ser texto plano o cadenas html válidas.


Php - BiblioTools [Documentación]