Si antes de leer esto prefieres probarlo directamente te lo dejo aquí-> COMPROD-JOOMLA5.zip.
El punto de entrada del componente, en su raíz, está el archivo prod.php del que no hay que explicar mucho. Simplemente lo que hace es cargar el controlador y ejecutar el método que queramos cuando escribimos la url en el navegador, dependiendo del valor de task se ejecutará un método u otro: index.php?option=com_prod&task=getProd
Si clicaste en el enlace anterior verás que la url es "componente/task/getProd". Esto está configurado en el archivo .htaccess: RewriteRule ^componente/task/(.*)$ index.php?option=com_prod&task=$1 [NC,L]
punto de entrada del componente
components/com_prod/prod.php
$controller = 'cProd'; //nombre del controlador $path = JPATH_COMPONENT.'/controllers/'.$controller.'.php'; //ruta $input = Factory::getApplication()->input; require_once($path); //lo cargamos $classname = 'ProdController'.$controller; $controller = new $classname(); //instanciamos la clase if($input->get('task') !=='') {$task = $input->get('task');} else {$task = 'default';} //y ejecutamos el método elegido $controller->execute($task);
controlador
Usaremos el patrón de diseño MVC (MODELO, VISTA, CONTROLADOR)
En el controlador creo un método public function getobjDatos() que devuelve un objeto que quiero propagar por todo el componente para así, tener acceso a sus propiedades en la vista y en el modelo.
components/com_prod/controllers/cProd.php
public function getobjDatos() { $urlbase = JUri::base(); $language = JFactory::getLanguage(); $obj = new \stdClass(); $obj->dbname = "tu-base-de-datos"; $obj->dbuser = "usuario-bbdd"; $obj->dbpass = "password-bbdd"; $obj->server="localhost"; return $obj; }
Analicemos el método al que llamamos por url task=getProd. Ten en cuenta que, en el CONTROLADOR, incluimos el modelo: require_once (JPATH_COMPONENT.'/models/mProd.php');
public function getProd(){ //instanciamos la clase del modelo $clase = new ProdModelMProd(); //creamos la variable $getProd $getProd=$clase->getProd($this->getobjDatos()); //incluimos la vista require_once ($clase->getview('GetProd')); }
Como puedes ver, creamos una variable $getProd con el valor de lo que devuelve el método getProd($this->getobjDatos()) del modelo al que pasamos como argumento el objeto que devuelve getobjDatos()
Por último incluimos la vista en la que tenemos acceso a la varible $getProd que hemos creado y que, como verás más adelante, es un objeto.
en el MODELO tendremos toda la lógica de negocio
Veamos como obtengo la ruta de la vista dependiendo de si la llamamos por url o en el controlador
Primará la vista que llamemos por url: componente/task/getProd?vplay=category, antes que la que tenemos en el controlador: require_once ($clase->getview('GetProd'))
components/com_prod/models/mProd.php
public function getview($viewParam) { $input = Factory::getApplication()->input; if ($input->get("vplay") == "") { $view = $viewParam; } else { $view = $input->get("vplay"); } $VPATH = JPATH_COMPONENT . "/views/v" . $view . ".php"; return $VPATH; }
Ahora vemos nuestro método que llamamos por url: task=getProd
public function getProd($objDatos) { $obj = new \stdClass(); $obj->urlbase = $objDatos->urlbase; $obj->getContent = $this->getContent($objDatos); return $obj; }
Como vemos, devuelve un objeto que es el valor de la variable $getProd del controlador. Así, en la vista podemos tener acceso, por ejemplo, a la propiedad urlbase: $getProd->urlbase
Veamos la propiedad getContent del objeto:
$this->getContent($objDatos) que es el retorno de otro método del modelo: public function getContent($objDatos).
En este método lo que hago es un query usando PDO. Te preguntarás por que no utilizo los queries de Joomla y la respuesta es que así puedo trasladar todo el componente a cualquier framework en php con las mínimas modificaciones.
Podemos comprobar que esta estructura es escalable cien por cien ya que, podemos crear múltiples métodos en el modelo y asignar sus valores a propiedades del objeto que devuelve getProd($objDatos) con lo que tendríamos acceso a todas esas propiedades en la vista.
por último, tenemos la VISTA
En la vista tenemos acceso a todas las funcionalidades del modelo, por ejemplo, podemos tener una lista de los títulos de nuestros artículos:
components/com_prod/views/vGetProd.php
foreach($getProd->getContent as $ar){ print_r($ar->title); }
Inicio Home Política de privacidad Desarrollo Joomla en Bilbao Componente personalizado para Joomla 5 wordpress Diseño de Prestashop en Bilbao Profesional SEO en Bilbao
Y esto es todo. Espero que hayas disfrutado y tengas otro punto de vista de mi CMS preferido.