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:
Comment vérifier la version du composant installé?
Comment arrêter le processus d'installation et générer une erreur si le composant requis n'est pas installé?
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);
}