it-swarm.com.de

So aktualisieren Sie die Parameter des Datenbankmoduls

Könnte mir bitte jemand helfen?

Ich erstelle ein Plugin und ein Teil seiner Aufgabe besteht darin, einem ausgewählten Menü automatisch ein 'Menüklassen-Suffix' hinzuzufügen. Ich weiß, dass dies manuell über die Registerkarte "Erweitert" des Menümoduls erfolgen kann, aber ich benötige das Plugin, wenn möglich.

Wie kann ich 'class_sfx' in 'params' des Menümoduls in der Datenbanktabelle __modules einen Wert hinzufügen?

{"menutype": "mainmenu", "base": "", "startLevel": 1, "endLevel": 0, "showAllChildren": 1, "tag_id": "", "class_sfx": " "," window_open ":" "," layout ":" _: default "," moduleclass_sfx ":" "," cache ": 1," cache_time ": 900," cachemode ":" itemid "," module_tag ":" div "," bootstrap_size ":" 0 "," header_tag ":" h3 "," header_class ":" "," style ":" 0 "}

Danke vielmals!

1
JJBW

Obwohl Sie dies durch direkte Datenbankoperationen tun können, ist es beim Ausführen von CRUD-Operationen für Datensätze von Joomla-Kernkomponenten am besten, die Joomla Table-Klassenfunktionalität zu verwenden, da dadurch alle zugehörigen Daten (z. B. Daten, die von Plugins verwaltet werden, die sich registrieren, Benachrichtigungen erhalten können) Aktualisierungen aufzeichnen), die aktualisiert werden sollen. Informationen zur Tabellenfunktionalität finden Sie unter https://docs.joomla.org/Table_Basic_API_Guide

Der Tabellencode befindet sich auch in /libraries/src/Table/Table.php (nach Joomla 3.8 ish) und es lohnt sich zu prüfen, ob dort eine andere PHP-Datei vorhanden ist, die die Joomla-Tabelle widerspiegelt, die Sie aktualisieren, da möglicherweise zusätzliche Funktionen in der Tabelle vorhanden sind spezifische Klasse, die Joomla Table erweitert. In diesem Fall gibt es Module.php und daher sollten wir die Module-Klasse darin verwenden. (Update bearbeiten: Tatsächlich durchsucht die unten aufgerufene Funktion getInstance () dasselbe Verzeichnis, um die benötigte Modulklasse zu finden, sodass wir sie mit Table :: getInstance ('Module') aufrufen können.)

Um die Aktualisierung der JSON-Zeichenfolge im Parameterfeld im Moduldatensatz durchzuführen, verwenden Sie am einfachsten die Joomla-Registrierung (siehe https://github.com/joomla-framework/registry ).

Schließlich müssen Sie festlegen, wie Sie den Datensatz identifizieren möchten, den Sie aktualisieren möchten. Wenn Sie die ID noch nicht kennen, müssen Sie möglicherweise eine Datenbankabfrage durchführen (wie in https://docs.joomla.org/Selecting_data_using_JDatabase beschrieben), um sie basierend auf Ihren Kenntnissen zu finden.

Der folgende Code sollte funktionieren, sobald Sie den Wert der Datensatz-ID eingegeben haben. (Es wird jedoch nicht überprüft, ob der Datensatz bereits zur Bearbeitung an einen Benutzer ausgecheckt wurde, was, obwohl unwahrscheinlich, möglicherweise überprüft werden soll.).

use Joomla\CMS\Table\Module;
use Joomla\Registry\Registry;

$id = 1;  // plug in your own value here
$m = Module::getInstance("Module");
$m->load($id);
if ($m)
{    // found the record
    $moduleParams = new Registry($m->params); // convert params string to Registry
    $currentClassSfx = $moduleParams->get("class_sfx", "");  
    $newClassSfx = $currentClassSfx . " myclass";  // or check if it's already present?
    $moduleParams->set("class_sfx", $newClassSfx);
    $newParams = (string) $moduleParams;   // convert Registry to json string
    $m->bind(array("params" => $newParams));
    $m->check();
    $m->store();
}
else
{
    // handle the case when the record isn't found
}
2
Robbie Jackson