Desarrollo de una component para Joomla 4

Introducción Menus cnotas coronavirus2 Los archivos xml Manifiesto Service router Display Controller La vista Mdb View Mdb Funcion display Layout default El modelo MdbModel El Helper El layout01 El layout02 El layout03 El layout04 Botones de impresión Layout de impresion Botón de edición Los archivos

Edicion

 

Introducción

Se trata del desarrollo de una componente, com_readmdb, para Joomla 4.x, que lee tablas de bancos de datos externos. Como referencia se ha utilizado el tutorial Mywalks Parte 1 y de Parte 2.

Joomla es un sistema CMS (Content Management Syistem) basadp em en el métodd MVC Model, View, Controller

En la página, hemos definido dos grupos de menus: Princiapl y Covid-19 con los menús correspondientes.

menusprincipal
maunuscovid19

Los archivos xml abajo explicados definen los layouts que la figura a continuación expresa

menu item type

Elemento de Menú cnotas

menucnotas

El menú de la figura hace el link correspondiente: index.php?option=com_readmdb&view=mdb&database=m_db&layout=default_items&table=cnotas cuyas variables en la página se obtienen:

Elemento de Menú Selección Comunidad

menuseleccioncomunidad

Los archivos xml

Las figuras de arriba se basan en dos archivos xml correspondientes a los layouts de las views mdb, covid y constants

com_readmdb/site/tmpl/mdb/default.xml


mdbdefaultxml.png

com_readmdb/site/tmpl/covid/default.xml


coviddefaultxml.png

com_readmdb/site/tmpl/constants/default.xml


default constants.xml

Estos archivos permiten que al definir el menú, según indican las listas, se asignen valores a las correspondientes variables que se se podrán leer como sigue:

Manifiesto: el Archivo readmdb.xml

A continuación se comenta el archivo readmdb.xml que describe las caracteristicas de la componente, tal que versión, namespace etc, y qué archivos carga Joomla para ello.

Manifiesto 01

Como se ha dicho, esta componente es una copia de Mywalks Parte 1 y de Parte 2. La lista muestra el manifiesto, el cual se encuentra en el archivo com_readmdb/readmdb.xml:
Una de las líneas es:

Las caracteristicas en la vensión Joomla 4 son:

Estos son los archivos que instalará la componente en el front-end (site).

Manifiesto 03

A continuación los del back-end (admin). En la parte del administrator ponemos este menú que hará que en el back-end de la página se vean las diferentes entradas que son:

Esta última muestra las constantes de Joomla.

Manifiesto 04

Service router: com_readmdb/site/Service/Router.php

El archivo com_readmdb/site/Service/Router.php registra las vistas (views). El constructor de la clase es como sigue:

servicerouter 01

Display Controller:

com_readmdb/site/Controller/DisplayController.php. class DisplayController extends BaseController es la primera clase a la que entra en acción al cargarse la página. La función por defecto es display

Nota del del manual: This function is provide as a default implementation, in most cases you will need to override it in your own controllers.

DisplayController

En la lista se muestra en la función display() y como se pasan las variables table y database A esta a esta clase se refieren las variables controller y task La función Joomla.submitbutton('display.print') pondría la variable &task=display.print donde:

Con lo cual ejecutaría la funcion print de la clase DisplayController, que deriva de BaseController

 controller print

La vista Mdb y sus layouts

Los archivos que hacen que se añada un menú desde la página back-end (adminitrator) son:

Desde la parte del usuario (Site):

View Mdb: com_readmdb/site/View/Mdb/HtmlView.php (HtmlView)

Esta es la View Mdb, la cual toma del model, entre otras cosas, los datos que obtiene de la base de datos m_db a través de la función $this->get('Items'), que corresponde a la de ListModel::getItems()

viewmdb

La vista Mdb, que Joomla busca en la carpeta View/Mdb, tal como indica el namespace, cuya clase, siguiendo la convección del nombre es HtmlView, la encuentra el sistema a través del namespace J4xlmmsrs\Component\Readmdb\Site\View\Mdb

Funcion display de la clase HtmlView

viewwmdb02

La lista muestra algunas de las variables que la view obtiene:

  • $app = Factory ::getApplication();
  • $table = $app->input->getString('table','nota');
  • $componentname=$app->input->get('option');
  • $database = $app->input->getString('database','m_db');
  • $params = $app->getParams();
  • $page=$params['page_title'];//titulo del menu
  • $this->state = $this->get('State');
  • $this->layout = $this->getLayout();
  • $this->model = $this->getModel();
  • $modelname=$this->model->getName();
  • $this->params=$params;

La función display obtiene del Model MdbModel , que deriva de ListModel, las siguientes variables:

  • $this->items = $this->get('Items');
  • $this->total = $this->get('Total');
  • $this->fieldnames = $this->get('FieldNames');
  • $this->pagination = $this->get('Pagination');

Esas variables globlales son vistas por el layout correspondiente.

Layout default : com_readmdb/site/tmpl/mdb/default.php

default 01

La view Mdb, como todas las vistas, carga por defecto el layout default. Para felexibilizar y que desde otros menús se pueda cargar el layout deseado, la elección del layout se hace en dos pasos: en el primero se carga el default, que es el de la variable $this->layout, obtenido por la vista y que originalmente viene del menu correspondiene a través de las instrucciones

obtenidas en la clase HtmlView con su funcion:

La clase HtmlView este valor lo saca como sigue:

La primera linea obtiene el nombre del layout que puede ser el por defecto o el fijado por la funcion $this->setLayout(string $layout) : string
Si hacemos &layout=establecimientos, intenta cargar default_establecimientos y si no lo encuentra carga establecimientos
si ponemos &layout=default intenta cargar default_default
si ponemos items y existe, pone default_items

El modelo MdbModel: com_readmdb/site/Model/MdbModel.php

mdbmodel

Esta clase Deriva de la clase ListModel (class MdbModel extends \Joomla\CMS\MVC\Model\ListModel) que tiene unas cuantas funciones integradas, como getItems(), que son utilizadas por la view a través de la funcion $this->items = $this->get('Items');. Esta función tiene en cuenta la paginacion, con lo cual si se quieren mostrar solo una parte de los datos deberá utilizarse la misma
El resultado es un array indexado de 0 a n en el que cada elemento es otro array de objetos donde cada elemento es del nombre de la columna de la tabla que se lee;

El constructor de la clase MdbModel, __construct($config=array()), llama a dos funciones de la clase MdbHelpers estas son:

En este punto se debe indicar que la función del modelo ListModel::getItems() obtiene la query del método ListModel::getListQuery() , que nuestro model sobrescribe para sus necesidades;
un ejemplo de como funciona getItems es:

Para leer del banco de datos sin utilizar getItems() se procede como indica la funcion; maxFecha() a continuación:

covidmodemaxfecha

El Helper: com_readmdb/site/Helper/MdbHelpers.php

A continuación se muestra la función:

que define el banco de datos. De las variables url toma las siguientes:

helpersgetmdb

El layout: com_readmdb/site/tmpl/mdb/default_items.php (1)

La figura que sigue muestra la representación de los botones y una de las tablas

defaultitems 00

La lista que sigue muestra parte del código del layout com_readmdb/site/tmpl/mdb/default_items.php

defaultitems

El layout: com_readmdb/site/tmpl/mdb/default_items.php (2)

Esta parte muestra el formulario adminForm y cómo obtiene diversas variables.

defaultitems 02

Los botones son:

El layout: com_readmdb/site/tmpl/mdb/default_items.php (3)

paginacion01 defaultitems

La figura muestra un menú para ajustar el número de filas que debe tener la tabla que le sigue y la paginación de la misma. Ambas son funciones de la clase ListModel::getPagination(), función llamada por la clase HtmlView, que devuelve un objeto de tipo Pagination

también vemos la cabecera de las columnas en las cuales se ordenan los datos según los nombres de las columnas de los mismos. Dichos nombres se obtienen de la función del helper getFieldNames();

El layout: com_readmdb/site/tmpl/mdb/default_items.php (4)

Por último, se muestra el código para la representación de los datos en la tabla y las variables escondidas del formulario. Se trata de una tabla class="table-responsive", que tiene un scroller horizontal para poder ver un largo número de columnas. Dentro, una tabla class="table-striped", la cual muestra las columnas alternativamente en gris y blanco. La clase JHtml a través de su funcion "_" proporciona el código correspondiente.

La lista es:

defaultitems

las variables del formulario son:

Botones de impresión printicon01 printicon02

El código es el siguiente:

printbutton

En la figura vemos dos iconos. El verde requiere que de una lista se seleccione la fila que se quiere imprimir. Una ver seleccionado, aparece naranja, que hace que aparezca una ventana con los datos de la fila seleccionada.
El parámetro $limit de la función printButton($limit) indica si el número de elementos a imprimir es uno o más. En este caso una ventana modal exige que se elija uno.

Una vez elegido la función Joomla.submitbutton(\'display.display\') llama al controller display y dentro de él la función display. Si solo hay un elemento en la lista, lo imprime a pasando al controller la variable task

la cual llama al controller display, función print(), cuya lista se muestra a continuación.

funcion print

Layout de impresión

En la lista, el button llama a la función window.print(); a través de myFunction que abre la ventana de impresión.

print layout

La variable

es una variable que indica a Joomla que la ventana no debe contener menús. La figura que sigue lo muestra.

print window

Botón de edición icon edicion

botón edición

En la lista vemos la función

la cual llama una nueva página con la variable url &task=Editor.edit la cual va al Controller EditorController y llama la función edit()

Los archivos

  • com_readmdb/readmdb.xml
  • com_readmdb/site/Table/NotaTable.php
  • com_readmdb/site/Table/DesglosekTable.php
  • com_readmdb/site/Table/PasswdTable.php
  • com_readmdb/site/Table/ProduktTable.php
  • com_readmdb/site/Table/BehandlungTable.php
  • com_readmdb/site/Table/PatientTable.php
  • com_readmdb/site/Table/KrankenkTable.php
  • com_readmdb/site/Table/RechnungTable.php
  • com_readmdb/site/Table/M_notasTable.php
  • com_readmdb/site/Table/AdressenTable.php
  • com_readmdb/site/Table/RechnungpTable.php
  • com_readmdb/site/Table/ActividadTable.php
  • com_readmdb/site/Table/FacturakTable.php
  • com_readmdb/site/Table/BestellungTable.php
  • com_readmdb/site/language/en-GB/en-GB.com_readmdb.ini
  • com_readmdb/site/assets/index.html
  • com_readmdb/site/assets/js/validator.js
  • com_readmdb/site/assets/js/mdb.js~
  • com_readmdb/site/assets/js/mdb.js
  • com_readmdb/site/assets/css/style.css
  • com_readmdb/site/forms/index.html
  • com_readmdb/site/forms/mydrkam/drkam.xml
  • com_readmdb/site/forms/mydrkam/desglosek.xml
  • com_readmdb/site/forms/mydrkam/patient.xml
  • com_readmdb/site/forms/mydrkam/rechnungp.xml
  • com_readmdb/site/forms/mydrkam/krankenk.xml
  • com_readmdb/site/forms/mydrkam/facturak.xml
  • com_readmdb/site/forms/mydrkam/behandlung.xml
  • com_readmdb/site/forms/m_db/nota.xml
  • com_readmdb/site/forms/m_db/index.html
  • com_readmdb/site/forms/m_db/adressen.xml
  • com_readmdb/site/forms/m_db/testform.xml
  • com_readmdb/site/forms/m_db/produkt.xml
  • com_readmdb/site/forms/m_db/m_notas.xml
  • com_readmdb/site/forms/m_db/bestellung.xml
  • com_readmdb/site/forms/m_db/actividad.xml
  • com_readmdb/site/forms/m_db/passwd.xml
  • com_readmdb/site/View/Editor/HtmlView.php~
  • com_readmdb/site/View/Editor/HtmlView.php
  • com_readmdb/site/View/Editor/EditorView.php
  • com_readmdb/site/View/Editor/EditorView.php~
  • com_readmdb/site/View/Mdb/HtmlView.php
  • com_readmdb/site/View/Covid/HtmlView.php
  • com_readmdb/site/View/Constants/HtmlView.php
  • com_readmdb/site/tmpl/covid/default.php
  • com_readmdb/site/tmpl/covid/default_graficos.php
  • com_readmdb/site/tmpl/covid/default_graficos_todos.php
  • com_readmdb/site/tmpl/covid/default_corona.php
  • com_readmdb/site/tmpl/covid/print.php
  • com_readmdb/site/tmpl/covid/default.xml
  • com_readmdb/site/tmpl/editor/editor.php
  • com_readmdb/site/tmpl/mdb/establecimientos.php
  • com_readmdb/site/tmpl/mdb/default.php
  • com_readmdb/site/tmpl/mdb/default_items.php
  • com_readmdb/site/tmpl/mdb/default_graficos.php
  • com_readmdb/site/tmpl/mdb/print.php
  • com_readmdb/site/tmpl/mdb/default.xml
  • com_readmdb/site/tmpl/constants/default.php
  • com_readmdb/site/tmpl/constants/default.xml
  • com_readmdb/site/Field/index.html
  • com_readmdb/site/Field/KrankenkasselistField.php
  • com_readmdb/site/Field/BestelleremailField.php
  • com_readmdb/site/Field/FacturakidField.php
  • com_readmdb/site/Field/AdresselistField.php
  • com_readmdb/site/Field/PatientidField.php
  • com_readmdb/site/Field/BestellungidField.php
  • com_readmdb/site/Field/BehandlunglistField.php
  • com_readmdb/site/Field/ActividadlistField.php
  • com_readmdb/site/Field/BestellernameField.php
  • com_readmdb/site/Service/ReadmdbNomenuRules.php
  • com_readmdb/site/Service/Router.php
  • com_readmdb/site/Controller/EditorController.php
  • com_readmdb/site/Controller/DisplayController.php
  • com_readmdb/site/Model/MdbModel.php
  • com_readmdb/site/Model/CovidModel.php
  • com_readmdb/site/Model/EditorModel.php
  • com_readmdb/site/Helper/RouteHelper.php
  • com_readmdb/site/Helper/MdbHelpers.php
  • com_readmdb/site/Helper/MdbRouteHelper.php
  • com_readmdb/site/router.php

  • com_readmdb/admin/language/en-GB/en-GB.com_readmdb.sys.ini
  • com_readmdb/admin/language/en-GB/en-GB.com_readmdb.ini
  • com_readmdb/admin/access.xml
  • com_readmdb/admin/config.xml
  • com_readmdb/admin/View/Corona/HtmlView.php
  • com_readmdb/admin/View/Blanca/HtmlView.php
  • com_readmdb/admin/View/Constants/HtmlView.php
  • com_readmdb/admin/tmpl/corona/default.php
  • com_readmdb/admin/tmpl/constants/default.php
  • com_readmdb/admin/tmpl/blanca/default.php
  • com_readmdb/admin/services/provider.php
  • com_readmdb/admin/Controller/DisplayController.php
  • com_readmdb/admin/Model/BlancaModel.php
  • com_readmdb/admin/Extension/ReadmdbComponent.php