WordPress-Kategorien als Drupal-Tags importieren

Bevor ich jetzt anfange, noch mehr Rezepte und Kategorien per Hand einzuhacken, schauen wir mal gleich, wie weit wir damit kommen diese aus WordPress zu importieren. Das wird eine ganz ähnliche Mechanik wie in Joomla werden, soviel kann ich jetzt schon absehen. Aber jetzt erstmal Schritt für Schritt. Und eine Warnung vorneweg: sowas macht man als Initial Load auf einer jungfräulichen Drupal-Instanz, wenn schon per Hand Kategorien als Tags angelegt wurden, hat man leicht doppelte Einträge und muss das dann erstmal bereinigen. Übrigens: kommen sie nicht auf die Idee, bereits vorhandene Tags einfach mit dem phpmyadmin aus der Datenbank zu löschen, das führt ganz schnell zu Inkonsistenzen!

Voraussetzungen

Wir ignorieren mal die Möglichkeit der geschachtelten Tags, die brauche ich nicht wirklich, eine Ebene reicht. Ich benutze auch das bereits vorhandene Vokabular Tags, das hat bei mir die vid=1. Die vorhandenen Taxonomien und vids sind  nachzuschauen in der Tabelle taxonomy_vocabulary, die zugehörigen Vocabulary-Einträge stecken in der taxonomy_term_data.

Ich brauche meine Kategorien zum Import in einer kleinen Tabelle, die hole ich mir aus Access und schubse sie als CSV nach MySQL rein.

Eine sehr praktische Funktion zum Import

Für den tatsächlichen Import benutze ich dann die Drupal-Funktion taxonomy_term_save($term). Die nimmt als Minimum-Parameter den Namen des Tags und die vid der Taxonomie, das sieht im ersten Testfall so aus:

    $name = 'Testwort2';
    $vid =1;
    $term = new stdClass();
    $term->name = $name;
    $term->vid = $vid;
    taxonomy_term_save($term);
    echo "Neuer Term erzeugt, ID = ".$term->tid;

Wichtig zu wissen: die Funktion erzeugt  immer einen neuen Eintrag in der taxonomy_term_data mit einer neuen tid, auch wenn der Name des Tags schon mal drinsteht. Ich gehe hier aber mal von einem Initial Load aus bzw. lösche vor dem Import die bereits vorhandenen Terms, die ich zum Testen manuell reingehackt habe, einfach raus.

Jetzt kommt unsere Import-Tabelle 00_kat_import ins Spiel, an der ist nicht viel dran, nur id und name, und die kennen wir auch schon:

kat_import_tabelle
kat_import_tabelle

Die lesen wir uns jetzt mit einem  db_query ein und speichern unsere neuen Terms in der Foreach-Schleife:

$query = db_query("SELECT name FROM 00_kat_import");
    $records = $query->fetchAll();
    
foreach ($records as $record) {
  
    // echo $record->name."<br>";
    $name = $record->name;
    $vid =1;
    $term = new stdClass();
    $term->name = $name;
    $term->vid = $vid;
    taxonomy_term_save($term);

  
} //end foreach

Und das war auch schon der ganze Zauber! Da sind die neuen Tags:

import_tags
import_tags

Diese Aktion macht man wie gesagt genau einmal als Initial Load. Wenn die Kategorien erstmal auf die Tags abgebildet sind, werden sie in Drupal weitergepflegt, sonst gibts allzuleicht Inkonsistenzen auf der Datenbank.

So, die Kategorien hätten wir schon mal. Jetzt bräuchten wir noch ein paar Rezepte…

Inhaltsverzeichnis A-Z mit Links

Ich hatte im ersten Ansatz die Funktion drupal_get_path_alias($node) verwendet, noch g’wandter aber gehts mit url($node). Da die gesamte Inhaltsverzeichnis-Funktion nicht besonders kompliziert ist, hier mal der komplette Code:

function ivz_kompakt(){
    
    $alfa = array(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z);
    foreach ($alfa as $akt_buchstabe){
    
            $buchstabe = $akt_buchstabe;
            
            $anzahl = db_query("SELECT nid, title, type, status from node where title like '".$buchstabe."%' order by title");
            $records = $anzahl->fetchAll();
            $gefunden = count($records);
            
            if ($gefunden == 1) {
            echo "<h2>".strtoupper($buchstabe)." ".$gefunden." Rezept</h2><br>";
            }
            
            if ($gefunden > 1) {
            echo "<h2>".strtoupper($buchstabe)." ".$gefunden." Rezepte</h2><br>";    
            }
            
            if ($gefunden > 0){
                        
                foreach ($records as $record) {
            
                      $akt_id = $record->nid;
                      //echo $record->title."<br>";
                      $url = url('node/' . $akt_id);
                      //echo $url."<br>";
                      echo "<a href = '".$url."'>".$record->title."</a><br>";
                                        
                } //end foreach
            } // end gefunden > 0
    }    // end alfa
    
} //end function ivz_kompakt

Was hab ich gemacht? Ich bastel mir zuerst mal ein Array mit allen Buchstaben des Alfabets. Durch dieses Array steppe ich mit einem foreach durch, und der aktuelle Buchstabe kommt jeweils in unsere Query, und mit count() wird die Anzahl der gefundenen Datnsätze abgefragt:

 $anzahl = db_query("SELECT nid, title, type, status from node where title like '".$buchstabe."%' order by title");
$records = $anzahl->fetchAll();
            $gefunden = count($records);

Dann frage ich mit if ab, ob einer oder mehr als ein Artikel gefunden wurde und gebe dementsprechend aus „1 Rezept“ oder „X Rezepte“.
Wenn ich mehr als 0 Beiträge mit meiner Query gefunden habe, steppe ich durch diese wieder mit einem foreach durch. Ich hole mir mit der nid aus der Query die URL des aktuellen Beitrags:

$akt_id = $record->nid;
$url = url('node/' . $akt_id);

Und bastle mir daraus den Link zum Rezept.

echo "<a href = '".$url."'>".$record->title."</a><br>";

Das wars! Ich hab jetzt mal in der Query noch nicht die Einschränkung auf Where status=1 und type = blog gemacht, weil ich ein bisschen Material zum Ausgeben haben wollte und so einfach alle Nodes alfabetisch ausgebe, die Where-Klausel kann sich jeder selber anpassen. Mein Output sieht ganz sauber so aus:

ivz_kompakt
ivz_kompakt

Schicke Sache, nicht wahr? Das ist 1:1 mein Inhaltsverzeichnis wie im Original-Inselfisch-Kochbuch. Jetzt lege ich mir noch einen neuen Menüpunkt vom Typ einfache Seite an, stelle den Textfilter auf PHP-Code und platziere dort meinen Funktionsaufruf:

<?php ivz_kompakt();?>

Fertig! Also, ich muss sagen, das mit dem Einbinden eigener Funktionen über das simple Modul nach diesem Muster macht einem die Arbeit echt einfach, das gefällt mir sehr gut.

Jetzt wärs natürlich schick, wenn wir mehr Rezepte zum Ausgeben hätten, aber ich hack die nicht per Copy&Paste rein. Ich geh mal suchen, wie es mit den Import-Fähigkeiten von Drupal aussieht, und melde mich dann wieder mit einem neuen Beitrag.

 

Da macht es einem Drupal einfach: die erste Datenbankabfrage

Wir schreiben uns jetzt eine Funktion, die die node-Tabelle abfragt und ein paar basic Daten ausgibt. Das sieht im ersten Ansatz ganz einfach so aus:

$query = db_query("SELECT nid, title, type, status FROM node");
$records = $query->fetchAll();

Mit db_query kann man einen ganz straighten statischen Select absetzen, mehr dazu hier in der Drupal-Dokumentation. Der fetchall() ist auch ganz geradlinig, ich zitiere:

// Retrieve all records into an indexed array of stdClass objects.
$result->fetchAll();

Über das $records-Array kann man jetzt ganz normal mit einem Foreach iterieren:

foreach ($records as $record) {

  echo $record->nid;
  echo $record->type;
  echo $record->status;
  echo $record->title."<br>";
  
}


Das gibt eine (unformatierte) Liste der selektierten Felder aus:

simpelselect
simpelselect

Ist noch nicht besonders schön, hat aber Potential. Was lernen wir daraus, die Erste:

  • der Status ist hier immer 1, das steht für published, 0 wäre unpublished
  • wir haben die Typen page, article und blog

Für das Inhaltsverzeichnis wollen wir natürlich nur den Typ blog und den Status 1, das kommt in die Where-Klausel. Jetzt wollen wir aber auch einen Link zum Rezept, und dazu brauchen wir im Zweifelsfall den Alias-Pfad. Den holen wir uns mit der eingebauten Drupal-Funktion drupal_get_path_alias(). Die möchte mit node/[nid] gefüttert werden, wobei nid natürlich die ID des entsprechenden Nodes ist. Ich packs mal in unsere Foreach mit rein:

foreach ($records as $record) {
  
  echo $record->nid;
  
  $akt_id = $record->nid;
  
  echo $record->type;
  echo $record->status;
  echo $record->title."<br>";
  
  $alias = drupal_get_path_alias('node/'.$akt_id);

  echo $alias."<br>";
  
} 

Damit kriegen wir bei den Nodes, für die ein textueller Pfad vergeben wurde, diesen auch angezeigt:

node_pfad
node_pfad

Daraus können wir uns später die Links auf die Rezepte konstruieren. Jetzt muss ich mir erstmal überlegen, wie ich die Logik für das schön strukturierte Inhaltsverzeichnis nach Drupal portiert kriege, aber ich hab da schon einen Plan. Mehr dazu im nächsten Beitrag.

Wie man Drupal eigenen PHP-Code unterschiebt

Das ist sehr einfach und nahezu überall möglich, man muss nur unter Module den PHP Filter aktivieren. Dann bekommt man bei den Editoroptionen unter Textformate die Option PHP-Code:

textformat_php_code
textformat_php_code

Und das wars auch schon. Beliebigen Code eingeben, php-Tags nicht vergessen:

<?php echo „Hallo Welt!“; ?>

Produziert die erwartete Ausgabe:

php_hallo_welt
php_hallo_welt

Weder besonders aufregend noch besonders handlich, das ist nicht besser und nicht schlechter als der Sourcerer in Joomla. Für wenige Codezeilen tuts das, für längere Scripte ist es völlig untauglich. Aber ich bin durch fleissiges Googlen auch auf einen eleganteren und doch simplen Weg gekommen, eigene PHP-Funktionen in Drupal einzubinden. Dazu basteln wir uns:

Das erste eigene Modul

Ich habe mich an diese Anleitung hier von BobbyMods gehalten, die Sache aber noch ein bisschen weiter vereinfacht. Um ein eigenes Modul zu erstellen, braucht es nicht viel. Man erzeugt ein neues Unterverzeichnis unter sites->all->modules und benennt es z.B. mit „myfunctionlib“. Da hinein kommen zwei Dateien, eine namens myfunctionlib.info, die enthält folgenden Code:

name = My Function Library
description = This module contains my PHP helper functions.
core = 7.x
package = "MyFunctions"
version = "7.1-1.1"

Dann brauchen wir noch die Datei myfunctionlib.module, die sieht ganz stark vereinfacht so aus:

<?php
/**
* Function Description
* @param function_parameter
* @returns function output description
*/

function sayhello($name){
    echo "Hallo liebe ".$name;
}

Wir haben nur eine Function namens sayhello(), die hat einen Parameter, den Namen. Jetzt mussen wir nur noch unser:

Modul aktivieren

es taucht nämlich unter Module bereits auf:

modul_myfunctions
modul_myfunctions

Wenn das passiert ist, hat man Zugriff auf die eigenen Funktionen, ich kann dann auf einer Seite beispielsweise meine sayhello-Funktion aufrufen (Textformat auf PHP Code stellen nicht vergessen):

<?php sayhello(„Evi Silvia“); ?>

Und der Output ist wie erwartet:

sayhello
sayhello

Das eröffnet natürlich jede Menge Möglichkeiten, ganz ähnlich wie die geniale PHP-Bridge für Joomla. Jetzt können wir, ich schau mal wie weit ich mit meinem schöner formatierten Inhaltsverzeichnis komme, aber dazu gibt es einen neuen Beitrag.

Nachtrag: Kategorienliste mit Anzahl der Rezepte, und das IVZ V.0

Der Weg zur Kategorienliste mit der Anzahl der Rezepte war noch unvollständig. Das machen wir auch mit Views, ich schau mal dass ich es nachvollziehbar aufschreibe:

Struktur->Views->Add new->Namen vergeben, Anzeigen Taxonomie Begriffe of type Tags

Create a Block, Items per Page nehm ich mal 30 (brauch ich später noch), Continue & Edit.

Block Details->Advanced->Relationships->Taxonomie-Begriff Content with term, Use Aggregation

Fields->Inhalt (Titel)->Aggregation Type Count Distinct, im nächsten Fenster das Feld Bezeichnung leer machen.

Speichern. Block auf gewünschte Position setzen.

anzahl_kategorien
anzahl_kategorien

Wichtige Ergänzung: leere Kategorien ausblenden

Damit man Kategorien, die noch keinem Inhalt zugeordnet sind, nicht mit einem Kategoriename 0 angezeigt bekommt, kann man noch einen zweiten Eintrag unter Relationships hinzufügen, und zwar:

(Beitrag) Inhalt: Taxonomy terms on node

Dann muss man noch in Configure Relationship die Option

 

anhaken, und das wars.

Noch etwas Kosmetik

Es wäre jetzt natürlich schöner, wenn die Zahlen hinter dem Kategorienamen stehen würden statt in der nächsten Zeile darunter. Dazu in der View unter Format Anzeigen Fields Einstellungen bei den beiden Inline Fields Häkchen setzen:

inline_fields
inline_fields

So, das wars jetzt aber. Mein Block mit den Rezept-Kategorien sieht jetzt so aus:

distinct_rezeptkategorien
distinct_rezeptkategorien

Das kann so bleiben!

Als nächstes kommt das Inhaltsverzeichnis dran:

Alle Rezepte A-Z

Wir setzen auch da mal mit Views an.

Neue View hinzufügen, Name z.B. IVZ, Anzeigen Inhalt of Type Blogeintrag, Create a page, Seitentitel z.B. Rezepte A-Z, Pfad rezepte-a-z. Items to Display 300 (brauchen wir später noch). Create a Menu Link, Continue&Edit.

Anzeigen->Inhalt->Fields -> Apply, Inline Fields Inhalt:Titel anhaken.

Sort Criteria Post Date entfernen, Sort Criteria hinzufügen Inhalt:Titel,  (asc) ist default, kann man lassen. Apply. Speichern.

Das sollte einen neuen Menüeintrag erzeugen, in dem alle Rezepte alfabetisch aufgelistet werden:

ivz
ivz

Das ist zwar mal ein Anfang, aber so richtig schön ist es noch nicht. Es wäre viel hübscher, wenn die Anfangsbuchstaben und die Anzahl der Rezepte pro Buchstaben in der Liste auftauchen würden, aber das, so fürchte ich, wird nicht so einfach, jedenfalls nicht ohne ein bisschen Programmierung. Da wollen wir Drupal mal auf den Zahn fühlen, wie sowas gehen könnte – in einem neuen Beitrag.

Weiter gehts mit den Inhalten

Die neuesten Rezepte

Jetzt fehlt auf jeden Fall noch die Anzeige der letzten eingestellten Rezepte, dafür gibt es einen Block „Neueste Blogbeiträge“, den schubse ich mal in die zweite Sidebar. Ich hab ihn umbenannt in „Die neuesten Rezepte“ und auf 10 anzuzeigende Einträge gestellt. Es sind erst fünf Rezepte im Blog, das stimmt schon so.

neueste_rezepte
neueste_rezepte

Was machen wir als Nächstes?

Das Kontaktformular

Das klappt in Drupal ohne weiteres mit Bordmitteln. Unter Module Contact aktivieren, dann kann man unter Struktur->Kontaktformular die Grundeinstellungen konfigurieren. Dann unter Menüs->Link hinzufügen einen neuen Menüpunkt z.B. namens Kontakt anlegen und als Pfad contact eingeben, das wars schon. Das sieht dann so aus:

kontaktformular
kontaktformular

Das tuts auch für meine Zwecke erstmal völlig, jedenfalls vorläufig. Über Formulareditoren für Drupal wird es einen eigenen Beitrag geben, da muss ich noch etwas recherchieren. Jetzt gibts erst mal:

Das Zufallsrezept

Auch das habe ich mit Views hingepfriemelt, mal sehen ob ich es nachvollziehen kann:

Struktur->Views->Add new View, Namen und Pfad vergeben, Anzeigen Inhalt of type Blogeintrag.

Create a page, Items to display 1, Continue&Edit.

Sort Criteria Inhalt entfernen. Sort Criteria hinzufügen Global Random, Speichern

Mit Struktur->Menüs->Link hinzufügen die eben erstellte Seite mit dem Pfad hinzufügen.

Das müsste es eigentlich gewesen sein! Jetzt fehlt nur noch eine Funktionalität „Zufallsrezept neu laden“, da muss ich mal gucken ob ich das noch hinkriege. Man kann ja auch einfach F5 drücken…

Zwischenbemerkung: ich brech dann doch mal eine Lanze für Views

Auch wenn ich noch im Stadium des Herumprobierens bin und die meisten Sachen nur mit viel Trial&Error hinkriege: Views ist ein mächtiges Werkzeug, damit macht Drupal gleich doppelt so viel Spaß! Es braucht eben doch eine längere Einarbeitung, aber für einen alten Datenbanker ist es dann doch nicht gar so schwer zu erraten, was sich hinter vielen der Optionen versteckt, ein Order by oder Group by oder was auch immer, da kommt man schon drauf wenn man sich etwas damit beschäftigt.  Dolles Ding!

 

 

Ohne Views geht anscheinend gar nichts

Ich bin bei meinen Recherchen jetzt schon das x-te Mal darüger gestolpert, dass bestimmte Funktionalitäten in Drupal offenbar nur über das Modul Views zu realisieren sind. Hab ich ja prinzipiell erstmal nix dagegen, aber mir scheint doch dass hier mit Kanonen auf Spatzen geschossen wird. Um Views zu installieren, muss man erstmal die CTools Chaos Tool Suite herunterladen installieren und aktivieren, darauf kann man dann Views für Drupal 7 aufsetzen. Ich habe auf die Schnelle keine einfache Installationsanleitung gefunden, das ging jetzt ziemlich mit Trial and Error. Hat man beide Module installiert, gibt es unter Struktur einen oder mehrere neue Einträge, für den Anfang ist mal nur Views interessant.

Wir basteln mal einen ersten View

Wir probierens mal mit „Add new View“ und sehen, wie weit wir kommen. Ich möchte jetzt gerne eine Liste meiner Kategorien sehen.  Dafür wähle ich im Feld Anzeigen „Taxonomiebegriffe“ und by of Type „Tags“.

Ich möchte einen Block erstellen, deswegen kommt das Häkchen bei Create Page raus und bei Create Block rein, die Anzahl der Items to Display stelle ich auf 10. Nach Save&Exit siollte unter Struktur->Blöcke unser neuer Block namens Kategorien auftauchen, den positioniere ich mal in die zweite Sidebar. Das sieht dann so aus:

katliste_sidebar
katliste_sidebar

Schon mal kein schlechter Anfang! Klick auf eine Kategorie öffnet eine Liste der zugehörigen Rezepte, das ist ja eigentlich schon mal ganz gut. Ich hätte jetzt aber gerne noch die Anzahl der zugeordneten Rezept bei jeder Kategorie stehen, und dafür muss ich mal ein bisschen abtauchen.

Erst die gute Nachricht?

Ich habs hingekriegt, das sieht jetzt so aus:

kategorien_anzahl
kategorien_anzahl

Die schlechte Nachricht: ich kanns noch nicht wirklich nachvollziehbar darstellen, das war jetzt Stochern im Views-Nebel mit einer sehr langen Stange. Wer sich selber dran versuchen möchte, dem kann ich diese beiden Artikel empfehelen:

http://www.espend.de/projekte/artikel/drupal-tags-taxonomie-terms-als-liste-mit-anzahl-nodes-ueber-views-ausgeben.html

https://www.drupal.org/node/603868#comment-4421144

Ich lass es hier mal für heute gut sein, das Views-Konzept ist zu komplex, um es so mal auf die Schnelle darzustellen. Man kann sicher irre viel damit machen, aber genauso irre ist die Vielzahl an Optionen und Konfigurationsmöglichkeiten, da brauchts eine längere Lernkurve dafür. Aufgehoben ist aber nicht aufgeschoben, ich schau mir das Ganze später nochmal an, und dann gibts eine Schritt-für-Schritt Anleitung… hoffe ich zumindest 😉

Blog für Rezepte, Kategorien als Tags

Ich habe mich dafür entschieden, meine Rezepte als User Blog darzustellen. Dafür muss man zunächst unter Module das Modul Blog aktivieren.

blog_aktivieren
blog_aktivieren

Dann findet sich unter Inhalte hinzufügen der neue Inhaltstyp Blog-Eintrag. Wir verfassen mal kurz ein paar Rezepte vom Typ Blog-Eintrag,  dabei nur bei den Veröffentlichungseinstellungen das Häkchen bei Auf der Startseite anzeigen herausnehmen, alle anderen Optionen können bleiben wie sie sind.

Eigenen Menüpunkt für den Blog anlegen

Unter Struktur->Menüs->Hauptmenü->Link hinzufügen, Namen vergeben z.B. Alle Rezepte, bei Pfad blog eintragen. Das erzeugt einen neuen Karteireiter, unter dem die Blogeinträge chronologisch angezeigt werden.

weblog
weblog

Hier sieht man gleich, dass man die Option mit der Zusammenfassung nutzen sollte, weil Drupal sonst den Teaser-Text auf eine bestimmte Anzahl Zeichen beschneidet, und das ist nicht immer schön. Alternativ kann man auch im Sourcecode des Beitrags den sogenannten Teaser-Break einfügen <!– break –> und damit steuern, wo der Beitrag geteilt wird.

Für meine Zwecke ist keine dieser Lösungen ideal, weil ich als Teaser-Text zwar die Einleitung verwenden könnte (jedes meiner Rezepte hat einen Einleitungstext), aber diese wird dann in der Gesamtansicht des Rezeptes nicht mehr mit angezeigt. Das heißt, eigentlich müsste ich einen extra-Zusammenfassungstext verfassen und die Einleitung im Body lassen, aber das ist mir echt zu viel Aufwand. Ich lass es mal so wie es ist, und kümmere mich mal um die:

Kategorien?

Drupal bringt eine eigene, recht ausgefeilte Logik für Tags und dergleichen mit, zu finden unter Struktur->Taxonomien. Hier ist eine Taxonomie für Tags vordefiniert, man könnte aber auch eigene Taxonomien mit Vokabular hinzufügen anlegen. Das ist fein, weil man für jeden Inhaltstyp eine eigene Taxonomie anlegen könnte, zum Beispiel auch für die Kochbücher z.B. eine Schlagwortliste.

Ich bleibe aber mal bei den vordefinierten Tags, die tun es nämlich für meine Zwecke. Ich werde wieder meine einstufige flache Hierarchie von WordPress-Kategorien auf die Tags abbilden. Verschachtelungen sind zwar möglich, ich brauche sie aber nicht.

Sie können gleich unter Struktur->Taxonomie->Begriffe hinzufügen ein paar Kategorien anlegen, das ist aber auch „on the fly“ im Beitragseditor möglich. Zuvor muss man allerdings den Inhaltstyp Blogeintrag erweitern, das geht unter Struktur->Inhaltstypen-Blogeintrag->Felder verwalten, hier kann man unter Vorhandenes Feld hinzufügen Referenz auf Taxonomie-Begriffe auswählen, ich benenne es mal mit Kategorien.

taxonomie_kategorien
taxonomie_kategorien

Wenn man auf Speichern klickt, landet man in den Einstellungen für das eben hinzugefügte Feld. Hier alles lassen wie es ist, nur sollte man darauf achten dass unten bei Anzahl von Werten „unbegrenzt“ aktiviert ist, wir wollen ja beliebig viele Kategorien zu einem Rezept hinzufügen können.

Wenn man jetzt einen neuen Blogeintrag hinzufügt (oder einen bestehenden editiert) findet sich das Auswahlfeld für die Kategorien unterhalb des Body-Feldes. Es arbeitet mit Auto-Vervollständigen nach den ersten drei Zeichen, man kann hier aber auch gleich eine neue Kategorie eingeben, oder mehrere Kategorien durch Komma getrennt.

kategorie_mittelmeerkueche
kategorie_mittelmeerkueche

Wo sieht man jetzt aber unsere neu erstellten Kategorien? Zunächst nur in der vollen Beitragsansicht, im Blog werden sie so ohne weiteres nicht angezeigt. Ich hätte aber doch gerne einen Block mit den vegebenen Kategorien wie in WordPress, wenns geht mit der Anzahl der zugeordneten Rezepte, und da mach ich mich jetzt mal auf die Suche.

 

Die ersten Inhalte, und das erste Modul: CKEditor

Um einen WYSIWYG-Editor ähnlich wie in Joomla oder WordPress zu erhalten, kann man sich das Modul CKEditor installieren, sie finden es hier: https://www.drupal.org/project/ckeditor

Unter Module->Installieren die ZIP-Datei anwählen, nach der Installation die Aktivierung nicht vergessen, der Editor findet sich ganz am Ende der Liste unter „Benutzeroberfläche“.

ckeditor_aktivieren
ckeditor_aktivieren

(Anmerkung: auf meiner Testinstallation läuft der CKEditor nur mit Google Chrome, unter Firefox gibts Probleme…)

Inhaltstypen

Standardmässig bringt Drupal zwei Inhaltstypen mit:  Artikel und einfache Seite. Artikel sollen lt. Doku überall da verwendet werden, wo vom Benutzer eine Interaktion erwartet wird (Kommentar). Die einfachen Seiten verwendet man für quasi-statische Seiten wie z.B. die Willkommen-Seite oder auch das Impressum.  Drupal hat auch noch andere Inhaltstypen an Bord, die nach Aktivierung der entsprechenden Module angeboten werden, und man kann auch eigene Inhaltstypen anlegen, aber dazu später mehr. Wir passen uns jetzt erstmal den Inhaltstyp „Einfache Seite“ an, denn wir wollen:

Bilder einbinden, die Erste

Das geht nämlich so ohne weiteres erstmal nicht. Wir müssen erstmal das Feld für die Bilder zur einfachen Seite hinzufügen. Das geht unter Struktur->Inhaltstypen->einfache Seite->Felder verwalten. Dort das vorhandene Feld „Bild: field_image“ auswählen und diese Option speichern.

feld_image
feld_image

Wenn wir jetzt über Inhalte hinzufügen eine neue einfache Seite erstellen, gibt es unterhalb des Editorfensters einen zusätzlichen Punkt Images, über den eine Bilddatei hochgeladen werden kann. Das Feld für den Alt-Text kann man leicht übersehen, es gibt auch keine Fehlermeldung wenn es nicht ausgefüllt wird, das Bild wird halt dann mit leerem Alt-Attribut in der Seite angezeigt. Auch Einstellmöglichkeiten für einen Titel oder eine Beschriftung oder dergleichen sucht man vergeblich, aber zur Bilderverwaltung in Drupal wird später noch mehr zu sagen sein.

Machen wir weiter mit unserer einfachen Seite.

Teaser und Bodytext

Wir bleiben erstmal im Beitragseditor. Das Feld Title ist selbsterklärend, darunter wird angezeigt:

Body (Zusammenfassung bearbeiten )

Man kann hier ähnlich wie in Joomla mit dem Weiterlesen-Tag einen Beitrag in eine Einleitung bzw. Zusammenfassung, auch Teaser genannt, und den eigentlichen Body Text aufteilen.  Es wird dann auf der Seite nur der Teaser und ein Weiterlesen-Button angezeigt, wie das im Einzelnen gesteuert wird, hängt letztlich vom Theme ab.

Menüeinstellungen

Wir können unserer einfachen Seite jetzt einen eigenen Menüpunkt zuordnen:

menueinstellungen
menueinstellungen

Dabei bestimmt die Gewichtung, in welcher Reihenfolge die Menüpunkte angezeigt werden. Wenn alles geklappt hat, müsste jetzt als zweiter Menüreiter der Eintrag „Rezeptbilder“ erscheinen.

rezeptbilder
rezeptbilder

NiceURLs muss man per Hand anlegen

In anderen CMS kriegt man sprechende URLs vorgeschlagen, in Drupal muss man sie manuell eintragen, das geht unter URL-Alias-Einstellungen.

niceurls
niceurls

Die kleine Mühe, hier eine URL-safe Vorgabe einzustellen hätten sich die Drupal-Entwickler schon machen können! Wenn man das nämlich nicht macht, bekommt man URLs nach dem Muster  http://ihresite/drupal/node/7, und das ist weder schön noch SEO-gerecht.

Auf die Art und Weise lege ich mir jetzt meine statischen Seiten der Reihe nach an. Wenn man übrigens für die Startseite einen eigenen Karteireiter haben möchte, muss man dies unter Struktur->Menüs->Link hinzufügen einrichten, hier einen Titel (z.B. Startseite) vergeben und als Link <front> eintragen.

Und was ist mit den Rezepten?

Das muss ich mir erstmal gut überlegen. Ob die in einem Blog besser aufgehoben sind, oder als eigener Inhaltstyp verwaltet werden sollen. Aber dazu gibt es einen neuen Beitrag.

 

 

Neues Projekt, neues CMS: Drupal für alte Programmierer

Drupal ist die Nummer drei

Drupal ist nach WordPress und Joomla das drittverbreitetste CMS weltweit, laut Statista waren es Ende September 2017 1,14 Millionen Webseiten „Powered by Drupal“. Es wird oft damit Werbung gemacht, dass Drupal von vielen „offiziellen“ Webseiten wie Regierungen, Bildungseinrichtungen und internationalen Firmen eingesetzt wird und somit als ernstzunehmende CMS-Alternative zu den härtesten Konkurrenten WordPress und Joomla zu rechnen ist.

Am verbreitetsten ist immer noch der Versionszweig 7.x, die Version 8.x schwächelt noch ein bisschen in der Verfügbarkeit zusätzlicher Module im public domain Bereich und in der Dokumentation. Einen kurzen, knackigen Vergleich der beiden Versionen findet man hier bei DB Difference Between. Ich habe mich vor allem wegen der Anzahl und Qualität der verfügbaren Tutorials und Dokumentationen für die Version 7.57 entschieden, und zwar zum Testen in einer lokalen Installation auf XAMPP 7.2. Das wirft zwar ein paar PHP-Glitches (Deprecated function: The each() function is deprecated…), aber scheint im Großen und Ganzen einwandfrei zu funktionieren. Drupal ist allerdings auch bei vielen Hostern als Pre-Package im Angebot und kann dort sehr leicht zum Testen eingerichtet werden

Drupal-Releases zum Download

Die aktuellen Releases findet man auf https://www.drupal.org/project/drupal

Eine sehr ausführliche Installationsanleitung findet man hier beim Drupal Blog Berlin: https://www.drupal-blog-berlin.de/blog/drupal-8-installieren-jedermann

Eine ebenfalls sehr ausführliche Anleitung zum Umstellen der Sprache auf Deutsch findet man hier: https://praxistipps.chip.de/drupal-auf-deutsch-umstellen-so-gehts_27104

Erste Anpassungen nach der Installation

Drupal präsentiert sich erstmal sehr spartanisch, nach erfolgreicher Installation sieht die Startseite recht mager aus, die Meldung „Es wurde noch kein Inhalt für die Startseite erstellt.“ fordert eine erste Aktion heraus. Mit Klick auf Neuen Inhalt hinzufügen->Einfache Seite landet man in einem sehr mageren Editor, aber da kümmern wir uns gleich drum. Geben sie ihrer neuen Seite einen netten Namen „Willkommen“ wäre OK und schreiben sie etwas Text hinein. Damit diese Seite jetzt auch auf der Startseite angezeigt wird, muss man unter Menüeinstellungen die Option „Menüpunkt erstellen“ anhaken, und unter „Veröffentlichungseinstellungen“ den Punkt „Auf der Startseite anzeigen“ anhaken. Speichern, und jetzt haben wir unseren ersten Menüpunkt.

Das Standard-Theme: Bartik 7.57

Genau wie WordPress und Joomla verwendet Drupal Themes, um das Aussehen der Seite zu steuern. Ich bleibe beim Standard-Theme Bartik und nehme nur ein paar Konfigurationseinstellungen vor. Eine feine Dokumentation über das Theme Bartik und dessen Regions findet man hier: https://www.drupal.org/docs/7/core/themes/bartik/introduction-to-bartik-theme

Die Blockpositions-Vorschau

Es gibt aber auch wie in Joomla die Option einer Theme-Vorschau mit den vorhandenen Blöcken, dazu unter Struktur->aktuelles Theme->Block-Regionen veranschaulichen (Bartik)  anwählen, und man bekommt eine sehr schöne grafische Übersicht.

blockvorschau
blockvorschau

Ändern des Titels und des Slogans

Unter Konfiguration->System->Website-Informationen können sie Titel und Slogan der Webseite einstellen.

Ändern des Logos und des Favicons

Unter Design->akt. Theme->Einstellungen kann man ein individuelles Logo hochladen, dieses sollte allerdings bereits auf passendes Mass skaliert sein. Hier könnte man auch ein eigenes Favicon hochladen, sowie bestimmte Seitenelemente ein- und ausblenden. An dieser Stelle kann man auch das Farbschema des Themes einstellen, ich hab mal „Pflaume“ genommen.

erste_seite
erste_seite

Ein kurzer Blick auf die Datenbank

Drupal gönnt sich über 70 Tabellen, eine Dokumentation findet sich hier: https://www.drupal.org/node/2360815

Alle Entitäten einer Drupalseite werden als Nodes (siehe hier in den Joomla Docs) behandelt. Die relevanten Node-Tabellen werden hier kurz und knapp erklärt. Die Inhalte von Seiten und Beiträgen findet man in den Fields-Tabellen wieder, da kommen wir später noch dazu.

Jetzt kümmern wir uns erstmal um die Inhalte unserer neuen Seite, und dazu gibts einen neuen Beitrag.