Das Örtchen RSS-Feed
Kategorie
Kategorie: Blog
Buttons & Statistiken
Neueste Kommentare

Drupal: Wie treibe ich es richtig? (Teil 3)

Im Rahmen dieser Drupal-Serie habe ich mich bisher mit der korrekten Einbindung von zusätzlichen JavaScript-Dateien in ein Theme und der Ersetzung von Event-Handlern durch Drupal.behaviors beschäftigt. Diesmal möchte ich mich mit einem ganz anderen Thema beschäftigen und zwar dem meiner Meinung nach total unzulänglichen Startseiten-Feed rss.xml.

Problem 1 "Node-Filterung"

Der Startseiten-Feed hat den Nachteil, daß man ihn nicht wirklich auf bestimmte Inhaltstypen (wie beispielsweise Artikel) beschränken kann. Stattdessen zeigt der Feed einfach die aktuellsten veröffentlichten Nodes mit der Veröffentlichungseinstellung Auf der Startseite an.

Klar könnte man die Node-Einstellungen so setzen, daß diese Einstellung Standard für neue Artikel ist. Ich wollte jedoch einen RSS-Feed, über dessen Inhalt ich wesentlich mehr Kontrolle habe und war mit meiner Lösung aus dem Jahr 2009 nicht mehr wirklich zufrieden (da ich zeitlich auch nie zu dem angekündigten Admin-Interface gekommen bin).

Zufälligerweise stolperte ich über einen Artikel aus dem Jahr 2008 auf geektips.net, welcher die Erstellung eines eigenen Feeds über Views beschrieb. Leider ist der Artikel ziemlich veraltet, weswegen ich nach aktuelleren Infos suchte und bei itech7.com fündig wurde. Dieser Artikel ist relativ aktuell, allerdings braucht man heutzutage für die Lösung nur noch das Modul Views.

Die Lösung

Ich möchte hier auf Basis der beiden genannten Artikel eine Lösung präsentieren, wie man mit Views 6.x-2.12 (derzeit aktuellste Stable-Version) den normalen Feed von Drupal unter rss.xml ersetzen und die erscheinenden Nodes nach eigenen Wünschen filtern kann.

Hinweis: Ich setze die Installation der Module Views und Views UI voraus und beginne direkt mit dem Hinzufügen der neuen Ansicht (was für eine doofe Übersetzung).

Vorgehensweise:

  1. Admin-Menü
    -> Strukturierung
    -> Ansichten
    -> Hinzufügen
  2. Ansichtsname rss_feed, Beschreibung RSS-Feed und Ansichtstyp Node
    -> nächste Seite
  3. Basiseinstellungen
    -> Zeilendesign
    -> Felder anklicken
    -> Node auswählen
    -> Aktualisieren
  4. Standards: Darstellungsoptionen für Zeilen
    -> Einstellungen so belassen
    -> Aktualisieren
  5. Sortierkriterium
    -> Plus-Zeichen anklicken
    -> Gruppe Node
    -> Node: Beitragsdatum auswählen
    -> Hinzufügen
  6. Standards: Sortierkriterien Node: Beitragsdatum konfigurieren
    -> Sortierreihenfolge Absteigend
    -> Aktualisieren
  7. Filter
    -> Plus-Zeichen anklicken
    -> Gruppe Node
    -> Node: Veröffentlicht auswählen
    -> Hinzufügen
  8. Standards: Filter Node: Veröffentlicht konfigurieren
    -> Veröffentlicht Ja
    -> Aktualisieren
  9. Filter
    -> Plus-Zeichen anklicken
    -> Gruppe Node
    -> Node: Typ auswählen
    -> Hinzufügen
  10. Standards: Filter Node: Typ konfigurieren
    -> Operator Ist eines von, Inhaltstyp Artikel
    -> Aktualisieren
  11. Filter
    -> Plus-Zeichen anklicken
    -> Gruppe Beitragsübersetzung
    -> Beitragsübersetzung: Sprache auswählen
    -> Hinzufügen
  12. Standards: Filter Beitragsübersetzung: Sprache konfigurieren
    -> Operator Ist eines von, Sprache Aktuelle Sprache des Benutzers
    -> Aktualisieren
  13. Links oben
    -> anstatt Seite Newsfeed auswählen
    -> Anzeige hinzufügen
  14. Basiseinstellungen
    -> Anzuzeigende Einträge
    -> 10 anklicken
    -> Anzahl 25
    -> Übersteuern
    -> Aktualisieren
  15. Basiseinstellungen
    -> Titel
    -> Nichts anklicken
    -> Checkbox für den Namen der Website anklicken
    -> Übersteuern
    -> Aktualisieren
  16. Basiseinstellungen
    -> Zeilendesign
    -> Fehlendes Design-Plugin anklicken
    -> Node auswählen
    -> Aktualisieren
  17. Newsfeed: Darstellungsoptionen für Zeilen
    -> Einstellungen so belassen
    -> Aktualisieren
  18. Newsfeed-Einstellungen
    -> Pfad
    -> rss.xml
    -> Aktualisieren
  19. Speichern

Hinweis: Punkt 11 und 12 werden nur in einem mehrsprachigen Umfeld benötigt und können somit bei einer normalen Drupal-Installation weggelassen werden.

Problem 2 "Feed-Verfügbarkeit"

Unter der URL rss.xml ist unser geänderter Feed nun zwar immer verfügbar, wird jedoch nirgends von Drupal kommuniziert (außer wir benutzen die Standard-Einstellung für die Startseite). Somit fehlt beispielsweise die Angabe des Links im Head-Bereich unseres HTML-Quelltextes und das Feed-Icon ist auch nicht immer verfügbar.

Die Lösung

Dies ist meines Wissens nach nur mittels eines kleinen Moduls und drupal_add_link() lösbar:

function mymodule_preprocess_page(&$vars) {
    $title = variable_get('site_name', 'Drupal') . ' ' . t('RSS Feed');
    $feed_url = url('rss.xml', array('absolute' => TRUE));

    $attributes = array(
        'rel' => 'alternate',
        'type' => 'application/rss+xml',
        'title' => $title,
        'href' => $feed_url
    );

    //if not using default frontpage, rss.xml ist missing in head
    drupal_add_link($attributes);
    $vars['head'] = drupal_get_html_head();
    
    //if not using default frontpage, feed_icons seems to be empty
    $vars['feed_icons'] = theme('feed_icon', $feed_url, $title);
}

Achtung: Der fettmarkierte Modulname ist natürlich abhängig davon, wie ihr den Modul-Ordner und somit auch das Modul benannt habt.

Problem 3 "Views-Argumente"

Da nun Views für die URL rss.xml zuständig ist, sind grundsätzlich Parameter-Angaben möglich. Dies bedeutet, daß Drupal derzeit auch unter der URL rss.xml/honk den Feed anzeigt.

Lösung

Ich kenne leider keine Möglichkeit, einem View zu sagen, daß er keine Argumente erlauben darf. Da ich aber sowieso alle Feed-Anfragen für die rss.xml an FeedBurner weiterleiten möchte, habe ich zur Lösung dieses Problems einfach meinen Umleitungscode in der .htaccess angepasst.

  RewriteCond %{HTTP_HOST} ^blog-das-oertchen\.de [NC]
  RewriteCond %{HTTP_USER_AGENT} !(feedburner|feedvalidator|googlebot) [NC]
  RewriteRule ^rss.xml(/.*)?$ http://feeds.feedburner.com/das-oertchen [R,L]

Hinweis: Gegenüber meiner früheren Lösung für die FeedBurner-Umleitung setze ich inzwischen keinen Sprachwechsel per Prefix (de bzw. en) mehr ein, sondern eine Domain-basierte Lösung.

Achtung:

  1. Wenn Ihr nur eine Domain benutzt, ist die erste Zeile des Codes unnötig und kann wegfallen.
  2. Wenn Ihr zur Sprach-Umschaltung ein Prefix benutzt, dann kommt in der letzten Zeile vor das rss.xml das entsprechende Prefix mit einem Slash danach (wie in meiner alten Lösung).
  3. In der letzten Zeile müsst Ihr natürlich die Angabe das-oertchen durch Eure FeedBurner-Adresse ersetzen.

Fazit

Dank Views und einem Mini-Modul habe ich nun wie gewünscht einen RSS-Feed, welcher auf allen Seiten meiner Website verfügbar ist und über dessen Inhalt ich die volle Kontrolle habe. Dank der Nutzung der Theming-Hooks theme_feed_icon() ist es im weiteren Verlauf problemlos möglich, das RSS-Icon in der template.php Eures Themes auszutauschen (wie ich es auch hier im Blog gemacht habe).

Kennt eigentlich jemand einen Weg, Views-Argumente für einzelne Views zu verbieten (optimalerweise als Error 404)?

Hallo! Bist du neu hier? Dann abonniere doch den RSS-Feed dieses nicht mehr ganz so stillen Örtchens, um über meine geistigen Ergüsse auf dem Laufenden zu bleiben. Alternativ besteht auch die Möglichkeit, sich von FeedBurner per E-Mail über meine Ausscheidungen benachrichtigen zu lassen.

Neuen Kommentar schreiben

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
Der Inhalt dieses Feldes wird öffentlich zugänglich angezeigt, aber als rel="nofollow" markiert.
Hinweis

Kommentare beleben den Blog! Ich freue mich über jeden Kommentar. Du kannst hier offen Deine Meinung zum Artikel sagen, aber bitte beachte die Netiquette und vermeide es andere zu beleidigen.

Bitte unterlasst es die Kommentare zu SEO-Zwecken zu missbrauchen. Kommentare mit Links, die nicht zu Blogs führen (oder zu Blogs mit Grauzonen-Themen) und/oder Keywords als Namen verwenden, sind nicht erwünscht!

Möchtest Du mir einen Blog-Artikel schmackhaft machen, dann schreib die URL ohne HTML-Tag in den Kommentarbereich und ich werde diesen bei Gefallen verlinken.