Blog

Unsere Tage bei der re:publica 13

Besser spät als nie ... die re:publica 13 ist zwar schon eine Weile vorbei, deswegen aber noch nicht vergessen. Nach drei anstrengenden Tagen hatte uns der Arbeitsalltag allzu schnell wieder im Griff, aber vergessen haben wir die Zeit dort natürlich nicht. Und berichten - mit etwas Abstand, der schadet ja nie - über unsere Erfahrungen beim Klassentreffen der Internetten. An der Tastatur: Jürgen und Martina.

Drupals Views-Modul mit PHP erweitern

Das Views-Modul ist ein sehr mächtiges Werkzeug und eines der unverzichtbarsten Drupal-Module. Manchmal kommt man mit den vorhandenen Funktionen aber trotzdem an eine Grenze. Um diese zu überschreiten brauch es manchmal nur ein paar Zeilen PHP-Code. In diesem Blogbeitrag hatte ich gezeigt, wie man in Drupal 6 eingebettete Views mit einem CCK-Feld und etwas PHP steuern kann. Für Drupal 7 gibt es für den gleichen Zweck das Modul Views PHP. Wenn man dieses installiert findet man in den Views-Feldern eine neue Option: "Global: PHP".

PHP-Feld in View einbinden

Fügt man das Feld, kann man hier direkt PHP-Code eintragen.

PHP-Code in Drupal-View einbinden

Verschiedene Ziel-URL für Header-Grafik bei mehrsprachiger Wordpress-Seite

Auf einer zweisprachigen Kunden-Website sollte die Headergrafik im Seitenkopf jeweils mit einer bestimmten Landing-Page verlinkt werden. Sofern dies die Startseite ist (also kundendomain.de/ ) funktioniert das auch problemlos und die Umschaltung auf die andere Sprache macht keine Probleme. Schwieriger wird es wenn auf eine Seite verlinkt werden soll, die einen sprachabhängigen Pfad hat. In diesem konkreten Fall sollte die Grafik in der deutschen Sprachversion auf kundendomain.de/ueber-uns/ verlinken und in der englischen Version auf englisch.kundendomain.de/about-us/.

Um das zu erreichen muss man einen kleinen Codeschnippsel in die Datei header.php des Themes schreiben. Hier wird als Theme "Twenty Twelve" verwendet. Die gesuchte Datei findet man unter wp-content/themes/twentytwelve/header.php

Die Zeile 54 gibt die mit der Header-Grafik verbundene URL aus und wird folgendermaßen ergänzt:

<a href="<?php echo site_url(); ?>
<?php if(substr(site_url(),7,7)=='english'):
?>/about-us/
<?php else :
?>/ueber-uns/
<?php endif; ?>
"><div class="header-left">  
<?php $header_image = get_header_image();

Damit wird nun zunächst abgefragt, ob die Site-URL mit "english" anfängt. Wenn dies der Fall ist, wird der Pfad "/about-us" an die Site-URL (englisch.kundendomain.de) angehängt, andernfalls der Pfad zur deutschsprachigen Seite (kundendomain.de) "/ueber-uns/".

Komfortabel Links mit CKEditor unter Drupal erstellen

Wer schon einmal unter Drupal Texte mit dem CKEditor erstellt oder bearbeitet hat, kennt das Problem: Man möchte auf einen bestehenden Beitrag verlinken und kennt so ungefähr dessen Titel aber nicht die genaue URL, weder in der Form node/1234 noch den aus dem Titel abgeleiteten URL-Alias, der z.B. diese Form haben kann blog/ein-blog-artikel. Also muss man zunächst einmal den Beitrag suchen und die URL kopieren, um sie als Ziel eintragen zu können. Schöner wäre es natürlich, wenn man beim Anlegen des Links Teile des Titels eintippen könnte und von Drupal automatisch Vorschläge für passende Nodes bekäme. Genau das ermöglichst das Plugin CKEditor Link.

 

PHP- und Drupal-Bug: Update von Drupal7-Modulen bricht mit Fehlermeldung ab

Das ein Softwarefehler in einem Programm dafür sorgt, dass ein anderes Programm nicht mehr läuft, kommt schon mal vor. Aber dieser Fall ist besonders kurios. Hier heben sich zwei Fehler gegenseitig auf und das Beseitigen des einen sorgt dafür, dass der andere zum Tragen kommt.

Aber der Reihe. Angefangen hat das ganze heute morgen, als ich in einer Drupal7-Installation (7.18) diverse Module updaten wollte. Normalerweise geht das mit Drupal7 ja sehr einfach und komfortabel direkt aus dem Backend heraus. Diesesmal aber nicht. Mitten im Update kam plötzlich die Fehlermeldung

    Error installing / updating
    File Transfer failed, reason: Cannot remove directory /usr/www/users/xxxxxx/sites/all/modules/views/drush/...

Anzeige des Weiterlesen-Link in Drupal 7 kontrollieren

In Drupal 7 gibt es drei verschiedene Möglichkeiten, um bei einem Artikel nur den Anrisstext (Teaser) anzeigen zu lassen. Zum einen kann man beim Erstellen des Artikels an geeigneter Stelle einen sogenannten Teaserbreak einfügen. Dieser wird in der Quellcodeansicht als "< !-- break -- >" dargestellt (jedoch ohne die Leerzeichen darin!), im WYSIWIG-Editor ist dies eine doppelte gepunktete, rote Linie. Läßt man Drupal von einem Artikel nur den Anrisstext ausgeben, so erscheint nur der Text oberhalb der roten Linie, sowie ein "Weiterlesen"-Link. Alternativ kann man auch eine eigene Zusammenfassung schreiben und den Teaser-Break weglassen. In diesem Fall gibt Drupal als Anrisstext die Zusammenfassung aus und in der vollständigen Artikelansichte den Textkörper (Body) ohne die Zusammenfassung (siehe auch den folgenden Screenshot).

Drupal7 WYSIWYG-Editor mit Zusammenfassung (oben) und Teaserbreak im Body (unten)
Bild: Drupal7 WYSIWYG-Editor mit Zusammenfassung (oben) und Teaserbreak im Body (unten)

Der nächste Screenshot zeigt die Vorschau mit der gekürzten Fassung (also dem Anrisstext mit dem "Weiterlesen"-Link) und den vollständigen Beitrag.

Drupal7: Artikelvorschau mit Anrisstext und vollständiger Fassung
Drupal7: Artikelvorschau mit Anrisstext und vollständiger Fassung

Als dritte Möglichkeit bietet Drupal noch das automatische Erstellen eines Teasers durch Kürzen auf eine einstellbare Zahl von Zeichen.

Eines kann Drupal jedoch nicht: selber entscheiden, ob der Weiterlesen-Link erforderlich ist oder nicht. Wenn z.B. ein Artikel keine Zusammenfassung und keinen Teaser-Break enthält, weil er sehr kurz ist (und damit auch die automatische Erstellung des Teasers durch Kürzen nicht greift), zeigt Drupal trotzdem einen "Weiterlesen"-Link. Das ist für die Leser natürlich nicht ideal, erwartet man doch, dass beim Anklicken eines "Weiterlesen"-Links auch tatsächlich weiterer Text angezeigt wird und nicht nur eine neue Seite mit exakt dem Artikel den man schon vollständig gelesen hat.

Abhilfe schafft das Modul Read More Control. Nach dem Installieren kann man für jeden einzelnen Inhaltstyp einstellen, wie sich der "Weiterlesen"-Link verhalten soll. Zur Verfügung stehen die Optionen:

  • Always show link: Zeigt den Link immer an. Das ist das Standardverhalten von Drupal 7
  • Show link when required by any supported fields: Zeigt den Link an, wenn eines der unterstützten Felder dies erfordert
  • Show link when required by any supported text based fields: Zeigt den Link an, wenn eines der unterstützten Text-Felder dies erfordert
  • Show link when required by the Body (body) field: Zeigt den Link an, wenn das Body-Feld dies erfordert. Das ist das Standardverhalten von Drupal 6.
  • Never show link: Der "Weiterlesen"-Link wird nie angezeigt.
  • Do not process: Read More Control wird nicht ausgeführt

Mit der zweiten oder dritten Option ist es nun möglich, die Anzeige des "Weiterlesen"-Links so einzustellen, dass er nur angezeigt wird, wenn es auch wirklich weiteren Text zum Lesen gibt.

 

Simplenews und Omega-Theme: Fehlermeldung beim Newsletterversand

Wenn ein Drupal-Modul nicht so arbeitet wie erwartet, muss nicht immer das verwendete Modul selber dafür verantwortlich sein. Manchmal kann die Ursache für den Fehler auch bei dem verwendeten Theme liegen. Dies ist so ein Beispiel. Für eine Drupal7-Webseite haben wir das Modul Simplenews für den Newsletter-Versand installiert. Als Theme kam Omega zum Einsatz. Sobald nun ein Newsletter versendet wurde - egal ob ein einzelner Test-Newsletter oder eine komplette Abonnentenliste - warf Drupal für jede versendete Mail diese Fehlermeldungen aus:

Notice: Trying to get property of non-object in alpha_invoke() (Zeile 99 von /usr/www/users/testhw/msv/sites/all/themes/omega/alpha/includes/alpha.inc).
Warning: Invalid argument supplied for foreach() in alpha_invoke() (Zeile 99 von /usr/www/users/testhw/msv/sites/all/themes/omega/alpha/includes/alpha.inc).

Die E-Mails wurden dabei zwar versendet, aber solche Fehlermeldungen sind natürlich lästig, vor allem wenn man mehrere Hundert Newsletter-Mails versendet. Die Lösung für das Problem fand sich schließlich im verwendeten Omega-Sub-Theme Alpha, das nicht nur für die Anzeige der Webseite verwendet wurde, sondern auch, um die zu versendenen HTML-Newsletter-Mails zu rendern. Der folgende Patch behebt den Fehler (Quelle: http://drupal.org/node/1763362#comment-6790982):

diff --git a/alpha/includes/alpha.inc b/alpha/includes/alpha.inc
index b4be3e2..42b1e1b 100644
--- a/alpha/includes/alpha.inc
+++ b/alpha/includes/alpha.inc
@@ -91,19 +91,21 @@ function alpha_invoke($type, $hook, &$vars) {
 
   // If one of the themes in the theme trail implements this hook
   // include the corresponding .inc file and call the associated function.
-  foreach (alpha_theme_trail($theme->theme) as $key => $name) {
-    $function = $key . '_alpha_' . $type . '_' . $hook;
+  if (!empty($theme)) {
+    foreach (alpha_theme_trail($theme->theme) as $key => $name) {
+      $function = $key . '_alpha_' . $type . '_' . $hook;
 
-    if (!function_exists($function)) {
-      $file = drupal_get_path('theme', $key) . '/' . $type . '/' . $type . '-' . str_replace('_', '-', $hook) . '.inc';
+      if (!function_exists($function)) {
+        $file = drupal_get_path('theme', $key) . '/' . $type . '/' . $type . '-' . str_replace('_', '-', $hook) . '.inc';
 
-      if (is_file($file)) {
-        include $file;
+        if (is_file($file)) {
+          include $file;
+        }
       }
-    }
 
-    if (function_exists($function)) {
-      $function($vars);
+      if (function_exists($function)) {
+        $function($vars);
+      }
     }
   }
 }

Probleme mit Links auf mehrsprachiger Drupal-Webseite beheben

Bei einer Kundenwebseite trat folgendes Problem auf: Die Seite wurde als mehrsprachige Seite geplant, zunächst aber nur mit deutsch Inhalten befüllt. Erst später kamen die englischen Übersetzungen der Beiträge hinzu. Innerhalb der deutschen Texte gab es nun diverse Links auf andere interne Inhalte. Diese Links waren relativ gesetzt (siehe Screenshot des CK-Editors).

relativer Link auf internen Inhalt einer Drupal-Webseite
Interner Link im CK-Editor

Kam man nun als Besucher auf eine deutsche Seite, so zeigten alle dort enthaltenen Links auf die korrekten deutschen Sprachversionen.

Beispiel:

Der Text  "Fragen Sie einfach nach" war mit der (internen) Seite www.kundendomain.de/inhalt/kontakt verknüpft

Schaltete man jetzt mittels des Sprachumschalters im Language-Block auf die englische Version um, so wurde die englische Übersetzung angezeigt. Allerdings wurden die Links in dem übersetzten Text  nicht korrekt ausgegeben.

Aus internen Links in Drupal automatisch vollwertige URLs machen

Wenn man in Drupal einen Link auf eine interne Seite setzt, gibt man meistens nur den relativen Pfad an. Beispiel: Wenn wir einen Link auf einen anderen Blogeintrag setzen, dann geben wir nur diesen Teil ein:

/blog/wie-man-verhindert-dass-drupal-ungewollt-e-mails-verschickt

Daraus macht Drupal beim Anzeigen des Artikels dann automatisch die vollständige URL (wie man leicht erkennt, wenn man mit dem Mauszeiger über den Linktext geht):

http://www.webtotum.de/blog/wie-man-verhindert-dass-drupal-ungewollt-e-m...

Das ist praktisch, vor allem weil bei einer späteren Änderung der Domain die Links automatisch richtig zusammengesetzt werden. Einen Nachteil hat diese Methode jedoch: Nicht alle Module können diesen Mechanismus nutzen. So werden derartige interne Links zum Beispiel vom Newslettermodul Simplenews derzeit nicht korrekt umgewandelt. Sie gehen beim Versenden des Newsletters einfach verloren.

Wie man verhindert, dass Drupal ungewollt E-Mails verschickt

Wenn man eine neue Drupal-Webseite entwickelt, kommt irgendwann der Punkt, an dem man reale Daten in das System einspielt, um die Seite abschließend zu testen bevor sie dann online geht. Hat man User mit existierenden Mailadressen angelegt, so möchte man nicht unbedingt, dass diese E-Mail-Benachrichtigungen bekommen, da die Seite ja noch gar nicht im Betrieb ist - zumindest, wenn diese User nicht gleichzeitig Entwickler oder Tester sind. Dabei kann es auch leicht passieren, dass nicht nur einzelne Mails versendet werden, sondern mehrere Dutzend oder sogar Hunderte.

Inhalt abgleichen

 

Das Team

Martina Ruediger

Martina Rüdiger
(X)HTML/CSS, PHP, Drupal, Wordpress, Konzeption, Design und Umsetzung von modernen Web-Layouts, SEO, Printdesign

 

Jürgen Thau
Kundenberatung, Projektsteuerung, PHP, JavaScript, Drupal, Joomla, Drupal- und Joomla-Schulungen  

Was wir bieten

  • Konzeption und Gestaltung rund um Ihre Web-Seite
  • Online Shops
  • barrierearme und zukunftssichere Designs
  • Beratung rund um Content-Management
  • maßgefertigte Lösungen
  • ergänzende Angebote aus dem Print-Bereich
  • bedarfsgerechte Web-Hosting-Angebote
  • Schulungen vor Ort
  • Unterstützung nach dem Start Ihrer Web-Seite

Wir sehen uns:

wordcamp berlin

Gezwitschert ...

  • Neu im Blog: Ist ein Upgrade ihrer Drupal-Webseite erforderlich?