Instalar varias extensiones en joomla programáticamente

En un artículo anterior vimos cómo instalar varias extensiones, permitiendo al usuario realizar una única instalación, y no una por cada componente que incluiamos en nuestro paquete. El sistema que vimos es muy sencillo de implementar, pero deja algunos problemas que vamos a aprender a resolver.

El principal problema del método de instalar las extensiones por medio de un paquete, se encuentra al instalar plugins. A veces nuestros componentes dependen de forma explicíta del correcto funcionamiento de un plugin, para poder llevar a cabo su tarea. Es decir, que sin la presencia del plugin o plugins, nuestro componente no funcionaría como se espera. Al realizar la instalación mediante un paquete, se instalan todas las extensiones contenidas en él , pero los plugins quedan desactivados. Debemos activarlos de una manera manual. Pensando en usuarios novatos que puedan hacer uso de nuestra extensión, si el plugin está desactivado, podemos acrecentar la frustración del usuario hacía nuestro componente. Para evitar esto debemos facilitar lo máximo posible la instalación de nuestras extensiones, y dejarlas completamente funcionales. En el caso de necesitar imperiosamente el funcionamiento de un plugin, esté artículo te interesa. Sino, puedes utilizar el paquete cómo método de instalación.

Para poder explicar correctamente, como realizar la instalación, voy a utilizar el componente de ejemplo “Hola mundo” y el plugin, también de ejemplo, que creamos en un post anterior. Utilizando en estas dos extensiones, vamos a crear un componente, que al instalarlo, deje el plugin instalado y activado.

Lo primero que voy a mostrar es la estructura de archivos de nuestro nuevo componente:

Aarchivos componente y plugin

Como vemos la estructura es exactamente igual que la que vimos en la creación del componente. La diferencia más apreciable, es la aparición de una carpeta “plugins”. En ella, podemos almacenar todos los nuevos plugins que queremos instalar. En nuestro caso, sólo tenemos uno. Dentro de ésta carpeta, y por una cuestión de orden, he incluido una nueva carpeta llamada “content”, en la que incluyo todos los plugins de este tipo. Por fin dentro de esta carpeta, se encuentra nuestro plugin “HolaMundo”, que es el que queremos dejar instalado. A diferencia de otras ocasiones, vemos que el plugin no esta empaquetado en un archivo “ZIP”. Los archivos de este plugin, son exactamente los mismos que en el post anterior no hay ningún cambio en ellos.

Cambios en el componente para la instalación

Dónde si vamos a ver cambios, cómo no, es en el componente. El primero de ellos, es en el archivo “holamundo.xml”.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/component-install.dtd">
<install type="component" version="2.5.0">
<name>holamundo</name>
<creationDate>Didiembre 2012</creationDate>
<author>Mikel Garcia</author>
<authorEmail>navarra.developer@gmail.com</authorEmail>
<copyright>Copyright Info</copyright>
<license>License Info</license>
<version>1.0</version>
<description>Componente Hola Mundo</description>
<files>
<filename>holamundo.php</filename>
<filename>controller.php</filename>
<folder>views</folder>
</files>

<scriptfile>installation.php</scriptfile>

<administration>
<menu>HolaMundo</menu>
<files folder="BackEnd">
<filename component="admin.holamundo.php">admin.holamundo.php</filename>
<filename>controller.php</filename>
<folder>views</folder>
</files>
</administration>
</install>

Si nos fijamos bien, la única diferencia con el archivo que teniamos hasta ahora, es la inclusión de la línea que hace referencia a “installation.php”. Con esto le estamos diciando al core de joomla, que vamos a usar este archivo para ayudarnos en la instalación. Podemos encontrar toda la ayuda necesaría sobre éste archivo en esta url. Pero lo voy a explicar un poco, ya que está en ingles.

Añadir Script de instalación a componente en Joomla

Hay ocasiones en las que no podemos realizar todo lo que tenemos en mente con las opciones que nos da joomla de serie. Para evitar esto y darnos total control en la instalación de nuestras extensiones, tenemos ésta opción. Para ello, debemos crear una clase llamada “com_NombreComponenteInstallerScript” que puede contener estos cinco métodos:

  • install: Cómo su nombre indica es el método que se llama al instalar el componente.
  • uninstall: Es el método utilizado al desinstalar la extensión.
  • update: Cómo indica su nombre, es el utilizado al realizar actualizaciones del componente.
  • preflight: Método que se ejecuta simpre antes de los tres anteriores.
  • postflight: Método que se ejecuta al finalizar cualquiera de los tres métodos anteriores (install,uninstall,update).

Con esta clase, podemos realizar diferentes acciones según en que fase se encuentre nuestro componente. Ahora vamos a ver un ejemplo de cómo, utilizando este archivo, podemos dejar instalado y activo nuestro plugin.

<?php
defined('_JEXEC') or die();
class Com_HolaMundoInstallerScript
{
public function install($parent){
$path = $parent->getParent()->getPath('source')."/plugins/content/holamundo/";
$installer = new JInstaller;
$result = $installer->install($path);
if($result){$this->_activatePlugin();}
$this->_showResults($result);
}
private function _activatePlugin(){
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->update($db->qn('#__extensions'))
->set($db->qn('enabled').' = '.$db->q('1'))
->where($db->qn('type').' = '.$db->q("plugin"))
->where($db->qn('element').' = '.$db->q("holamundo"))
->where($db->qn('folder').' = '.$db->q("content"));
$db->setQuery($query);
$db->query();
}
private function _showResults($result){
$color = ($result) ? "#0f0" : "#f00" ;
$activateText = ($result) ? 'SI' : 'NO';
$html  = '<table width="100%">';
$html .= '<tr><th width="60%">PLUGIN</th><th>INSTALLADO</th></tr>';
$html .= '<tr><td>plg_hola_mundo</td><td><span style="color:'.$color.'">'.$activateText.'</span></td></tr>';
$html .= '</table>';
echo $html;
}
}

Cómo vemos, de los métodos antes mencionados, yo he elegido el de “install”, ya que sólo quiero que mi método se ejecute al instalar el componente. Si nos fijamos en la clase anterior podemos distinguir tres métodos, que voy a explicar a continuación.

Cómo instalar el plugin

En el primer método, que se corresponde con uno de los que joomla va a ejecutar de manera automática, lo que hago realmente es instalar el plugin, haciendo uso de la clase “JInstaller”. Su metodo install, además de instalar el plugin, nos informa de cual a sido el resultado de la instalación. Si todo ha ido bien llamo al método “_activatePlugin”.

Cómo activar el plugin

Para activar el plugin he recurrido a la manera manual. No estoy seguro de si puede hacerse usando el core de joomla (siempre recomendable) , pero éste sistema me ha funcionado. Básicamente realizo una consulta a la base de datos, buscando el plugin que acabo de instalar y modifico su campo “enabled” para dejarlo activo. Es posible que haya mejores formas de hacer esto pero no las conozco, así que si sabes de alguna agradeceré el comentario ;).

Mostrar el resultado de la instalación

Por último, lo que hace el método “_showResults”, es únicamente mostrar el resultado en la pantalla. Indica si el plugin se ha acticado o no. Es un buen sitio para informar al usuario de todo lo que nos parezca oportuno.

Espero haber dejado claro como podemos dejar completamente preparadas nuestras extensiones en joomla, o realizar las acciones que consideremos oportunas.

Esta entrada fue publicada en Componentes. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s