Written by

Roberto Segura

Category:

Blog

27 January 2014

En versiones 3.2 ó superiores no debes instalar FOF puesto que ya se incluye en el core de Joomla! y su modificación podría afectar al resto de componentes que lo usan.

Recuerda que la última información de cómo integrar FOF la podemos encontrar siempre en la wiki.

La integración de FOF es sencilla. En nuestro componente copiamos la carpeta que contiene FOF en el mismo directorio donde está el manifiesto XML.

Además si tu componente no tiene un scriptfile debes agregarlo. El scriptfile es básicamente un instalador personalizado que nos permite ajustar mucho más los procesos a realizar al instalar nuestra extensión. Con él podemos activar plugins tras la instalación, borrar entradas de menú, y, por ejemplo, asegurarnos de que FOF se instala con nuestra extensión (+ información en inglés).

En nuestro componente crearemos el archivo install.php con el siguiente contenido:

/**
 * @package     Hangouts
 * @subpackage  Installer
 *
 * @copyright   Copyright (C) 2014 Roberto Segura. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

defined('_JEXEC') or die;

/**
 * Installer.
 *
 * @package     Hangouts
 * @subpackage  Installer
 * @since       1.0
 */
class Com_HangoutsInstallerScript
{
    /**
     * Check if FoF is already installed and install if not
     *
     * @param   object  $parent  class calling this method
     *
     * @return  array            Array with performed actions summary
     */
    private function installFOF($parent)
    {
        $src = $parent->getParent()->getPath('source');

        // Load dependencies
        JLoader::import('joomla.filesystem.file');
        JLoader::import('joomla.utilities.date');
        $source = $src . '/fof';

        if (!defined('JPATH_LIBRARIES'))
        {
            $target = JPATH_ROOT . '/libraries/fof';
        }
        else
        {
            $target = JPATH_LIBRARIES . '/fof';
        }

        $haveToInstallFOF = false;

        if (!is_dir($target))
        {
            $haveToInstallFOF = true;
        }
        else
        {
            $fofVersion = array();

            if (file_exists($target . '/version.txt'))
            {
                $rawData = JFile::read($target . '/version.txt');
                $info    = explode("\n", $rawData);
                $fofVersion['installed'] = array(
                    'version'   => trim($info[0]),
                    'date'      => new JDate(trim($info[1]))
                );
            }
            else
            {
                $fofVersion['installed'] = array(
                    'version'   => '0.0',
                    'date'      => new JDate('2011-01-01')
                );
            }

            $rawData = JFile::read($source . '/version.txt');
            $info    = explode("\n", $rawData);
            $fofVersion['package'] = array(
                'version'   => trim($info[0]),
                'date'      => new JDate(trim($info[1]))
            );

            $haveToInstallFOF = $fofVersion['package']['date']->toUNIX() > $fofVersion['installed']['date']->toUNIX();
        }

        $installedFOF = false;

        if ($haveToInstallFOF)
        {
            $versionSource = 'package';
            $installer = new JInstaller;
            $installedFOF = $installer->install($source);
        }
        else
        {
            $versionSource = 'installed';
        }

        if (!isset($fofVersion))
        {
            $fofVersion = array();

            if (file_exists($target . '/version.txt'))
            {
                $rawData = JFile::read($target . '/version.txt');
                $info    = explode("\n", $rawData);
                $fofVersion['installed'] = array(
                    'version'   => trim($info[0]),
                    'date'      => new JDate(trim($info[1]))
                );
            }
            else
            {
                $fofVersion['installed'] = array(
                    'version'   => '0.0',
                    'date'      => new JDate('2011-01-01')
                );
            }

            $rawData = JFile::read($source . '/version.txt');
            $info    = explode("\n", $rawData);
            $fofVersion['package'] = array(
                'version'   => trim($info[0]),
                'date'      => new JDate(trim($info[1]))
            );
            $versionSource = 'installed';
        }

        if (!($fofVersion[$versionSource]['date'] instanceof JDate))
        {
            $fofVersion[$versionSource]['date'] = new JDate;
        }

        return array(
            'required'  => $haveToInstallFOF,
            'installed' => $installedFOF,
            'version'   => $fofVersion[$versionSource]['version'],
            'date'      => $fofVersion[$versionSource]['date']->format('Y-m-d'),
        );
    }

    /**
     * Method to run after an install/update/discover_install method
     *
     * @param   object  $type    type of change (install, update or discover_install)
     * @param   object  $parent  class calling this method
     *
     * @return void
     */
    function postflight($type, $parent)
    {
        if (version_compare(JVERSION, '3.2', 'lt'))
        {
            $fofInstallationStatus = $this->installFOF($parent);
        }
    }
}

Como veis tan sólo hemos agregado una función installFOF() y hemos modificado la función postflight() para que compruebe si la versión de Joomla! es inferior a 3.2 y, en caso afirmativo, instalar FOF.

Es importante apuntar que el nombre de la clase debe seguir el formato Com_ComponenteInstallerScript. En nuestro caso nuestro componente de prueba se llama com_hangouts así que la clase es Com_HangoutsInstallerScript.

La función postflight() es estándar para los instaladores de Joomla! y se ejecuta justo después de que tu componente se haya instalado/actualizado (no se ejecuta en la desinstalación) . En caso de ya tenerla simplemente debes agregar dentro el bucle if que instala FOF.

Tan sólo falta asegurarnos que en el XML de nuestro componente hagamos referencia a que nuestro instalador usará un script de instalación personalizado (el install.php que acabamos de crear). Esto se hace agregando en el manifiesto XML:

<scriptfile>install.php</scriptfile>

Como veis tan sencillo como incluir una carpeta y modificar dos functiones en nuestro instalador.