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
Model: lee y escribe los datos
View: Presenta los datos obtenidos
Controller: Controla el acceso a las diversas páginas de la componente.
En la página, hemos definido dos grupos de menus: Princiapl y Covid-19 con los menús correspondientes.
Menus
Los archivos xml abajo explicados
definen los layouts que la figura a continuación expresa
Covid
Joomla Constants
m_db
Elemento de Menú cnotas
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:
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
com_readmdb/site/tmpl/covid/default.xml
com_readmdb/site/tmpl/constants/default.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:
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.
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:
Joomla 4 utiliza Namespace para localizar sus archivos:
<namespace>J4xlmmsrs\Component\Readmdb</namespace>
En la lista el primer elemento sería el nombre de la
compañía o el que se le quiera dar. En este caso: J4xlmmsrs.
El segundo, el tipo de extensión: Component.
En otros casos Module, Plugin o Template
El tercero es el nombre de la componente sin el com_, mod_ ,
etc., y la primera letra en mayúsculas: Readmdb
El atributo path="src" indica que todos los archivos indicados en el código
Namespace se encuentran en el directorio
"src".
Estos son los archivos que instalará la componente en el front-end (site).
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:
El archivo com_readmdb/site/Service/Router.php registra las vistas (views). El constructor de la clase es como sigue:
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.
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:
controller=display
función=print
Con lo cual ejecutaría la funcion print de la clase DisplayController, que deriva de
BaseController
La vista Mdb y sus layouts
Los archivos que hacen que se añada un menú desde la página back-end (adminitrator) son:
com_readmdb/site/tmpl/mdb/default.xml, descrita por el título "layout title="m_db" y por la constante COM_readmdb_readmdb_VIEW_DEFAULT_DESC,
que toma un valor en el archivo admin/language/en-GB/en-GB.com_readmdb.sys.ini
Desde la parte del usuario (Site):
com_readmdb/site/tmpl/constants/default.xml, que la describe la constante COM_readmdb_readmdb_VIEW_CONSTANTS_DESC
Ambas contienen la constante readmdb_VIEW_DEFAULT que se encuentra también el archivo admin/language/en-GB/en-GB.com_readmdb.sys.ini
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()
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
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
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
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:
$config['filter_fields']=$this->gelper->getFieldnames(), que se usa para ordenar las columnas
de una tabla.
$config['dbo']=$this->helper->getM_DB() que carga el banco de datos
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:
$id=$this->items[0]->id;
Para leer del banco de datos sin utilizar getItems() se procede como indica
la funcion; maxFecha() a continuación:
El Helper: com_readmdb/site/Helper/MdbHelpers.php
A continuación se muestra la función:
getM_DB()
que define el banco de datos.
De las variables url toma las siguientes:
server: por defecto: 'localhost'
database
dbuser
dbpasswd
table
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
La lista que sigue muestra parte del código del layout
com_readmdb/site/tmpl/mdb/default_items.php
El layout: com_readmdb/site/tmpl/mdb/default_items.php (2)
Esta parte muestra el formulario adminForm
y cómo obtiene diversas variables.
$listOrder se emplea para ordenar la tabla según el título de cada columna
$listDirn es la dirececció ascendiente o descendiente
$canEdit determina si el usuariao esá autorizado para hacer ciertas operaciones
$this->pagination->getPagesCounter. Es una función que el model a través
de la funcion getPagination() pasa a la view
( $this->pagination = $this->get('Pagination')) y muestra el número de páginas de la tabla que muestra los datos
Los botones son:
$helper->backButton de volver atrás
Search: Busqueda
Botón de Busqueda
Boton de borrado (refresh)
$helper->printButton. Botón de impresión
Boón de nueva edicción
Boón de edicción
Boón de borrrar (paperlera)
El layout: com_readmdb/site/tmpl/mdb/default_items.php (3)
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
$limit= $this->pagination->getLimitBox();
echo $this->pagination->getPaginationLinks();
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.
input type="hidden" name="task" value=""
. Esta variable la pone la rutina de javascript Joomla.submitbutton
input type="hidden" name="boxchecked" value="0"
le es asignado un valor después de ser testeada por document.adminForm.boxchecked
y despues llamada por Joomla.submitbutton
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.
onclick="'.$status.'if (document.adminForm.boxchecked.value == 0)
{ alert(\'Select from the list\'); }
else { Joomla.submitbutton(\'display.display\'); }"
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
&task=display.print&cid[0]='.$id;
la cual llama al controller display, función print(), cuya lista se muestra a continuación.
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.
La variable
$tmpl=component
es una variable que indica a Joomla
que la ventana no debe contener menús. La figura que sigue lo muestra.
Botón de edición
En la lista vemos la función
Joomla.submitbutton('Editor.edit');
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()