J'ai un plug-in système dans lequel je dois modifier certaines valeurs de nom de champ existantes dans le fichier manifeste xml. Dans une nouvelle installation de plug-in, ce n'est pas un problème, mais si je veux mettre à jour une version plus ancienne, cela me posera un problème car les noms de champs ne correspondent pas et les anciennes valeurs de paramètres seront perdues. Existe-t-il un moyen, peut-être avec un script d'installation, de réaffecter les nouveaux noms de champs aux anciens?
Oui, tu as raison.
Vous pouvez utiliser le script d'installation pour mettre à jour le nom du champ et la valeur lors de la mise à niveau du plug-in.
Écrivez SQL pour mettre à jour les données du plug-in, stockées dans la base de données, conformément à la valeur du nom de champ du plug-in actuel.
Placez votre code dans la méthode de mise à jour du script d'installation afin qu'il ne soit pas exécuté lors d'une nouvelle installation.
Sur la base de la réponse de Nick, j'ai essayé cette solution avec succès:
public function update(JAdapterInstance $adapter)
{
$version = self::getXMLVersion();
if (version_compare($version, 'my_plugin_version', '<') == 1)
{
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$fieldsToGet = array(
$db->quoteName('params')
);
$conditions = array(
$db->quoteName('element') . ' = ' . $db->quote('my_plugin_name'),
$db->quoteName('folder') . ' = ' . $db->quote('system')
);
$query->select($fieldsToGet)->from($db->quoteName('#__extensions'))->where($conditions);
$db->setQuery($query);
$results = $db->loadResult();
$options = json_decode($results, true);
// Array with all replacements
$new = array(
'old_name_01' => 'new_name_01',
'old_name_...' => 'new_name_...',
'old_name_99' => 'new_name_99');
// Replace fields
foreach ($options as $oldKey => $value)
{
$newKey = $new[$oldKey];
$newArray[$newKey] = $value;
}
$results = json_encode($newArray);
$fieldsToUpdate = array(
$db->quoteName('params') . ' = ' . $db->quote($results)
);
$query->update($db->quoteName('#__extensions'))->set($fieldsToUpdate)->where($conditions);
$db->setQuery($query);
$result = $db->execute();
}
else
{
return;
}
}
private function getXMLVersion()
{
$version = '';
$path = JPATH_PLUGINS . '/system/my_plugin_name/my_plugin_name.xml';
$xml = JApplicationHelper::parseXMLInstallFile($path);
if ($xml && isset($xml['version']))
{
$version = trim($xml['version']);
}
return $version;
}