web-dev-qa-db-fra.com

Vérification des dépendances lors de l'installation d'un composant

Supposons qu'un composant dépend de la présence d'un autre composant. J'ai trouvé une fonction qui est activée avant l'installation:

créer un fichier "script.php":

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
import( 'joomla.application.component.controller' );

class com_helloWorldInstallerScript
{
    /**
     * Runs just before any installation action is preformed on the component.
     * Verifications and pre-requisites should run in this function.
     *
     * @param  string    $type   - Type of PreFlight action. Possible values are:
     *                           - * install
     *                           - * update
     *                           - * discover_install
     * @param  \stdClass $parent - Parent object calling object.
     *
     * @return void
     */
    public function preflight($type, $parent) 
    {
        if($type === 'install')
        {   
            // Check if component is installed
            if ( !JComponentHelper::isEnabled( 'com_clients', true) )
            {
                echo 'com_clients is either not enabled or not installed';
                //How to stop installation process and output an error here?
                return;
            }
            else
            {
                echo 'com_clients is installed and enabled';
            }
        }
    }
};

Ajouter une référence au fichier XML manifeste:

<!-- Runs on install/uninstall/update; New in 2.5 -->
<scriptfile>script.php</scriptfile>

Des questions:

  1. Comment vérifier la version du composant installé?

  2. Comment arrêter le processus d'installation et générer une erreur si le composant requis n'est pas installé?

1
user4035

1. Question

Vous pouvez obtenir la version de base de données d'un composant en exécutant ceci:

private function getDatabaseVersion() {
    // Get the extension ID
    $db = JFactory::getDbo();


    $eid = $this->getExtensionId();

    if ($eid != null) {
        // Get the schema version
        $query = $db->getQuery(true);
        $query->select('version_id')
            ->from('#__schemas')
            ->where('extension_id = ' . $db->quote($eid));
        $db->setQuery($query);
        $version = $db->loadResult();

        return $version;
    }

    return null;
}

/**
 * Loads the ID of the extension from the database
 *
 * @return mixed
 */
private function getExtensionId() {
    $db = JFactory::getDbo();

    $query = $db->getQuery(true);
    $query->select('extension_id')
        ->from('#__extensions')
        ->where($db->qn('element').' = '.$db->q('XXXXXXXXXX'). ' AND type='. $db->q('component'));
    $db->setQuery($query);
    $eid = $db->loadResult();

    return $eid;
}

J'ai saisi cela de mon code. N'hésitez pas à le personnaliser. Regardez d'abord le XXXXX. Si vous avez besoin de la version du composant, vous pouvez vérifier la colonne manifest_cache de la table #__extensions.

2. Question:

vous pouvez faire quelque chose comme ceci dans votre méthode de contrôle en amont:

if (version_compare($versionA, $versionB, 'gt')) {
    $msg = "Downgrades are not supported.";
    throw new Exception($msg, 100);
}
2
Sven Bluege