web-dev-qa-db-fra.com

Modifier les valeurs de nom de champ xml existantes

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?

1
n.h.

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.

3
Nick

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;
}
1
n.h.