Archiv der Kategorie: Blog

Ein bisschen Feintuning – ein Gemischtwarenladen

Anrisstext in Blogansicht ausblenden

Mir genügt es völlig, wenn in der Blogansicht die Titel der Rezepte angezeigt werden. Teaser Text verwende ich nicht, weil mir das zuviel Arbeit ist, den müsste ich ja für jedes der über 300 Rezepte neu erstellen! Also blende ich den Body des Rezeptes in der Blogansicht komplett aus, das funktioniert mit folgendem Eintrag in meinem Template Override node–blog.tpl.php:

<div class="content clearfix"<?php print $content_attributes; ?>>
    <?php
      // We hide the comments and links now so that we can render them later.
      hide($content['comments']);
      hide($content['links']);
      //*****************Inhalt nur in der Full-Ansicht anzeigen
      if ($view_mode == 'full'){print render($content);}
    ?>

Das sieht dann so aus:

blog_ohne_teaser
blog_ohne_teaser

Überschrift „Weblogs“ auf der Blogseite ändern

Dafür legt man sich einen Override der der page.tpl.php an und benennt ihn mit page–blog.tpl.php. Dann nach dem Eintrag suchen:

<?php print $title; ?>

Diesen ersetzen durch:

<?php if (arg(0) != 'blog' && $node->type != 'blog') { print $title; } else {print "Alle Rezepte";}?>

Ergebnis:

alle_rezepte
alle_rezepte

Link „Blog von evi“ in der Blog-Ansicht ausblenden

Quick and dirty, aber funktioniert: die style.css des Themes um folgenden Eintrag ergänzen:

li.blog_usernames_blog.last
{
display:none;
}

Dann ist der Link weg.

blog_ohne_link
blog_ohne_link

Kategorien oben in der Full View anzeigen

An den Anfang  der node–blog.tpl.php folgende Zeile stellen:

<?php print render($content[‚field_tags‘]);?>

kategorien_oben
kategorien_oben

 

Meine Export-Datei, und wie man die Nodes jetzt tatsächlich anlegt

Ich hab mir die Tabelle taxonomy_term_data aus Drupal ins Access überspielt und mit meinen WordPress-Tabellen verknüpft, so komme ich an die tag-IDs. Das läuft genau wie bei der Erzeugung der Export-Datei in Joomla, nachzulesen hier in meinem Artikel über das Tag-Mapping. Das vorläufige Endergebnis habe ich mal auf 24 Rezepte beschränkt, aussehen tut es so:

24_rezepte
24_rezepte

ID, post_content, post_name und titel kommen aus WordPress, die tags 1..3 sind die gemappten tag-IDs aus Drupal. Den post_content hab ich schon bereinigt, da sind schon alle Links draussen und alle Caption-Shortcodes entfernt, wie das geht habe ich in diesem Artikel beschrieben.

Ich habs mal auf maximal drei Tags beschränkt, das reicht zum Vorführen. Diese Tabelle kommt jetzt in die Drupal-Database mit rein, und dann wollen wir mal.

Vorbereitungen

Voraussetzung für den Import ist, dass das Modul „Blogs“ aktiviert und ein Menüpunkt für die Blogseite erstellt ist, wie das geht hab ich in diesem Artikel beschrieben. Dann ändern wir in unserem Source den node type auf blog:

$node->type = 'blog';

Der Import mit db_query

Die Import-Tabelle lesen wir wie gehabt mit einem db_query ein, ich hab hier mal für den ersten Test noch eine where-Klausel mit drin, um die Sache erstmal auf einen Datensatz zu beschränken:

//***exporttabelle einlesen
        $query = db_query("SELECT * FROM 24_export where id = 205");
        $records = $query->fetchAll();

Mit einem Foreach() holen wir uns die einzelnen Zeilen der Query und legen uns die Inhalte auf Variable:

foreach ($records as $record) {
                
                $akt_titel = $record->titel;
                $akt_content = $record->post_content;
                $akt_alias = $record->post_name;
                $akt_tag1 = $record->tag1;

            // hier kommt die Action hin

}

Query-Ergebnisse in Variable einlesen

Diese Variablen passen wir dann in die Kreation des Nodes ein.

$body_text = $akt_content;

                $node = new stdClass();
                $node->type = 'blog';
                node_object_prepare($node);

                $node->title    = $akt_titel;
                $node->language = LANGUAGE_NONE;

                $node->body[$node->language][0]['value']   = $body_text;
                //$node->body[$node->language][0]['summary'] = text_summary($body_text);
                $node->body[$node->language][0]['format']  = 'full_html';
                $node->promote = 0; //nicht auf der Starseite
                
                // Alias erzeugen, post_name aus WP übernehmen
                $path = $akt_alias;
                $node->path = array('alias' => $path);
                
                /**Taxonomy Term zuordnen*/
                //id of your taxonomy term
                $tid = $akt_tag1;

                //add term to a node field
                //field_yourfield_name - machine name of your term reference field

                $node->field_tags[$node->language][0]['tid'] = $tid;
                /** end taxonomy term zuordnen */
                
                node_save($node);

Tags mitnehmen

Ich hab erstmal nur einen tag mitgenommen, aber das lässt sich leicht ausbauen. Sicherheitshalber frag ich auch noch ab, ob das tag-Feld nicht leer ist:

/**Taxonomy Terms zuordnen*/
                //id of your taxonomy term
                
                if ($akt_tag1 != ""){
                $tid1 = $akt_tag1;
                $node->field_tags[$node->language][0]['tid'] = $tid1;
                }
                
                if ($akt_tag2 !=""){
                $tid2 = $akt_tag2;
                $node->field_tags[$node->language][]['tid'] = $tid2;
                }
                
                if ($akt_tag3 !=""){
                $tid3 = $akt_tag3;
                $node->field_tags[$node->language][]['tid'] = $tid3;
                }
                
                //**end taxonomy terms zuordnen

Achtung: man muss in den Zeilen:

$node->field_tags[$node->language][]['tid'] = $tid3;

… den Parameter hinter $node->language leer lassen [], sonst werden die folgenden Tags nicht hinzugefügt, sondern überschrieben, so dass dann nur der letzte Tag zugeordnet ist.

Import komplett

Das wars jetzt aber – meine 24 Rezepte hat Drupal klaglos in den Blog importiert, die erscheinen auch brav im Block „Neueste Blogeinträge“:

neueste_blogbeiträge
neueste_blogbeiträge

Auch die Kategorien und die URL-aliase sind korrekt zugeordnet. Das nenn ich Spaß auf der Datenbank! 🙂

Jetzt lassen wir uns doch gleich mal das Inhaltsverzeichnis ausgeben:

ivz_24
ivz_24

Da hätte ich noch eine kleine Korrektur der Source für das Inhaltsverzeichnis nachzuliefern, das Array mit den Buchstaben braucht noch Anführungsstricherl, das sollte so aussehen, sonst wirft es PHP-Warnings:

$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');

Aber jetzt lass’mas gut sein, und nehmen eine Kaffeepause.

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.

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!

 

 

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.