it-swarm.com.de

Ändern Sie vorhandene Werte für XML-Feldnamen

Ich habe ein System-Plugin, in dem ich einige vorhandene Feldnamenwerte in der XML-Manifestdatei ändern muss. In einer neuen Plugin-Installation ist dies kein Problem. Wenn ich jedoch eine ältere Version aktualisieren möchte, tritt ein Problem auf, da die Feldnamen nicht übereinstimmen und die älteren Parameterwerte verloren gehen. Gibt es eine Möglichkeit, möglicherweise mit einem Installationsskript, die neuen Feldnamen den älteren zuzuweisen?

1
n.h.

Ja, du hast recht.

Sie können das Installationsskript verwenden, um den Feldnamen und den Wert beim Plugin-Upgrade zu aktualisieren.

Schreiben Sie sql, um die in der Datenbank gespeicherten Plugin-Daten gemäß dem aktuellen Wert des Plugin-Feldnamens zu aktualisieren.

Fügen Sie Ihren Code in die Aktualisierungsmethode des Installationsskripts ein, damit er bei einer Neuinstallation nicht ausgeführt wird.

3
Nick

Basierend auf Nicks Antwort habe ich diese Lösung mit Erfolg ausprobiert:

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.