{"id":852,"date":"2018-02-18T14:16:43","date_gmt":"2018-02-18T13:16:43","guid":{"rendered":"http:\/\/evileu.de\/zum-schwarzen-pinguin\/?p=852"},"modified":"2018-02-20T16:23:33","modified_gmt":"2018-02-20T15:23:33","slug":"benutzerdefinierte-felder-im-beitrag-anzeigen","status":"publish","type":"post","link":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/02\/18\/benutzerdefinierte-felder-im-beitrag-anzeigen\/","title":{"rendered":"Benutzerdefinierte Felder &#8211; im Beitrag anzeigen"},"content":{"rendered":"<p>Analog zu den Custom Fields in WordPress kann man auch in Joomla selbstdefinierte Felder zu den Artikeln anlegen. Ich bin da gleich mal reingerasselt, weil ich zu den Kochb\u00fcchern ein Feld &#8222;Unverbindliche Preisempfehlung&#8220; haben wollte. Schauen sie mal unter Inhalte\/Felder\/Neu die Liste der Feldtypen an &#8211; da ist alles dabei, blo\u00df keine W\u00e4hrung, der einzige verf\u00fcgbare Zahlentyp ist Integer. Ein Datumsfeld sucht man auch erstmal, es versteckt sich hinter dem Feldtyp &#8222;Kalender&#8220;. Ansonsten stecken in den Feldtypen jede Menge Angaben, die ich f\u00fcr Spielerei halte, unter anderem auch ein Feldtyp &#8222;Farbe&#8220;, man sehe und staune:<\/p>\n<div id=\"attachment_850\" style=\"width: 626px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-850\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-850\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/rgb_feld.jpg\" alt=\"rgb_feld\" width=\"616\" height=\"381\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/rgb_feld.jpg 616w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/rgb_feld-300x186.jpg 300w\" sizes=\"(max-width: 616px) 100vw, 616px\" \/><p id=\"caption-attachment-850\" class=\"wp-caption-text\">rgb_feld<\/p><\/div>\n<p>Damit kann man sich im Frontend den RGB-Code der gew\u00e4hlten Farbe anzeigen lassen, wof\u00fcr das auch immer gut sein soll.<\/p>\n<p>Wenigstens kann man beim Anlegen der Felder angeben ob es sich um ein Pflichtfeld handelt, dann kriegt man beim Ausf\u00fcllen der Beitr\u00e4ge einen Hinweis, wenn was fehlt. Wo sich die Felder und die Feldinhalte wiederfinden lassen, dazu gibts einen:<\/p>\n<h2>Blick auf die Datenbank<\/h2>\n<p>Man kann auch noch Feldgruppen anlegen, aber das lassen wir mal aussen vor, sonst wirds zu kompliziert. Ich m\u00f6chte jetzt einfach in einem Artikel den Wert eines benutzerdefinierten Feldes anzeigen, und zwar an beliebiger Stelle im Inhalt. Und &#8211; da bin ich ein bi\u00dfchen eigen &#8211; ich m\u00f6chte das auf relativ einfachen Weg in einem Sourcerer Codesnippet tun, ohne Overrides\u00a0 und ohne eigens programmierte Module. Kann ja wohl nicht so schwer sein!<\/p>\n<p>Daf\u00fcr tun wir mal einen beherzten Griff in die Datenbank. Die relevanten Tabellen sind die #__contents, aus der brauchen wir die ID des Artikels, die Tabelle #__fields, aus der holen wir uns den Feldnamen und nach Belieben auch die Feld-ID, und schliesslich die #__fields_values, in der stecken schlussendlich die Werte der Felder. Ich habs mal kurz nach Access reingeschubst, da stellen sich die Beziehungen so dar:<\/p>\n<div id=\"attachment_854\" style=\"width: 718px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-854\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-854\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/fields_beziehungen.jpg\" alt=\"fields_beziehungen\" width=\"708\" height=\"581\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/fields_beziehungen.jpg 708w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/fields_beziehungen-300x246.jpg 300w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/fields_beziehungen-624x512.jpg 624w\" sizes=\"(max-width: 708px) 100vw, 708px\" \/><p id=\"caption-attachment-854\" class=\"wp-caption-text\">fields_beziehungen<\/p><\/div>\n<p>Also, frisch auf, einen Join \u00fcber alle drei Tabellen gebastelt, wichtig ist hier die item_id, die identifiziert unseren Artikel:<\/p>\n<div id=\"attachment_855\" style=\"width: 646px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-855\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-855\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/felder_join_alle_drei.jpg\" alt=\"felder_join_alle_drei\" width=\"636\" height=\"338\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/felder_join_alle_drei.jpg 636w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/felder_join_alle_drei-300x159.jpg 300w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/felder_join_alle_drei-624x332.jpg 624w\" sizes=\"(max-width: 636px) 100vw, 636px\" \/><p id=\"caption-attachment-855\" class=\"wp-caption-text\">felder_join_alle_drei<\/p><\/div>\n<p>Der Select dazu sieht so aus und ist relativ straightforward:<\/p>\n<p><em>SELECT Fields_values.field_id, Fields.name, Fields_values.item_id, Fields_values.value<\/em><br \/>\n<em>FROM Fields INNER JOIN (Content INNER JOIN Fields_values ON Content.[id] = Fields_values.[item_id]) ON Fields.[id] = Fields_values.[field_id];<\/em><\/p>\n<p>Wir wollen aber nur die Feldinhalte zum aktuellen Artikel ausgeben, ich nehm mal den mit der ID 22 und klemm noch eine Where-Klausel dran. Dann k\u00f6nnen wir uns auch den Join auf die #__contents noch sparen, die ID des Artikels ist ja erstmal fest.<\/p>\n<p><em>SELECT Fields_values.field_id, Fields.name, Fields_values.item_id, Fields_values.value<\/em><br \/>\n<em>FROM Fields INNER JOIN Fields_values ON Fields.[id] = Fields_values.[field_id]<\/em><br \/>\n<em><strong>WHERE (((Fields_values.item_id)=&#8220;22&#8243;))<\/strong>;<\/em><\/p>\n<p>Ergebnis wie erwartet:<\/p>\n<div id=\"attachment_856\" style=\"width: 704px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-856\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-856\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/felder_nur22.jpg\" alt=\"felder_nur22\" width=\"694\" height=\"142\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/felder_nur22.jpg 694w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/felder_nur22-300x61.jpg 300w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/felder_nur22-624x128.jpg 624w\" sizes=\"(max-width: 694px) 100vw, 694px\" \/><p id=\"caption-attachment-856\" class=\"wp-caption-text\">felder_nur22<\/p><\/div>\n<p>Und jetzt kann man sich anhand der field_id oder dem field name ein benutzerdefiniertes Feld herauspicken, ich nehm mal den Namen:<\/p>\n<p><em>SELECT Fields_values.field_id, Fields.name, Fields_values.item_id, Fields_values.value<br \/>\nFROM Fields INNER JOIN Fields_values ON Fields.[id] = Fields_values.[field_id]<br \/>\n<strong>WHERE (((Fields.name) Like &#8222;farbtest&#8220;)<\/strong> AND ((Fields_values.item_id)=&#8220;<strong>22<\/strong>&#8222;));<br \/>\n<\/em><\/p>\n<p>Schon haben wir den Datensatz mit dem richtigen Feldwert eingekreist:<\/p>\n<div id=\"attachment_857\" style=\"width: 631px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-857\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-857\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/felder_nurfarbtest.jpg\" alt=\"felder_nurfarbtest\" width=\"621\" height=\"133\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/felder_nurfarbtest.jpg 621w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/felder_nurfarbtest-300x64.jpg 300w\" sizes=\"(max-width: 621px) 100vw, 621px\" \/><p id=\"caption-attachment-857\" class=\"wp-caption-text\">felder_nurfarbtest<\/p><\/div>\n<p>Na bitte, geht doch!<\/p>\n<h2>Und wo kriegen wir jetzt die aktuelle Artikel-ID her?<\/h2>\n<p>Das ist eine berechtigte Frage, man kommt ihr aber mit folgender Konstruktion bei:<\/p>\n<p><span style=\"font-size: 12pt;\"><code>$article_id = JFactory::getApplication()-&gt;input-&gt;get('id'); <\/code><\/span><\/p>\n<p>Jetzt basteln wir uns wie gehabt ein neues Datenzugriffsobjekt in der Variablen $db, dazu muss man noch ein bisschen bei den doppelten und einfachen Hochkommata aufpassen und das Pr\u00e4fix #__ nicht vergessen, aber das sollte eigentlich problemlos klappen.:<\/p>\n<p><em>$db = JFactory::getDBO();<\/em><\/p>\n<p><em>$query = &#8222;SELECT #__fields_values.field_id, #__fields.name, #__fields_values.item_id, #__fields_values.value<\/em><br \/>\n<em>FROM #__fields INNER JOIN #__fields_values ON #__fields.id = #__fields_values.field_id<\/em><br \/>\n<em>WHERE (#__fields_values.item_id = &#8222;.<strong>$article_id<\/strong>.&#8220; ) and (#__fields.name like &#8218;<strong>farbtest<\/strong>&#8218;);&#8220;;<\/em><\/p>\n<p>Die Variable $article_id schubsen wir in unsere Where-Klausel rein, den Namen des benutzerdefinierten Feldes auch, das kann man auch auf eine Variable legen, oder man verdrahtet es fest wie ich es getan habe. Das war schon der ganze Zauber!<\/p>\n<p>Query zuweisen und ausf\u00fchren:<\/p>\n<p><em>$db-&gt;setQuery($query);<br \/>\n<\/em><em>$result = $db-&gt;execute();<\/em><\/p>\n<p>Objektliste laden, auch wenn wir nur 1 Zeile im result haben:<\/p>\n<p>$results = $db-&gt;loadObjectList();<\/p>\n<p>Ausgabe des Wertes aus dem Feld value mit foreach(), :<\/p>\n<p><em>foreach ($results as $zeile) :<\/em><br \/>\n<em> echo $zeile-&gt;<strong>value<\/strong>;<\/em><br \/>\n<em> endforeach;<\/em><\/p>\n<p>Das wars, da haben wir den Wert unseres benutzerdefinierten Feldes, und der kann an beliebiger Stelle im Artikel positioniert werden. Die anderen benutzerdefinierten Felder kann man nat\u00fcrlich auch mit dem Namen ansprechen, das geht ganz genau so wie hier vorgef\u00fchrt.<\/p>\n<p>Kleine Spielerei am Schluss: wenn wir schon einen RGB-Farbwert haben, m\u00f6chten wir die Farbe auch sehen, ich mach mal ein Quadrat von 300 px Kantenl\u00e4nge. Dann kommt in der foreach-Schleife noch eine Variablenzuweisung mit:<\/p>\n<p><em>foreach ($results as $zeile) :<\/em><br \/>\n<strong><em>$aktuelle_farbe = $zeile-&gt;value;<\/em><\/strong><br \/>\n<em>echo $zeile-&gt;value.&#8220;&lt;br&gt;&#8220;;<\/em><br \/>\n<em>endforeach;<\/em><\/p>\n<p>Die verwenden wir jetzt in einer Div f\u00fcr das Farbquadrat:<\/p>\n<p><em>echo &#8222;&lt;div style=&#8217;background-color:&#8220;.<strong>$aktuelle_farbe<\/strong>.&#8220;; width: 300px; height: 300px;&#8216;&gt;&lt;h2&gt;Aktuelle Farbe&lt;\/h2&gt;&lt;\/div&gt;&#8220;;<\/em><\/p>\n<div id=\"attachment_867\" style=\"width: 337px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-867\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-867\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/farbquadrat-1.jpg\" alt=\"farbquadrat\" width=\"327\" height=\"421\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/farbquadrat-1.jpg 327w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/02\/farbquadrat-1-233x300.jpg 233w\" sizes=\"(max-width: 327px) 100vw, 327px\" \/><p id=\"caption-attachment-867\" class=\"wp-caption-text\">farbquadrat<\/p><\/div>\n<p>Na siehste, haben wir doch noch eine Anwendung f\u00fcr den Feldtyp &#8222;Farbe&#8220; gefunden!<\/p>\n<h2>Nachtrag<\/h2>\n<p>Ich bin gefragt worden, warum ich denn nicht ein alternatives Layout f\u00fcr die Anzeige der Felder angelegt habe und dann einfach dort an der richtigen Stelle mit:<\/p>\n<p><em>&lt;?php echo $this-&gt;item-&gt;jcfields[<strong>x<\/strong>]-&gt;value; ?&gt;<\/em><\/p>\n<p>das Feld mit der Nummer <strong>x<\/strong> einf\u00fcge. Ganz einfach: ich wollte den Feldinhalt <strong>innerhalb des Beitragstextes<\/strong> ausgeben, das ist der ganze Witz an der Sache. Das geht im Template nicht, da dort der Beitragstext als Ganzes mit &lt;?php echo $this-&gt;item-&gt;text; ?&gt; hereingeholt wird, und man keine Chance hat da innerhalb etwas zu positionieren. Ist der Sinn und Zweck der \u00dcbung jetzt etwas klarer?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Analog zu den Custom Fields in WordPress kann man auch in Joomla selbstdefinierte Felder zu den Artikeln anlegen. Ich bin da gleich mal reingerasselt, weil ich zu den Kochb\u00fcchern ein Feld &#8222;Unverbindliche Preisempfehlung&#8220; haben wollte. Schauen sie mal unter Inhalte\/Felder\/Neu die Liste der Feldtypen an &#8211; da ist alles dabei, blo\u00df keine W\u00e4hrung, der einzige [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[40,38],"tags":[],"_links":{"self":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/852"}],"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=852"}],"version-history":[{"count":12,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/852\/revisions"}],"predecessor-version":[{"id":871,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/852\/revisions\/871"}],"wp:attachment":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/media?parent=852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/categories?post=852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/tags?post=852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}