{"id":1094,"date":"2018-04-05T16:19:00","date_gmt":"2018-04-05T14:19:00","guid":{"rendered":"http:\/\/evileu.de\/zum-schwarzen-pinguin\/?p=1094"},"modified":"2018-04-05T16:54:12","modified_gmt":"2018-04-05T14:54:12","slug":"joomla-modul-ein-bisschen-aufgebohrt-mit-benutzereingaben","status":"publish","type":"post","link":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/04\/05\/joomla-modul-ein-bisschen-aufgebohrt-mit-benutzereingaben\/","title":{"rendered":"Joomla-Modul ein bisschen aufgebohrt &#8211; mit Benutzereingaben"},"content":{"rendered":"<p>Ich hab ja <a href=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/04\/02\/widget-basteln-macht-spass-ein-widget-mit-benutzereingaben\/\">in diesem Artikel <\/a>ein WordPress-Widget erstellt, das die Gesamtzahl der ver\u00f6ffentlichten Rezepte sowie die Anzahl der Rezepte einer frei w\u00e4hlbaren Kategorie anzeigt. So nach dem Muster:<\/p>\n<h3>312 Rezepte insgesamt<\/h3>\n<h3>46 davon Vegetarisch<\/h3>\n<p>Ob das mit unserem Joomla-Modul auch hinzukriegen ist?<\/p>\n<h2>Anzahl der Beitr\u00e4ge der Kategorie Rezepte<\/h2>\n<p>Meine Rezeptkategorie hat die ID 8, das kann man in der Tabelle #__categories nachschauen. Dazu hab ich folgendes Code Snippet gefunden:<\/p>\n<pre>$model = JModelLegacy::getInstance('Articles', 'ContentModel');\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$model-&gt;setState('filter.category_id', 8); \/\/ Set category ID here\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$articles = $model-&gt;getItems();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$num_articles = count($articles); \/\/ Returns the number of articles in category<\/pre>\n<p>Kommt mir ein bisschen arg umst\u00e4ndlich vor, aber wenns funktioniert&#8230;<\/p>\n<p>Ich m\u00f6chte jetzt aber nat\u00fcrlich ausw\u00e4hlen k\u00f6nnen, zu welcher Kategorie die Gesamtzahl der Beitr\u00e4ge ausgegeben werden soll, weil ich in Joomla so sch\u00f6ne M\u00f6glichkeiten habe, \u00fcber die Kategorisierung meine Ausgabe auf der Webseite zu strukturieren. Das hei\u00dft aber, wir brauchen ein Eingabefeld (Dropdown), in dem der Benutzer anw\u00e4hlen kann, welche Kategorie ausgegeben werden soll.<\/p>\n<h2>Eingabefelder f\u00fcr eigene Module in Joomla<\/h2>\n<p>Sind nicht arg schwer zu realisieren, die Joomla-Doku zu dem Thema ist schon mal recht gut, schaut mal hier rein:<\/p>\n<p><a href=\"https:\/\/docs.joomla.org\/J3.x:Creating_a_simple_module\/Adding_Form_Fields\">https:\/\/docs.joomla.org\/J3.x:Creating_a_simple_module\/Adding_Form_Fields<\/a><\/p>\n<p>Ich machs aber hier nochmal step by step, damit man es auch nachvollziehen kann. Wir setzen auf unser Hallo-Welt Modul a<a href=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/04\/04\/joomla-ein-einfaches-modul-erstellen\/\">us dem vorigen Beitrag<\/a> auf und erweitern die mod_helloworld.xml, in der kann man ein einfaches Texteingabefeld so erstellen:<\/p>\n<pre>\u00a0&lt;config&gt;\r\n\u00a0\u00a0 \u00a0&lt;fields name=\"params\"&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;fieldset name=\"basic\"&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;field name=\"<span style=\"color: #ff0000;\">param1<\/span>\" type=\"<span style=\"color: #ff0000;\">text<\/span>\" default=\"\" label=\"<span style=\"color: #ff0000;\">Bitte Titel eingeben<\/span>\" description=\"\"&gt;&lt;\/field&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/fieldset&gt;\r\n\u00a0\u00a0\u00a0 &lt;\/fields&gt;\r\n\u00a0\u00a0\u00a0 &lt;\/config&gt;<\/pre>\n<p>Die Felddefinition muss innerhalb der config-Tags stehen. Wenn man sich jetzt mal das Modul aschaut, m\u00fcsste das Feld eigentlich schon da sein:<\/p>\n<div id=\"attachment_1098\" style=\"width: 840px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1098\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1098\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/texteingabefeld.jpg\" alt=\"texteingabefeld\" width=\"830\" height=\"289\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/texteingabefeld.jpg 830w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/texteingabefeld-300x104.jpg 300w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/texteingabefeld-768x267.jpg 768w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/texteingabefeld-624x217.jpg 624w\" sizes=\"(max-width: 830px) 100vw, 830px\" \/><p id=\"caption-attachment-1098\" class=\"wp-caption-text\">texteingabefeld<\/p><\/div>\n<p>Wie kommt man jetzt an den Inhalt des Feldes ran, den unser Benutzer eiingegeben hat? Das passiert in der mod_helloworld.php, und zwar so:<\/p>\n<pre>$variable = $params-&gt;get('<span style=\"color: #ff0000;\">param1<\/span>');\r\n\r\n<\/pre>\n<p>Die $variable kann man jetzt an die helper-Klasse \u00fcbergeben:<\/p>\n<pre>$hello = modHelloWorldHelper::getHello(<span style=\"color: #ff0000;\">$variable<\/span>);<\/pre>\n<p>Und da kann man dann damit weiterarbeiten. Bevor ich da noch weiter darauf eingehe, erstmal:<\/p>\n<h2>Die Anforderungen<\/h2>\n<p>Den Titel des Moduls kann der Anwender beim Erstellen unter Erweiterungen-&gt;Module-&gt;neu-&gt;Mein Hallo-Welt Modul selber eingeben, den fragen wir nicht nochmal extra ab. Daf\u00fcr brauchen wir aber ein Dropdown-Feld, in dem die Kategorie (z.B. &#8222;Rezepte&#8220;) ausgew\u00e4hlt werden kann, f\u00fcr die die Gesamtzahl der Beitr\u00e4ge ausgegeben soll. Und wir brauchen noch ein zweites Dropdownfeld f\u00fcr das &#8222;featured tag&#8220; (z.B. &#8222;Vegetarisch&#8220;, aber dazu kommen wir sp\u00e4ter. Jetzt werfen wir erstmal einen Blick auf:<\/p>\n<h2>Die vordefinierten Form Field Types<\/h2>\n<p>Da bietet Joomla etwas wirklich praktisches an, es gibt eine ganz Latte von vordefinierten Formularfeldern, hier die Doku dazu: <a href=\"https:\/\/docs.joomla.org\/Standard_form_field_types\">https:\/\/docs.joomla.org\/Standard_form_field_types<\/a><\/p>\n<p>Da klemmen wir uns gleich mal den Formularfeldtyp &#8222;<a href=\"https:\/\/docs.joomla.org\/Category_form_field_type\/de\">Kategorie<\/a>&#8222;, der macht n\u00e4mlich genau das was wir brauchen. In der XML-Datei sieht das so aus:<\/p>\n<pre>&lt;field name=\"<span style=\"color: #ff0000;\">mycategory<\/span>\" type=\"category\" extension=\"com_content\" label=\"Eine Kategorie ausw\u00e4hlen\" description=\"\" \/&gt;<\/pre>\n<p>In der mod_helloworld.php holen wir uns den Inhalt mit:<\/p>\n<pre>$kat = $params-&gt;get('mycategory');<\/pre>\n<p>Und im Modul-Backend kriegen wir unsere Dropdown-Liste mit den Kategorien:<\/p>\n<div id=\"attachment_1099\" style=\"width: 853px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1099\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1099\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/dropdown_kategorien.jpg\" alt=\"dropdown_kategorien\" width=\"843\" height=\"636\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/dropdown_kategorien.jpg 843w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/dropdown_kategorien-300x226.jpg 300w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/dropdown_kategorien-768x579.jpg 768w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/dropdown_kategorien-624x471.jpg 624w\" sizes=\"(max-width: 843px) 100vw, 843px\" \/><p id=\"caption-attachment-1099\" class=\"wp-caption-text\">dropdown_kategorien<\/p><\/div>\n<p>In der \u00fcbergebenen Variablen steckt \u00fcbrigens die numerische ID der Kategorie Rezepte, die k\u00f6nnen wir gleich direkt weiterverwerten, und zwar in der helper.php:<\/p>\n<pre>public static function getHello($params)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$model = JModelLegacy::getInstance('Articles', 'ContentModel');\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$model-&gt;setState('filter.category_id', <span style=\"color: #ff0000;\">$params<\/span>); \/\/ Set category ID here\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$articles = $model-&gt;getItems();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$num_articles = count($articles); \/\/ Returns the number of articles in category\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0echo \"Insgesamt \".$num_articles.\" Rezepte&lt;br&gt;\";\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 }<\/pre>\n<p>Voraussetzung daf\u00fcr ist nat\u00fcrlich, dass wir sie in der mod_helloworld.php auch als Parameter an die Helper-Klasse \u00fcbergeben haben, aber dazu gleich mehr, zuerst schauen wir uns mal die Ausgabe an:<\/p>\n<div id=\"attachment_1100\" style=\"width: 346px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1100\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1100\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/insgesamt_rezepte.jpg\" alt=\"insgesamt_rezepte\" width=\"336\" height=\"154\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/insgesamt_rezepte.jpg 336w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/insgesamt_rezepte-300x138.jpg 300w\" sizes=\"(max-width: 336px) 100vw, 336px\" \/><p id=\"caption-attachment-1100\" class=\"wp-caption-text\">insgesamt_rezepte<\/p><\/div>\n<p>Das pa\u00dft soweit, jetzt m\u00fcssen wir nur noch den Ausgabetext dynamisch anpassen, es kann ja auch jemand die Kategorie &#8222;Kochb\u00fccher&#8220; angew\u00e4hlt haben, dann darf da nicht &#8222;Rezepte&#8220; stehen. Das machen wir so:<\/p>\n<pre>\/\/Name der Kategorie zur ID holen\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$db = JFactory::getDbo();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$db-&gt;setQuery(\"SELECT cat.title FROM #__categories cat WHERE cat.id='<span style=\"color: #ff0000;\">\".$params-&gt;kat.\"<\/span>'\"); \r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$category_title = $db-&gt;loadResult();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0echo \"Insgesamt \".$num_articles.\" \".$category_title.\"&lt;br&gt;\";<\/pre>\n<p>Nicht dran st\u00f6ren dass hier <span style=\"color: #ff0000;\">&#8222;.$params-&gt;kat.&#8220; steht, <span style=\"color: #000000;\">das kommt daher, dass ich ein Array von Parametern \u00fcbergeben habe, mehr dazu gleich. Jedenfalls wird jetzt auch der richtige Kategoriename angezeigt:<\/span><br \/>\n<\/span><\/p>\n<div id=\"attachment_1101\" style=\"width: 285px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1101\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1101\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/2kochbuecher.jpg\" alt=\"2kochbuecher\" width=\"275\" height=\"152\" \/><p id=\"caption-attachment-1101\" class=\"wp-caption-text\">2kochbuecher<\/p><\/div>\n<h2>Mehr als ein Formularfeld, mehrere Parameter zum \u00dcbergeben<\/h2>\n<p>Wir brauchen aber noch ein zweites Formularfeld f\u00fcr die Tags, und dazu werfen wir einen kurzen Blick darauf, wie wir mehr als eine Variable an die Helper-Klasse \u00fcbergeben k\u00f6nnen. Kurze Erinnerung, wie die zwei Felddefinitionen in der XML-Datei aussehen:<\/p>\n<pre>&lt;fields name=\"params\"&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;fieldset name=\"basic\"&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;field name=\"<span style=\"color: #ff0000;\">param1<\/span>\" type=\"text\" default=\"\" label=\"Bitte Text eingeben\" description=\"\"&gt;&lt;\/field&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;field name=\"<span style=\"color: #ff0000;\">mycategory<\/span>\" type=\"category\" extension=\"com_content\" label=\"Eine Kategorie ausw\u00e4hlen\" description=\"\" \/&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/fieldset&gt;\r\n\u00a0\u00a0\u00a0 &lt;\/fields&gt;<\/pre>\n<p>Die Inhalte der Felder holen wir uns in der mod_helloworld.php \u00fcber die Feldnamen:<\/p>\n<pre>$kat = $params-&gt;get('mycategory');\r\n$variable = $params-&gt;get('param1');<\/pre>\n<p>Dann packen wir sie in ein Standardobjekt und \u00fcbergeben dieses an die Helper-Klasse:<\/p>\n<pre>$data = new stdClass();\r\n\/\/Objekt f\u00fcllen\r\n$data-&gt;kat = <span style=\"color: #ff0000;\">$kat<\/span>;\r\n$data-&gt;variable = <span style=\"color: #ff0000;\">$variable<\/span>;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n$hello = modHelloWorldHelper::getHello(<span style=\"color: #ff0000;\">$data<\/span>);\r\n\r\n<\/pre>\n<p>In der helper.php holen wir uns die \u00fcbergebenen Variablen, die ja in unserem Objekt stecken, mit ihrem Namen, also z.B. $params-&gt;<span style=\"color: #ff0000;\">kat.<span style=\"color: #000000;\"> Das $params stammt aus der Funktionsdefinition der <em>public static function getHello(<strong>$params<\/strong>)) <\/em>wer da etwas anderes stehen hat, muss das entsprechend anpassen. Hier nochmal die komplette function: <\/span><\/span><\/p>\n<pre>public static function getHello($params)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Anzahl der Artikel zur \u00fcbergebenen Kategorie-ID holen\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$model = JModelLegacy::getInstance('Articles', 'ContentModel');\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$model-&gt;setState('filter.category_id', $params-&gt;kat); \/\/ Set category ID here\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$articles = $model-&gt;getItems();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$num_articles = count($articles); \/\/ Returns the number of articles in category\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Name der Kategorie zur ID holen\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$db = JFactory::getDbo();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$db-&gt;setQuery(\"SELECT cat.title FROM #__categories cat WHERE cat.id='\".$params-&gt;kat.\"'\"); \r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$category_title = $db-&gt;loadResult();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0echo \"Insgesamt \".$num_articles.\" \".$category_title.\"&lt;br&gt;\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 }<\/pre>\n<p>Das sieht jetzt schon ziemlich gut aus. Leider habe ich f\u00fcr die Tags keinen vordefinierten Formularfeldtyp gefunden, da m\u00fcssen wir was basteln, aber dazu gibt es einen neuen Beitrag.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich hab ja in diesem Artikel ein WordPress-Widget erstellt, das die Gesamtzahl der ver\u00f6ffentlichten Rezepte sowie die Anzahl der Rezepte einer frei w\u00e4hlbaren Kategorie anzeigt. So nach dem Muster: 312 Rezepte insgesamt 46 davon Vegetarisch Ob das mit unserem Joomla-Modul auch hinzukriegen ist? Anzahl der Beitr\u00e4ge der Kategorie Rezepte Meine Rezeptkategorie hat die ID 8, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1,28,33],"tags":[],"_links":{"self":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1094"}],"collection":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/comments?post=1094"}],"version-history":[{"count":4,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1094\/revisions"}],"predecessor-version":[{"id":1103,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1094\/revisions\/1103"}],"wp:attachment":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/media?parent=1094"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/categories?post=1094"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/tags?post=1094"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}