{"id":1104,"date":"2018-04-06T05:32:00","date_gmt":"2018-04-06T03:32:00","guid":{"rendered":"http:\/\/evileu.de\/zum-schwarzen-pinguin\/?p=1104"},"modified":"2018-04-06T05:32:00","modified_gmt":"2018-04-06T03:32:00","slug":"joomla-modul-mit-sql-formfield","status":"publish","type":"post","link":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/04\/06\/joomla-modul-mit-sql-formfield\/","title":{"rendered":"Joomla Modul mit SQL-Formfield"},"content":{"rendered":"<p>Da ich keinen vorgefertigten Formularfeldtyp gefunden habe, der mir die Tags (Schlagw\u00f6rter) ausgibt, hab ichs mal \u00fcber den Typ <a href=\"https:\/\/docs.joomla.org\/SQL_form_field_type\">SQL form field type<\/a> probiert, mal sehen wie weit wir damit kommen. Aber erst noch mal ein paar Gedanken zu den Anforderungen:<\/p>\n<h2>Ich schraubs mal ein bisschen runter<\/h2>\n<p>Im vorigen Artikel hatte ich ja f\u00fcr den Anwender die M\u00f6glichkeit geschaffen, eine bestimmte Beitragskategorie auszuw\u00e4hlen. Das hat ganz h\u00fcbsch funktioniert, aber eigentlich ist es f\u00fcr meinen Zweck nicht ganz das Richtige. Ich brauche ja auch noch mein zweites Auswahlkriterium, n\u00e4mlich die Tags=Schlagw\u00f6rter. Kurze Erinnerung, was ausgegeben werden soll:<\/p>\n<p><strong>X<\/strong> Rezepte insgesamt<\/p>\n<p>davon <strong>Y<\/strong> mit dem Tag <strong>Z<\/strong><\/p>\n<p>Ich habe aber in meinem Joomla-Kochbuch die Einschr\u00e4nkung gemacht, dass Tags nur f\u00fcr die Kategeorie Rezepte verwendet werden, in den anderen Kategorien (Kochb\u00fccher etc.) hab ich sie schlicht und ergreifend nicht eingesetzt. Das heisst aber, unsere Tagauswahl macht nur Sinn, wenn die Beitragskategorie 8 f\u00fcr Rezept ist, und dann kann ich es auch gleich fest verdrahten. Sonst d\u00fcrfte ich die Tag-Auswahl nur anzeigen, wenn der Anwender die Kategorie Rezepte gew\u00e4hlt hat, und das geht mir dann doch ein bisschen zu weit.<\/p>\n<h2>Der Formularfeldtyp SQL<\/h2>\n<p>Ist wahrscheinlich am leichtesten zu verstehen, wenn man es am konkreten Beispiel sieht. Die Felddefinition in meiner XML-Datei sieht so aus:<\/p>\n<pre>&lt;field\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0name=\"title\"\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0type=\"sql\"\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0default=\"10\"\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0label=\"Einen Tag ausw\u00e4hlen\"\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0query=\"SELECT <span style=\"color: #ff0000;\">id AS value<\/span>, title FROM #__tags where title not like 'ROOT'\"\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/&gt;<\/pre>\n<p>Dabei ist der Alias &#8222;AS value&#8220; wichtig, da \u00fcber diesen der R\u00fcckgabewert des Feldes definiert wird. Den Select hab ich gleich ein bisschen angepasst, wir gehen in die tabelle #_tags und schliessen hier den Systemeintrag ROOT aus, weil der in der Auswahlliste gar nicht auftauchen darf.<\/p>\n<p>Zum Aufbau der Query zitiere ich mal die Joomla-Doku:<\/p>\n<ul>\n<li>\n<blockquote><p><b>query<\/b>\u00a0(mandatory if not using the sql_* attributes) is the SQL query which will provide the data for the drop-down list. The query must return two columns; one called\u00a0<i>&#8218;value&#8216;<\/i>\u00a0(unless overridden by the\u00a0<b>key_field<\/b>\u00a0attribute) which will hold the values of the list items; the other called the same as the value of the name attribute (unless overridden by the\u00a0<b>value_field<\/b>\u00a0attribute) containing the text to be shown in the drop-down list.<\/p><\/blockquote>\n<\/li>\n<\/ul>\n<p>Also, mal ganz langsam.<\/p>\n<ul>\n<li>die query liefert die Daten f\u00fcr unser Dropdown-Feld<\/li>\n<li>die query muss zwei Spalten zur\u00fcckgeben<\/li>\n<li>die erste Spalte der R\u00fcckgabe muss <strong>value<\/strong> heissen, das passiert hier mit dem <strong>Alias<\/strong>, und liefert die R\u00fcckgabewerte f\u00fcr das Formularfeld (in unserem Fall die numerische ID des Tags)<\/li>\n<li>die zweite Spalte muss genauso heissen wie das Feld in der XML-Datei, ich bin hier bei <strong>title<\/strong> geblieben. Die zweite Spalte liefert die Eintr\u00e4ge f\u00fcr das Dropdown-Feld.<\/li>\n<\/ul>\n<p>Alles klar? Jedenfalls funktionierts, und mein Dropdownfeld sieht schon mal ganz gut aus:<\/p>\n<div id=\"attachment_1106\" style=\"width: 478px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1106\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1106\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/dropdown_tags.jpg\" alt=\"dropdown_tags\" width=\"468\" height=\"392\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/dropdown_tags.jpg 468w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/dropdown_tags-300x251.jpg 300w\" sizes=\"(max-width: 468px) 100vw, 468px\" \/><p id=\"caption-attachment-1106\" class=\"wp-caption-text\">dropdown_tags<\/p><\/div>\n<p>Den Wert, den der Benutzer ausgew\u00e4hlt hat, holen wir uns in der mod_helloworld.php wie gehabt \u00fcber den Namen des Feldes:<\/p>\n<pre>$titel = $params-&gt;get('title');<\/pre>\n<p>Wir erweitern unser Standardobjekt f\u00fcr die Parameter\u00fcbergabe an die Helper-Klasse entsprechend:<\/p>\n<pre>$data = new stdClass();\r\n\/\/Objekt f\u00fcllen\r\n$data-&gt;kat = $kat;\r\n$data-&gt;variable = $variable;\r\n<span style=\"color: #ff0000;\">$data-&gt;titel = $titel;<\/span><\/pre>\n<p>Und k\u00f6nnen jetzt in der helper.php damit weiterarbeiten, da haben wir jetzt die numerische ID des gew\u00e4hlten Tags auf der Variablen <strong>$params-&gt;titel<\/strong>.<\/p>\n<p>Jetzt m\u00fcssen wir nur noch z\u00e4hlen, wieviele Rezepte dem gew\u00e4hlten Tag zugeordnet sind, und daf\u00fcr brauchen wir die Tabelle #__content_item_tag_map, da schauen wir einfach nach, wie oft die aktuelle Tag-ID auftaucht.<\/p>\n<pre>\/\/Anzahl der Tags zur TagID holen\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$db = JFactory::getDbo();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$db-&gt;setQuery(\"SELECT * FROM #__contentitem_tag_map WHERE tag_id = \".<span style=\"color: #ff0000;\">$params-&gt;titel<\/span>.\"\"); \r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$db-&gt;execute();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$my_count = $db-&gt;getNumRows();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0echo $my_count;<\/pre>\n<p>Schlu\u00dfendlich fehlt uns noch der Name des Tags f\u00fcr die Ausgabe, den holen wir uns mit der ID aus der Tabelle #__tags:<\/p>\n<pre>\/\/Name des Tags zur Tag-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 title FROM #__tags WHERE id=\".<span style=\"color: #008000;\">$params-&gt;titel<\/span>);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$db-&gt;execute();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0<span style=\"color: #008000;\">$tagName<\/span> = $db-&gt;loadResult();<\/pre>\n<p>Das wars, fehlt nur noch die Ausgabe:<\/p>\n<pre>echo $my_count.\" davon zum Thema \".$tagName;<\/pre>\n<p class=\"title\">\u00a0Bingo, das hat hingehauen! Meine Ausgabe sieht so aus:<\/p>\n<div id=\"attachment_1110\" style=\"width: 295px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1110\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1110\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/04\/tag_kat_ausgabe.jpg\" alt=\"tag_kat_ausgabe\" width=\"285\" height=\"175\" \/><p id=\"caption-attachment-1110\" class=\"wp-caption-text\">tag_kat_ausgabe<\/p><\/div>\n<p>Passt einwandfrei. Man k\u00f6nnte es jetzt noch perfektionieren und einen Join auf die #__content \u00fcber die Kategorie-ID einbauen, damit man nur die Tags angezeigt bekommt, die auch zu Rezepten zugeordnet sind, aber ich wills mal nicht \u00fcbertreiben. Die Vorgabe war ja, dass Tags nur in der Kategorie Rezepte verwendet werden, das muss reichen.<\/p>\n<h2>Fazit<\/h2>\n<p>Ich finde, die Formularfelddefinition ist \u00fcber die XML-Datei \u00fcbersichtlich und komfortabel gel\u00f6st, und die vordefinierten Formularfeldtypen nehmen einem in vielen F\u00e4llen einen Haufen Arbeit ab. Das macht es wieder wett, dass die Modulerstellung am Anfang ein bisschen schwer zu durchblicken ist, aber wenn man einmal ein Basic Modul geschrieben hat, geht auch das leicht von der Hand. Modulbasteln in Joomla macht Spa\u00df!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Da ich keinen vorgefertigten Formularfeldtyp gefunden habe, der mir die Tags (Schlagw\u00f6rter) ausgibt, hab ichs mal \u00fcber den Typ SQL form field type probiert, mal sehen wie weit wir damit kommen. Aber erst noch mal ein paar Gedanken zu den Anforderungen: Ich schraubs mal ein bisschen runter Im vorigen Artikel hatte ich ja f\u00fcr den [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[29,28,31,33,41,3],"tags":[],"_links":{"self":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1104"}],"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=1104"}],"version-history":[{"count":6,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1104\/revisions"}],"predecessor-version":[{"id":1112,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1104\/revisions\/1112"}],"wp:attachment":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/media?parent=1104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/categories?post=1104"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/tags?post=1104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}