Domain Access - Imagestyles pro Domain

Grundlagen Imagestyles

Drupal bietet über die Imagestyles eine einfache Möglichkeit Bilder zu manipulieren - im aktuellen Fall ging es um die Erzeugung eines Wasserzeichens für die Bilder auf einer Webseite. Hierfür kann man die Action Überlagern (Wasserzeichen) verwenden.

Im Beispiel schaut die Konfiguration dann wie folgt aus:

Imagestyle Watermark

 

Ein wesentlicher Vorteil der Nutzung der Imagestyles ist die einmalige Erzeugung der entsprechenden Bilder. Initial bedeutet das bspw. bei einer Bildergalerie zwar beim ersten Aufruf ein wenig Wartezeit - beim zweiten Aufruf sind diese Bilder dann aber sofort verfügbar.

Grundlagen Domain Access

Domain Access erlaubt es über eine Drupal-Instanz mehrere Domains zu steuern. Im Gegensatz zu einem Multisite-Setup wird hierbei im Normalfall nur eine Datenbank benutzt. Dies erlaubt es auf einfache Art und Weise Inhalte/Nutzer zwischen den angeschlossenen Domains zu teilen. Im aktuellen Fall ging es uns um das Teilen von Inhalten zwischen 2 Seiten eines Stadtportals (row-people.de/ hb-people.de). Neben dem Teilen von Artikeln sollten die beiden Seiten auch unterschiedliche Themes bekommen - auch dies ist über das Domain-Access-Modul möglich. Weitere Möglichkeiten des Domain-Access-Moduls werden wir in einem weiteren Blogpost noch einmal gesondert betrachten.

Unsere Konfiguration für die Domains sieht wie folgt aus:

Domain Configuration

 

  • Domain 1 (machine_name: domain1) Default-Domain
  • Domain 2 (machine_name: domain2)

Dieses Setup könnte man sich über lokale Virtual-Hosts auch einfach selbst nachbilden.

Problem und Lösung

Da die Imagestyles nur einmalig berechnet werden, hätten wir auf den beiden Domains die gleichen Wasserzeichen. Genau dieses Verhalten wollten wir auf den Seiten umgehen - d.h. pro Domain soll ein individuelles Wasserzeichen auf die Bilder gerechnet werden.

Um dies zu erreichen, müssen wir für jede Domain einen eigenen Imagestyle mit Wasserzeichen definieren - der machine_name des Imagestyles wird dabei um die Domain erweitert.

Imagestyle per Domain

 

  • watermark (Default-Wasserzeichen)
  • watermark_domain2 (Präfix entspricht dem machine_name der Domain)

Der Inhaltstyp Artikel ist im Beispiel wie folgt aufgebaut: 

Content Type Display

 

  • Title (Standard)
  • Body
  • Image (Style watermark)

Die hier gemachten Einstellungen gelten erstmal nur für die Default-Domain - alles Weitere wird dann über Preprocess-Funktionen auf Theme-Ebene gesteuert.

Auf Ebene der Domains vergeben wir einen eindeutigen machine_name - diesen Namen benötigen wir in unseren Preprocess-Funktionen. Über folgende kleine Helper-Funktion lässt sich der machine_name auslesen:

<?php
/** * Helper function to get current machine_name of domain. * - used in preprocess functions for setting corresponding image-styles for fields * @return string * machine_name of current domain */

function my_module_get_domain_machine_name() {
  $machine_name = FALSE;
  // Get machine_name for actual domain. $domain = domain_get_domain();
  if (!empty($domain) && !$domain['is_default']) {
    $machine_name = $domain['machine_name'];
  }
  return $machine_name;
}
?>

Da wir die Imagestyles auf der Default-Domain ohne Suffix angelegt haben, können wir diese beim Auslesen auch vernachlässigen.

Ändern der Ausgabe über Preprocess-Funktion

Über die theme_preprocess_node() lässt sich die Ausgabe der Felder in einem Node beeinflussen - hier setzen wir an, um das Wasserzeichen zu überschreiben.

<?php
/** * Implements template_preprocess_node(). */
function my_module_preprocess_node(&$vars) {
  // Check for node-type we want to preprocess.
  if ($vars['type'] == '{my_content_type}') {
    // Get machine name for domain.
    $domain_name = my_module_get_domain_machine_name();
    // Lookup field with image-style and add domain-name to style name.
    if (!empty($vars['content']['field_image'])) {
      $current_style = $vars['content']['field_image'][0]['#image_style'];
      $image_style = array($current_style, $domain_name);
      $vars['content']['field_image'][0]['#image_style'] = implode('_', array_filter($image_style));
    }
  }
}
?>

Bei Aufruf der Seite wird nun über die Preprocess-Funktion die Ausgabe des Imagestyles umgeschrieben. Über den ausgelesenen machine_name entscheidet die Preprocess-Funktion welchen Imagestyle sie verwenden sollte um die Bilder mit dem korrekten Wasserzeichen auszuliefern.

Im Einsatz ist das Ganze auf dem Stadtportal (row-people.de/ hb-people.de). Hier wurde die Logik um weitere preprocess Funktionen erweitert, um auch in den Views verschiedene Wasserzeichen in Bildern nutzen zu können (Bilderserien).