Drupal Standard-Startseite (River of news) entfernen

Die Drupal Startseite besteht standardmäßig aus einem sogenannten River of news, eine Auflistung der neusten Beiträge im CMS. Zwei Möglichkeiten bietet das System von Haus aus, damit umzugehen: Anzahl an Beiträgen für die Startseite beschränken oder einen einzelnen Beitrag als Startseite festlegen. Mit dem Views-Modul kann man zusätzlich eine eigene Ausgabe zusammenkonfigurieren und diese dann als Startseite definieren. Wer aber seine Startseite gerne ohne einen extra dafür angelegten Beitrag (z.B. nur mit Blöcken) zusammenstellen möchte, ist gekniffen. Leider ist das genau der Weg, den ich bei jedem Projekt einschlagen muss. Zum Glück ist in Drupal 7 der Haupt-Seiteninhalt ebenfalls ein Block. Einfach deaktivieren (oder nur für <front> deaktivieren) geht aber dummerweise nicht. Abhilfe gibts - wie so oft - über einen Hook...

In der template.php des Themes kann man schnell mit den folgenden Befehlen eine leere Ausgabe für die Standard-Startseite zusammenschustern. Alles was wir brauchen sind diese Befehle/Funktionen:

  • hook_block_list_alter(&$blocks) { ... }
  • drupal_is_front_page()
  • drupal_set_page_content()

Wenn wir In Worten erklärt, passiert hier folgendes: Wenn wir schon den Drupal Block "Haupt-Seiteninhalt" nicht über die Konfigurationsberfläche deaktivieren können, dann können wir das aber sehr wohl programmatisch tun. Dafür nutzen wir einen Hook um die Liste der verfügbaren Blöcke zu manipulieren -> hook_block_list_alter().

In diesem Hook prüfen wir mit drupal_is_front_page(), ob wir uns auf der Startseite befinden und - falls ja - entfernen wir ganz einfach den Haupt-Seiteninhalts-Block aus der Liste der verfügbaren Blöcke. Das manipulierte Array wird dann über drupal_set_page_content() ausgegeben und schon haben wir eine leere Startseite - ohne Views -, die wir nach Lust und Laune mit Blöcken befüllen können.

/**
 * Implements hook_block_list_alter().
 *
 * Removes the main content block on the front page.
 */
function felibaby_block_list_alter(&$blocks) {
  if (drupal_is_front_page()) {
    foreach ($blocks as $blockkey => $blockinfo) {
      if ($blockinfo->module == 'system' && $blockinfo->delta == 'main') unset($blocks[$blockkey]);
    }
    drupal_set_page_content();
  }
}