Archiv des Autors: admin

Joomla und die Bilder: ein stiefmütterliches Verwirrspiel

Man hat in Joomla prinzipiell drei Möglichkeiten, Bilder in einen Artikel einzufügen. Einmal als Inline-Element im Beitragseditor, wie wir das auch von WordPress her kennen. Dann gibt es noch das Einleitungsbild, entspricht in etwa dem Artikelbild in WordPress und wird in der Blogansicht über dem Artikel dargestellt. Und schliesslich noch das komplette Beitragsbild, das wie der Name schon sagt in der kompletten Ansicht des Artikels zu sehen ist.

Zu beachten ist in allen drei Fällen: Joomla hat keine Hilfsmechanik zum Bilderskalieren, jedes hochgeladene Bild landet in voller Pracht und Grösse im images-Verzeichnis und wird für die Anzeige auch in voller Größe geladen. Da, wo es WordPress ein bisschen übertreibt mit einem halben Dutzend und mehr passend zum Theme skalierter Bildkopien, tut Joomla von selber rein gar nix. Und ich hab lang gegooglet, aber Joomla-Extensions zum komfortablen Bilderskalieren beim Hochladen gibts anscheinend nicht als Public Domain, das sind alles Paid Downloads. Scheint so als wenn einem ohne zusätzliche Software nichts anderes übrig bleibt, als hochzuladende Bilder vorher per Hand auf ein vernünftiges Maß zu skalieren. Keine so richtig benutzerfreundliche Lösung!

Einleitungsbild und komplettes Beitragsbild

Diese legt man im Artikeleditor unter dem Reiter „Bilder und Links“ an, hier kann auch der Alt-Text und eine Bildunterschrift angegeben werden. Eine Option für das title-Tag hab ich nicht gefunden, aber wenigstens der Alternativtext ist vorgesehen… man ist ja schon für Kleinigkeiten dankbar.

Die hier vorgenommenen Einstellungen landen übrigens im Datensatz des Artikels in der #__contents-Tabelle, im Feld images, das sieht dann zum Beispiel so aus:

{„image_intro“:“images\/Appetitbrtchen.jpg“,“float_intro“:““,“image_intro_alt“:“Bernhard i\u00dft ein Appetitbr\u00f6tchen“,“image_intro_caption“:“Bernhard mit Appetitbr\u00f6tchen“,“image_fulltext“:“images\/avocado.jpg“,“float_fulltext“:““,“image_fulltext_alt“:“Maitre Philippe bereitet Avocadoh\u00e4ppchen zu“,“image_fulltext_caption“:“Avocadoh\u00e4ppchen“}

Braucht uns aber eigentlich nicht weiter zu kümmern, man kanns ja im Editor an der Oberfläche einstellen.

Beitragsbilder im Beitragseditor

Hier wirds ein bisschen undurchsichtig, was die Zuordnung der img-Attribute angeht, aber ich versuchs mal der Reihe nach aufzudröseln.

Wenn man ein Bild hochlädt und in den Artikel einfügt ohne irgendwelche zusätzlichen Informationen anzugeben, sieht der img-Tag erstmal so aus:

<img src=“images/Johannisbeeren.jpg“ alt=““ />

Der alt-Tag ist zwar da, aber leer. Wenn man das korrigieren möchte ist Handarbeit angesagt. Rechter Mausklick auf das Bild, Bild anwählen und hier was eintragen:

bild_kontextmenu

Hier kann man auch eine Anzeigegrösse für das Bild einstellen, aber das nur am Rande bemerkt. Wenn man sich jetzt den img-Tag anschaut sieht man Folgendes:

<img title=“Titel der Johannisbeeren“ src=“images/Johannisbeeren.jpg“ alt=“Beschreibung der Johannisbeeren“ width=“829″ height=“1091″ />

Ah so, die Bildbeschreibung mutiert zum Alt-Text, ja guck mal einer an! Und glauben sie aber nicht, dass man die img-Attribute jetzt auch im Mediamanager sehen könnte, da sind sie nämlich nicht drin. Man kann zwar beim Einfügen eines Bildes aus der Mediathek ebenfalls Bildattribute angeben:

mediam

mediam

Aber da kommt – Überraschung! – noch was anderes dabei raus:

<figure><img title=“Mediam Titel“ src=“images/Johannisbeeren.jpg“ alt=“Mediam Beschreibung“ />
<figcaption>Mediam Beschriftung</figcaption></figure>

Ach! Wobei die figcaption dann tatsächlich unter dem eingefügten Bild angezeigt wird:

mediam_beschriftung

Alles klar soweit? Glauben sie aber nicht, dass sie das alles auch im Kontextmenü des Bildes wiederfinden, da sieht natürlich aus wie gehabt, die Beschriftung taucht hier nicht auf:

mediam_kontextmenu

mediam_kontextmenu

Ich glaube, ich habe jetzt für einen Beitrag genug Verwirrung gestiftet, wir lassen das jetzt alles mal ein wenig einwirken. Zusammenfassend sei gesagt, dass das Ratespiel um vernünftige Alt-Texte und Bildattribute in Joomla noch schlechter zu durchblicken ist als in WordPress, und das will schon was heissen!

 

Ein Blick auf die Datenbank: Content und Konsorten

Einen Überblick über die in Joomla enthaltenen Tabellen kann man hier in der Joomla Documentation zum Thema Tables finden. Da werden allerdings nur die Tabellenstruktur und die Felddefinitionen aus der Datenbank zusammengefasst und keine weitere Erklärung dazu geliefert – das meiste davon könnte man auch im phpmyadmin herausfinden. Zur Tabelle contents heißt es zum Beispiel nur lapidar: „This table is used to store the content of your Joomla! core articles.“ Ah ja. Das hätte man sich evtl. selber denken können.

Also ist es vielleicht ganz interessant, mal ein bißchen hinter die Kulissen zu gucken, aber mit über 70 Tabellen macht es einem Joomla da nicht gerade einfach. Trotzdem, fangen wir mal an.

Die Tabelle contents

Wie wir am Anfang schon gesehen haben, macht Joomla im Gegensatz zu WordPress keinen Unterschied zwischen Beiträgen und Seiten, es ist zunächst mal alles Content. Das ist auch völlig legitim, da sehr fein gesteuert werden kann, ob ein Element einen Kategorieblog, einen einzelnen Artikel, ein Modul oder sonst etwas enthalten soll.

Fangen wir mal von vorne an:

id klar, AutoIncrement und Primärschlüssel

asset_id Fremdschlüssel auf die assets-Tabelle, dazu später mehr

title auch klar, der Titel des Artikels, wie er im Frontend angezeigt wird

alias sanitized Form des Titels für die sprechende URL

introtext und fulltext: da machen wir mal einen kleinen Break und eine Erklärung.

Introtext und Fulltext

Joomla bietet eine sehr komfortable Möglichkeit, im Artikeleditor ein „Weiterlesen“-Tag an beliebiger Stelle im Text einzufügen:

weiterlesen

weiterlesen

Das hat den Effekt, dass in der Blog-Ansicht nur der Text vor dem Tag angezeigt wird und ein Button zum (eben!) weiterlesen angezeigt wird:

weiterlesen_screenshot

weiterlesen_screenshot

Was da im Hintergrund auf der Datenbank passiert, ist recht kurios. Sobald man das Weiterlesen-Tag eingefügt hat, landet der Text vor dem Tag im Feld introtext, der Rest im Feld fulltext, der Artikeltext wird also auf zwei Datenbankfelder aufgeteilt. Nimmt man das Tag wieder heraus (Editor auf Textmodus umschalten und das Tag <hr id=“system-readmore“ /> löschen), wird wieder der gesamte Text im Feld introtext gespeichert, das Feld fulltext ist dann wieder leer.

Weiter gehts mit den Feldern der Tabelle content:

state entspricht dem post_status von WordPress, hier gilt für Joomla 3.x, soweit ich das eruieren konnte:

  • 0 = unpublished
  • 1 = published
  • 2 = archived
  • -2 = marked for deletion

catid ist die ID der Kategorie und ein Fremdschlüssel auf die categories-Tabelle.

created_by ist die UserID und ein Fremdschlüssel aus der #__users-Tabelle

Dann folgen noch ein paar Timestamps, deren Feldnamen recht selbsterklärend sind, und weiter hinten als kleines Zuckerl für SEOler ein  Feld hits, in dem die Anzahl der Zugriffe auf den betreffenden Artikel hochgezählt wird.

Lassen sie sich vom Feld images nicht aufs Glatteis führen, da steht nichts weiter drin, wenn sie kein Einleitungsbild oder komplettes Beitragsbild ausgewählt haben. Bilder, die sie im Artikeleditor eingefügt haben, stehen wie in WordPress gehabt als img-tag im Beitragstext, default Pfad ist das images-Verzeichnis: <img src=“images/avocado.jpg“ alt=““ />

Na, und was seh ich da? Der alt-Text ist leer, Schlamperei! Aber das ist eine andere Baustelle, und ich wette, das Verwirrspiel um die alt-Texte ist derselbe systemimmanente Bug wie in WordPress. Aber zur Bilderverwaltung in Joomla gibts ein andermal mehr!

Haben sie auch ein Deja vu?

Mit den hier vorgestellten Feldern aus der contents wäre es schon mal ein leichtes Spiel, einen einfachen WordPress-Beitrags-Datensatz zusammenzubauen. Vielleicht ist das der Grund, warum es eine Menge Konverter von Joomla nach WordPress schon gibt, googlen sie mal nach „joomla to wordpress converter“. Der Weg von WordPress nach Joomla ist da schon steiniger, weil die Joomla-Artikel wesentlich komplexer aufgebaut sind, aber darüber habe ich mich bereits in diesem Artikel ausgelassen. Ich bleibe dran…

Damit lassen wir es mal gut sein mit der Contents-Tabelle, und werfen als nächstes einen Blick auf die Bilderverwaltung in Joomla.

 

Darf ich mal kurz vorstellen: JDatabase

Genau wie WordPress bringt auch Joomla ein eigene Logik für Operationen auf der Datenbank mit, nachlesen kann man das en Detail in der Joomla Dokumentation zum Thema JDatabase. Wir wollen uns für den Anfang mal vornehmen, bestimmte Daten aus einer Joomla-Tabelle in einem Artikel auszugeben. Zum Thema Select schauen sie mal hier in die JDatabase-Dokumentation.

Die Ausgangstabelle: contents

Wir holen uns mal zum Üben ein paar Datensätze aus der (prefix)_contents. Um das Tabellenpräfix nicht fest verdrahten zu müssen, benutzt man die eingebaute Variable #, der Select sieht dann so aus:

SELECT * FROM #__content

Das Datenzugriffsobjekt

Die folgende Syntax erzeugt ein neues Datenzugriffsobjekt in der Variablen $db:

$db = JFactory::getDBO();

Jetzt bauen wir uns eine Variable für den Select:
$query = „SELECT * FROM #__content;“;

Und weisen diese dem Datenzugriffsobjekt als Query zu
$db->setQuery($query);

Ausgeführt wird dieses Statement dann mit der Zuweisung
$result = $db->execute();

Erste Information: wieviele Datensätze wurden selektiert?

Das kommt einem doch sehr bekannt vor:

$anzahl_zeilen = $db->getNumRows();
echo $anzahl_zeilen.“ Zeilen selektiert<br>“;

Zeilenweise Ausgabe bestimmter Spalten des Select-Ergebnisses

Wir wollen ja nicht die ganze Tabelle #__contents ausgeben, sondern nur ausgewählte Spalten, ich nehme mal fürs Beispiel die ID, den Title und den Alias. Dafür holen wir uns die ausgewählten Datensätze als Liste von Objekten, durch die wir nachher einfach iterieren können:

$results = $db->loadObjectList();

In der Object List stecken die einzelnen Datensätze des Select-Ergebnisses, und deren Spalten kann man mit dem Namen ansprechen. Wir packen das Ganze wie schon oft gehabt in eine Foreach-Anweisung, das sieht dann so aus:

foreach ($results as $zeile) :
echo $zeile->id;
echo $zeile->title;
echo $zeile->alias;
echo „<br>“;
endforeach;

Ihre Ausgabe sollte jetzt so etwas in der Art gleichsehen:

liste_content

liste_content

Zugegeben, an der Formatierung ist noch einiges optimierbar, aber wir haben das Ergebnis unseres Select jetzt als Liste in den Artikel eingefügt. Doch schon mal nicht schlecht für den Anfang, darauf kann man aufbauen.

Weitere Datenbankoperationen

Zu den weiteren Operationen wie Insert, Update und Delete gibt es hier tieferschürfende Informationen:

Inserting, Updating and Removing data using JDatabase

Konnektieren zu einer externen Datenbank

Auch das ist genau wie in WordPress  möglich, nähere Informationen findet man hier:

Connecting to an external database

Damit lasse ich es mal gut sein mit den Datenbankoperationen. Jetzt wirds Zeit, mal ein bisschen die Stammdaten von Joomla zu durchforsten, und dazu gibt es einen neuen Beitrag.

 

 

Wie man Joomla eigenen PHP-Code unterjubelt: der Sourcerer

Wenn man in den Support-Foren die Frage recherchiert, wie man denn eigenen PHP-Code in Joomla unterbringt, wird man meistens mit dem Hinweis erschlagen, dass man dafür ein eigenes Modul oder Plugin schreiben sollte. Beides ist in Joomla (im Vergleich zur WordPress-Pluginprogrammierung) recht aufwändig und für meinen Geschmack zu umständlich, wenn es nur um ein paar kleine Code Snippets geht. Wer sich selber an einem Modul versuchen möchte findet hier bei OSTraining oder hier bei joomla.org recht ausführliche Tutorials zum Thema Modulerstellung.

„Kleine“ Lösung mit dem Sourcerer

Wenn ich bloß ein paar PHP-Zeilen z.B. zum Zugriff auf eine eigene Tabelle unterkriegen will, ist mir das mit den Modulen aber wie gesagt wesentlich zu umständlich. Ich suchte nach sowas wie php Code for Posts oder einer Shortcode-Funktionalität, und bin schließlich bei der Erweiterung Sourcerer fündig geworden.  Nach der Installation findet man im Beitragseditor eine neue Funktionalität „Quelltext“, die sich sehr unauffällig gibt:

quelltext

quelltext

Nach Klick auf „Quelltext“ landet man erstmal in einem Editor, der mit den Default-Einstellungen eine kleine Hilfestellung gibt, wo man den Code platzieren kann:

sourcerer_edit

sourcerer_edit

Das wars auch schon! Nach Klick auf „Füge ein“ wird der Text inklusive der {source}-Tags in den Beitrag eingefügt und kann dort auch weiter bearbeitet werden. Leider habe ich keine Option für Code Highlighting gefunden, auch wenn in der Doku steht: „Also it comes with syntax coloring (php, js, css, html)“. Macht jetzt aber erstmal nichts, ich kopiere mir meine paar Zeilen Code aus dem Notepad++ rein. Das sieht im einfachsten Fall so aus, beispielsweise mit einem simplen echo:

php_programmerl

php_programmerl

Der Output sollte ungefähr so aussehen:

screenshot_phpcode

screenshot_phpcode

Und was machen wir jetzt damit?

Wir haben ein bisschen Spaß auf der Datenbank! Es wird höchste Zeit, sich ein wenig mit JDatabase anzufreunden, aber dafür gibt es einen neuen Beitrag.

Jetzt fehlt nur noch : der Inhalt!

Im Original Inselfisch-Kochbuch gibt es über 300 Rezepte, und die will ich eigentlich wirklich nicht händisch nach Joomla  reinkopieren. Also habe ich mich mal auf die Suche nach Import-Tools gemacht, und das Ergebnis war leider äusserst mager. Genauer gesagt, da war aber auch schon gar nix brauchbares dabei, zumindest nicht im Public-Domain-Bereich.

Das einzige Tool, das anscheinend Artikel und Kategorien direkt aus der WordPress-Datenbank importieren kann ist JConverter, und der kostet 25 $, das hab ich jetzt erstmal nicht eingesehen.  Dann gibt es noch J2XML, aber da war die Dokumentation nicht besonders aussagekräftig. Es scheint aber so zu sein, dass J2XML für den Datenimport/Export zwischen verschiedenen Joomla-Sites gedacht ist, das ist jetzt auch nicht das was ich brauche.

Was heisst hier „Bulk create“?

OSContent macht Werbung damit, wieviel Zeit und Aufwand man mit ihrem Tool bei der Erstellung neuer Joomla-Inhalte sparen kann. Ich habe mir die Free-Version installiert, und das präsentiert sich dann so:

mass_content

mass_content

OSContent präsentiert sich als recht spartanisches Formular, in das man Artikeldaten per Copy&Paste einfügen kann, für bis zu 10 neue Artikel auf einmal. Man kann hier den Titel, Alias, Intro-Text und Fulltext eintragen. Für alle 10 Artikel kann man dann noch eine Kategorie, einen Menu Link und ein Access Level angeben, sowie das Erstellungsdatum setzen. Für die Schlagwörter habe ich leider keine Option gefunden. Na ja, so im Prinzip würde das schon reichen um ein paar Rezepte aus WordPress zu übernehmen…

Aber ich werd doch nicht allen Ernstes über 300 mal die Rezeptdaten händisch hier reinkopieren! Im richtigen Leben ist das der Job für den Praktikanten, wenn  man es gar nicht anders hinkriegt. Aber professionell ist das nicht, und auch nicht so wirklich praxistauglich. Das müsste doch auch anders gehen, vielleicht mit einem CSV-Import…

Gibts nicht sowas wie wp_insert-post()?

Erinnern sie sich an den kleinen CSV-Importer für den Turnverein Weiss-Blau? Der basierte auf der sehr komfortablen WordPress-Funktion wp_insert_post(), die man mit ein paar ausgesuchten Parametern füttern kann und die auch in einer sehr minimalistischen Version schon brauchbare Ergebnisse liefert.

So etwas habe ich bei Joomla bisher vergeblich gesucht. Am ehesten in der Richtung geht noch dieser Artikel bei Stack Exchange: Create categories, subcategories and articles using php

Aber da gehts schon heftig ans Eingemachte, die Erzeugung eines neuen Artikels ist bei Joomla offenbar ein absolut nicht-trivialer Prozess, das hab ich mir jetzt erstmal nicht angetan. Damit bleibt die Frage, wie ich denn meine WordPress-Beiträge ins Joomla reinkriege, erstmal offen. Ich recherchiere weiter!

Noch ein nettes kleines Modul: Zufallsbild

Da hatte ich doch glatt den Menüpunkt „Rezeptbilder als Geschenke“ unterschlagen, und weils Spaß macht, legen wir den mit dem Modul für Zufallsbilder an. Voraussetzung ist natürlich, dass man ein paar Bilder zu den vorhandenen Artikeln hochgeladen hat, die stecken dann im Verzeichnis „images“. Man kann sich aber auch ein extra Bilderverzeichnis anlegen, dann den Pfad entsprechend anpassen

Erweiterungen->Module->Neu „Zufallsbild“, bei Bilderverzeichnis images oder das eigene Verzeichnis angeben. Dem Modul einen Namen geben, speichern.

Dann einen Beitrag für das Zufallsbild aussuchen oder neu anlegen, ggf. einem eigenen Menüpunkt zuordnen. Im Beitragseditor die Option „Module“ wählen und das eben erstellte Modul einfügen – fertig!

zufallsbild

zufallsbild

Das Modul könnte man ausser in einem Beitrag natürlich auch an einer Modulposition im Layout anzeigen lassen, aber da kann jeder selber rumprobieren.

Mehr zur Bilderverwaltung in Joomla gibts später in einem eigenen Artikel.

 

Menü mit Untermenüs

Ich habe ja im Original-Inselfischkochbuch ein Untermenü bei den Kochbüchern eingerichtet, da will ich die Umsetzung nach Joomla nicht unterschlagen, damit man das Prinzip mal sieht. Auch hier gilt: viele Wege führen nach Rom, ich hab mal einen relativ simplen genommen. Ich gehe davon aus, dass schon Artikel mit einzelnen Kochbüchern vorhanden sind, falls nicht, kann man sie auch beim Erstellen der Menüstruktur anlegen.

Hauptmenüeintrag erstellen und konfigurieren

Menüs->Main Menü (oder wie es bei ihnen heißt)->Neuer Eintrag, Titel „Meine Lieblingskochbücher“, Menüeintragstyp „Systemlinks“->URL. Jetzt im Feld Link den Hashtag „‚#“ eingeben, speichern und schliessen.

Untermenüeintrag erstellen und zuordnen

Neuer Menüeintrag, Titel z.B. „Das bairische Kochbuch“, Menüeintragstyp Beiträge->Einzelner Beitrag, hier den passenden Beitrag auswählen oder neu erstellen. Rechts bei Übergeordneter Beitrag unseren Hauptmenüeintrag „Meine Lieblingskochbücher“ wählen, speichern.

Wenn man sich jetzt die neuen Menüeinträge im Main Menü anschaut, sollte es ungefähr so aussehen:

untermenu

untermenu

Und das Ergebnis im Frontend sollte etwa so aussehen:

untermenu_screenshot

untermenu_screenshot

Weitere Untermenüeinträge werden nach genau dem selben Muster hinzugefügt, mehr ist nicht dabei. Natürlich kann man den Untermenüeinträgen beliebige Inhalte zuordnen und hier zum Beispiel weitere Kategorieblogs oder dergleichen einrichten, aber das kann jeder selber ausprobieren.

Nach dem selben Muster kann man auch mehrstufige Untermenüs einrichten, also so etwas in der Art:

zweistufiges_untermenu

zweistufiges_untermenu

Mehrstufige Menüs brauche ich aber in der Praxis nicht oft, das wird bei zu tiefer Verschachtelung so unübersichtlich, dass man sich da eine andere Lösung überlegen sollte.

Breezing Forms: ein kurzer theoretischer Durchlauf

Theoretisch deswegen, weil Breezing Forms nicht mit meinem Xampp-Mailtodisk zusammenarbeitet und ich den Output nicht kontrollieren kann. Trotzdem, packma’s und schauen uns den populärsten Formulareditor für Joomla mal näher an.

Installation

Erweiterungen->Webkatalog->Breezing Forms free suchen und installieren, dann unter Komponenten->Breezing Forms die Installation vervollständigen.

Neues Formular anlegen

Unter Formulare verwalten->Neu kommt man in einen Formulareditor, und hier wirds schwer gewöhnungsbedürftig. Zuerst mal einen Titel (freie Zeichenwahl) und einen Namen (nur alphanumerisch) für das neue Formular vergeben. Dann muss man erstmal eine Seite hinzufügen, das geht mit Klick auf den „Page“-Button. Mit einem Klick auf „Element“ kann man der eben erstellten Seite 1 Formularfelder hinzufügen, die Optionen sind recht selbsterklärend. Ich belasse es mal bei einem Feld für den Namen des Absenders und einer Textarea für die Nachricht. Anschauen kann man sich das Ganze dann unter „Vorschau“. Das ist alles ziemlich unhandlich und wenig intuitiv, aber mit ein bisschen Übung wird das schon.

Neuen Menüpunkt für das Formular erstellen

Menüs->Main Menu (oder wie es bei ihnen heißt)->Neuer Menüeintrag Titel z.B. „Kontakt“, Menüeintragstyp „Breezing Forms“  Add Form. Dann unter dem Tab „Add Form“ den Namen des Formulars eintragen. Das sollte es gewesen sein, mit etwas Glück sieht das jetzt ungefähr so aus:

evi_kontaktformular

evi_kontaktformular

Anmerkung: wenn man das Formular in einen Beitrag anbinden will, braucht man zusätzlich das Breezing Forms Plugin, Info dazu gibts hier bei Crosstec.

Glitch oder Feature?

Ich hatte bei der Vergabe eines eigenen Formularnamens das Problem, dass die Anzeige nicht funktionierte „evisformular could not be found“. Wenn ich dann in der Formularverwaltung nachgeschaut habe, stand der Formularname wieder auf dem von Breezing Forms automatisch vergebenen Namen „QuickForm231612383“ drin, mit dem funktionierte es dann auch. Möglicherweise ein Glitch wegen der nicht ganz perfekten Installation auf dem neuen Xampp, vielleicht auch ein Feature  – sehr unbefriedigend, ich gebs zu, aber immerhin gibt es einen Workaround.

Fazit:

Wenn man sich mal an den etwas unhandlichen Formulareditor gewöhnt hat, läßt Breezing Forms keine Wünsche offen, es läßt auch die Erstellung komplexer mehrseitiger Formulare zu und bietet unzählige Konfigurationsoptionen. Eingehende Nachrichten werde auch automatisch mitprotokolliert, die kann man sich unter Komponenten->Breezing Forms-> Einträge verwalten anzeigen lassen, das gefällt mir dann doch sehr gut. Zugegeben, in Contact Form 7 ist das alles ein bisschen intuitiver, aber die Funktionsvielfalt von Breezing Forms ist schon beeindruckend.

Jedenfalls haben wir jetzt auch unser simples Kontaktformular mit recht wenig Aufwand realisiert, und dabei lassen wir es für heute.

Erweiterungen installieren: kleines Beispiel

Da fehlte doch noch was im Joomla-Inselfischkochbuch: das Zufallsrezept geht noch ab! Kurzes Googlen ergab, dass „Random Article“ von Artur Alves genau das können sollte, was ich brauchte. Also los:

Erweiterung installieren

Erweiterungen->Verwalten-> Installieren, hier sollte man sich bequemerweise den Tab „Aus Webkatalog installieren“ aktivieren, dann gehts genauso wie in WordPress mit dem Plugin-Verzeichnis. Erweiterung mit dem Namen suchen, wenn man die richtige gefunden hat wird man vom Assistenten durch die Installation geführt.

Modul anlegen

Mit Erweiterungen->Module->Neu->Random Article kann man sich jetzt ein eigenes Modul für den zufällig ausgewählten Artikel anlegen. Unter „Article Source Options“ wählt man sich die Kategorie aus, aus der der Zufallsartikel kommen soll, man könnte hier auch Subkategorien einbeziehen, aber die habe ich (noch) nicht. Namen für das Modul vergeben, darf ruhig „Zufallsrezept“ heissen, speichern.

Neuen Menüeintrag und Beitrag anlegen

Viele Wege führen in diesem Fall nach Rom, ich packe das neue Modul wieder in einen eigenen Beitrag und ordne diesem einem Menüeintrag zu.

Menüs->Main Menu->Neuer Menüeintrag-> Name „Zufallsrezept“, Menüeintragstyp einzelner Beitrag, den kann man hier gleich neu anlegen. Im Beitragseditor die Option Module anklicken und hier unser eben neu erstelltes Modul auswählen, beliebigen Text dazuschreiben, speichern und fertig. Wenn alles richtig geklappt hat, steht im Editor jetzt ungefähr sowas:

{loadmodule mod_random-article,Zufallsrezept}

Das kann man sich schon mal merken, diese Syntax wird uns noch öfter begegnen. Das wars jetzt aber auch schon, wir haben unser Zufallsrezept jetzt auch eingebaut.

Meckerpunkt am Rande: die Erweiterungs-Verwaltung

Wenn man unter Erweiterungen->Verwalten sowas wie den Pluginmanager erwartet, guckt man zuerst mal ganz schön, da springen einem neun Seiten mit mehr oder weniger kryptischen Einträgen entgegen. Weil hier nämlich auch die systeminternen Erweiterungen, Module und Komponenten mit angezeigt werden, und da fasst man tunlichst erstmal gar nichts an. Benutzerfreundlich ist das nicht, hier hätte ich mir eine übersichtlichere Lösung gewünscht!

 

 

 

Beitragskategorien aus der Datenbank abfassen

Für Spitzenklöppler: das WordPress-Kategorienmodell

Um an die Beitragskategorien heranzukommen, muss man sich mit sage und schreibe 5 Tabellen herumschlagen. Das kommt daher, weil die WordPress-Entwickler das Kategorienmodell unbedingt mehrstufig anlegen mussten. Das ist zwar wunderbar verschachtelbar und ergibt ganz eindrucksvolle Baumstrukturen, aber datenverarbeitungstechnisch ist es meiner Meinung nach mit Kanonen auf Spatzen geschossen. Mit einer winzigen Ausnahme (die Backrezepte im Inselfisch-Kochbuch) habe ich noch in keinem meiner Blogs eine Unterkategorien-Ebene gebraucht, und damit das hier nicht allzu unübersichtlich wird, lasse ich es auch bei der einen Ebene. Haben sie ein bißchen Zeit? dann wollen wir mal.

Die relevanten Tabellen

Erstens natürlich die wp_posts, aus der holen wir uns die ID, also den Primärschlüssel der Beiträge. Dann brauchen wir noch:

  • wp_term_relationships
  • wp_term_taxonomy
  • wp_terms
  • (wp_termmeta, nein, die brauchen wir nicht, nur der Vollständigkeit halber erwähnt)

Warum das ganze mit Term und nicht mit Category bezeichnet ist: rein theoretisch kann man sich auch noch eigene Taxonomien anlegen, die dann eben nicht Kategorie heissen sondern einen eigenen Namen kriegen. Sowas hab ich anno Dunnerkeil mal in meinem Bilderblog gemacht, da gabs eine eigene Taxonomie „Jahreszeiten“, die bestand aus genau vier Einträgen, nämlich „Frühling, Sommer, Herbst, Winter“. Bin ich wieder davon abgekommen, ich hab die Jahreszeiten einfach in die erste Kategorieebene mit aufgenommen, geht auch und ist wesentlich einfacher zu verwalten. Aber das nur am Rande bemerkt, wir holen uns die Tabellen jetzt mal ins Access rein und basteln uns die nötigen Verknüpfungen.

Das Datenmodell im Detail

Die ersten beiden Tabellen: wp_term_relationships und wp_posts

Wichtig ist hier erstens die object_id, das ist die ID des Beitrags aus der wp_posts. Einem Beitrag können ja mehrere Kategorien zugeordnet sein, deshalb tauchen die IDs hier auch mehrfach auf. Die term_taxonomy_id verweist auf die Kategorie. Die term_order könnte man für eine benutzerdefinierte Sortierung der Kategorien verwenden, aber das geht jetzt zu weit, das lassen wir weg.

screenshot_term_relationships

screenshot_term_relationships

Wir basteln uns also die erste Verknüpfung mit der object_id auf die wp_posts.

screenshot_beziehnungen_posts_relationships

screenshot_beziehnungen_posts_relationships

Die dritte Tabelle: wp_terms_taxonomy

Hier wird es schon ein bißchen undurchsichtiger. Die ersten drei Felder ID, term_taxonomy_id und term_id haben alle den selben Wert, da kann man nur raten wofür welches gut ist. Da wir nur die term_taxonomy_id aus der wp_term_relationships eindeutig zuordnen können, nehmen wir die halt, und merken uns als Hauptschlüssel die ID. Im Feld taxonomy steht immer der Wert category, wir haben ja nur diese eine Taxonomie, das können wir auch weglassen. Interessanter wäre da noch das Feld „parent“, das die übergeordnete Kategorie im Falle verschachtelter Kategorieebenen enthält, aber auch das lassen wir mal aussen vor, sonst blickt hier kein Schwein mehr durch.

Kleine Kuriosität am Rande: hier wird ein count mitgeführt, der die Anzahl der Beträge zu einer Kategorie wiederspiegelt. Kann man das nicht nachher im Rahmen einer Abfrage berechnen?

screenshot_term_taxonomies

screenshot_term_taxonomies

Unsere Beziehungen sollten jetzt so aussehen:

screenshot_beziehungen_3

screenshot_beziehungen_3

Die vierte Tabelle: wp_terms

Na gottseidank, da blickt man wenigstens halbwegs durch. Die term_id können wir aus der wp_term_taxonomy zuordnen, der name (na endlich!) ist der Name der Kategorie, slug ist auch klar, und die term_group ignorieren wir einfach.

screenshot_wp_terms

screenshot_wp_terms

Jetzt kommt endlich Butter bei die Fische, wir können unsere Beziehungen vervollständigen.

screenshot_beziehungen_4

screenshot_beziehungen_4

Haben wir da nicht noch was vergessen?

Die Tabelle wp_termmeta

Ja, die gibts auch noch, aber ehrlich gesagt weiß ich nicht so ganz genau, wofür man die verwenden könnte, die zieht nur wenn man mit mehreren Taxonomien arbeitet. Bei marketpress gibt es eine gelehrte Abhandlung dazu, ich hab sie allerdings nicht ganz verstanden, muss ich zugeben. Nachdem die Tabelle allerdings bei mir immer leer ist, ignoriere ich sie schlicht und ergreifend.

Sonst noch was? Ach ja, ich hätts beinah vergessen:

Die Tags = Schlagwörter stecken in der selben Logik

Und zwar wird für die Schlagwörter eine eigene Taxonomie „post_tag“ angelegt. Ich verwende prinzipiell keine Schlagwörter, wenn sie es getan haben lassen sie sich nicht irritieren, uns reichen die Beziehungen über die Kategorien.

Und jetzt: die Abfrage der Kategorien über alle vier Tabellen

Anmerkung: damit das hier nicht total uferlos wird, beschränke ich mich hier auf eine Kategorieebene. Sie sehen gleich, warum: Wir holen uns zunächst mal eine Auswahl relevanter Daten aus allen vier Tabellen, der SQL sieht dann so aus:

SELECT wp_posts.ID, wp_posts.post_title, wp_term_relationships.object_id, wp_term_relationships.term_taxonomy_id AS wp_term_relationships_term_taxonomy_id, wp_term_taxonomy.term_taxonomy_id AS wp_term_taxonomy_term_taxonomy_id, wp_term_taxonomy.term_id AS wp_term_taxonomy_term_id, wp_term_taxonomy.taxonomy, wp_term_taxonomy.count, wp_terms.term_id AS wp_terms_term_id, wp_terms.name
FROM wp_terms INNER JOIN ((wp_posts INNER JOIN wp_term_relationships ON wp_posts.[ID] = wp_term_relationships.[object_id]) INNER JOIN wp_term_taxonomy ON wp_term_relationships.[term_taxonomy_id] = wp_term_taxonomy.[term_taxonomy_id]) ON wp_terms.[term_id] = wp_term_taxonomy.[term_id];

Das Ergebnis: eine schon mal relativ übersichtliche Tabelle

Hier taucht jedes Rezept so oft auf, wie es Kategorien zugeordnet hat. Wenn wir jetzt ausser den Kategorien noch Schlagwörter mit drin hätten, müssten wir die herausfiltern, aber haben wir nicht, alles brav nur Kategorien.

screenshot_kategorien_rohdaten

screenshot_kategorien_rohdaten

Ein kleiner Kunstgriff: die Abfrage auf der Abfrage

Damit ich mir keinen Wolf parametrisiere, habe ich einfach auf die eben gezeigten Rohdaten (die Abfrage heisst auch kategorien_rohdaten) eine zweite Abfrage aufgesetzt, die ist schon übersichtlicher:

SELECT Count(kategorien_rohdaten.[ID]) AS AnzahlvonID, kategorien_rohdaten.[name]
FROM kategorien_rohdaten
GROUP BY kategorien_rohdaten.[name];

Auf Deutsch: ich zähle nur die Beitrags-IDs zu jeder genannten Kategorie, und fasse pro Kategorie die Summe zusammen. Das Ergebnis:

screenshot_kategorien_endergebnis

screenshot_kategorien_endergebnis

Na bitte, geht doch 🙂

Nur noch ein kleiner Glitch ist drin: die Summe beim Backwerk stimmt nicht. Das kommt daher, dass ich bei den Backwerken drei Unterkategorien angelegt habe, nämlich „Kuchen und Torten“, „Weihnachtsbäckerei“ und „Pikante Bäckereien“. Allerdings erlaubt es einem WordPress beim Erstellen oder Bearbeiten eines Beitrags, eine Unterkategorie anzugeben ohne auch die übergeordnete Hauptkategorie anzukreuzen, das habe ich offensichtlich einige Male gemacht, und daher stammt der Zählfehler. Die Korrektur ist einfach: ich entferne die Kategorie Backwerk und behandle die drei Unterkategorien wie Kategorien erster Ordnung, mein Excel für das Tortendiagramm kann mit Unterkategorien eh nix anfangen 🙂

Ich überlasse es jedem, der mit mehr als einer Kategorieebene gearbeitet hat selber, da die Logik entsprechend rauszupfriemeln, da muss man in der wp_terms_taxonomy den parent berücksichtigen, das ist mir jetzt hier zuviel Gedöns. Das hier langt jetzt nämlich echt für einen Beitrag, der hier ist lang genug – schließlich ist ja schon fast Feiertag!