Gestern tauchte im IRC die Frage auf “Wie kann ich eigentlich im Magento-Backend unter Konfiguration einen Button hinzufügen, der einen Task anstößt?”.
Bekanntermaßen bietet Magento ja eine komplett XML-gesteuerte Beschreibung der Konfiguration über das man eigene Bereiche und Optionen einfügen kann.
Nur einen Button einfügen hatte noch niemand gesehen, also werd ich das in diesem Blogpost mal genauer erklären
Angehängt gibt es ein kleines Beispielmodul, ihr braucht also nicht mal selber tippen… ![]()
Den Anfang macht das Beispielmodul: Thebod_CustomConfig
Aber kurz erstmal etwas allgemeines zum Prinzip der Konfiguration. Wir können in unserer system.xml eine Section erstellen bzw. erweitern.
Eine Section ist ein Abschnitt der sich unter System->Konfiguration im Backend befindet. Jeder dieser Sections ist einem Tab zugeordnet und enthält eine oder mehrere Groups (oder Gruppen? Ich bleib bei Denglisch
) die wiederum Konfigurationsoptionen erhalten.
Wichtig ist beim anlegen einer neuen Section noch die ACL, ein Beispiel dafür findet ihr in der adminhtml.xml im etc-Ordner meines Modules.
Die Beschreibung der einzelnen Group-Bereiche und der Sections ist ähnlich wie die einzelnen Optionen und recht selbsterklärend und unspannend, daher überspringe ich das
Bei Fragen kann ich das auch nochmal erklären.
Wenden wir uns also den interessanten Dingen zu: den Konfigurationsoptionen.
Ein Eintrag dafür sieht wie folgt aus:
<textinput translate="label comment"> <label>Text Input</label> <comment>Standart text input field</comment> <frontend_type>text</frontend_type> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> <sort_order>10</sort_order> </textinput> |
“textinput” entspricht in diesem Falle der Optionsbezeichnung.
“label” gibt den Titel, bzw. das Label an.
“comment” erstellt einen optionalen Kommentar
“frontend_type” gibt an von welchem Typ die Darstellung ist, in diesem Falle ein Textfeld. Eine Auflistung findet ihr in Varien_Data_Form_Element_* (Unterhalb des lib-Ordners).
“show_in_*” definiert die Sichtbarkeit (store, website, default)
“sort_order” als letztes gibt die Reihenfolge an.
Es gibt noch die Möglichkeit die Felder zu validieren, daim schrieb darüber einen kurzen, aber hilfreichen, Post: Magento Admin Input Feld Länge prüfen.
Soweit so gut. In meinem Beispiel (Thebod_CustomConfig) findet ihr ein paar Beispieloptionen.
Kommen wir jetzt zum interessanteren Teil: Das Anpassen der Optionen.
Als erstes ein Select-Feld mit eigenen Werten. Dazu benötigen wir ein sog. Source-Model welches die möglichen Werte angibt.
In meinem Beispielcode findet ihr den Fall bei customselect, der frontend_type ist auf select gesetzt und das source_model auf customconfig/system_config_source_customselect.
Das bedeutet für Magento er soll sich aus Thebod/CustomConfig/Model/System/Config/Source/Customselect.php eine Liste mit Optionen holen.
Aktuell wird dort nur ein Array mit vier Values erzeugt, möglich wäre an dieser Stelle aber natürlich auch die nächsten 3 Wochentage, eine for-Schleife mit den Zahlen 1-1000000 oder die aktuellen Börsenkurse per RSS-Feed abgefragt. Eurer Fantasie steht ab jetzt alles offen
Next one: der Button. Der Grund weshalb ich diesen Post schreibe.
In meinem Falle habe ich ein eigenes Frontend-Model genutzt, das eig. die besten Konfigurationsmöglichkeiten bietet (wenngleich auch einen Tick aufwendiger zu schreiben).
Den Frontend-Type lassen wir weg, dafür definieren wir ein Frontend-Model:
<frontend_model>customconfig/adminhtml_system_config_custombutton</frontend_model> |
Die Bezeichnung “Frontend-Model” ist wieder irreführend, das ist nämlich ein Block (ja, wer kommt da schon drauf?
)
Zu finden natürlich unter Thebod/CustomConfig/Block/Adminhtml/System/Config/Custombutton.php. Viele Geheimnisse passieren nicht in dem Block, das ist weitegehend selbsterklärend (ein Template wird geladen, Werte zugewiesen, und dann gerendert).
Das Template ist an dieser Stelle noch interessant (wenngleich auch kurz und knapp), zu finden unter app/design/adminhtml/default/default/template/customconfig/system/config/custombutton.phtml
<button onclick="javascript:window.open('<?php echo $this->getButtonUrl()?>', ''); return false;" class="scalable" type="button" id="<?php echo $this->getHtmlId(); ?>">
<span><?php echo $this->escapeHtml($this->getButtonLabel()); ?></span>
</button> |
Hier wird der Button hinzugefügt, und die entsprechenden Werte für das Label und die URL gesetzt (im Block werden diese durch _getElementHtml() gesetzt/übergeben).
Das wars auch schon, ich hoffe das ist alles verständlich!
Bei Fragen, Anregungen, und anderem freue ich mich über Kommentare
thebod
onclick=”javascript:…”
das ist oberflächlich redundant – der Wert des onclick-Attributes wird immer als JavaScript interpretiert – und zudem tut es nicht das was man vermutet: ‘javascript:’ wird als label [https://developer.mozilla.org/en/JavaScript/Reference/Statements/label] übersetzt, völlig nutzlos
javascript: sollte nur als URI-Schema im Attribut href vorkommen.
…und damit hast du eine dumme Angewohnheit von mir gefunden
Hab mir das glaub ich mal angewöhnt, wenngleich du natürlich vollkommen recht hast.
Aber schön dass das die einzige Kritik ist