Service Individuelle Programmierung, Dienstleistungen
 
Blog Neuigkeiten, Informationen, Tipps & Tricks
 
Add-ons Für WebsiteBaker, LEPTON CMS & BlackCat CMS
 
kitFramework Das kitFramework unterstützt ihr CMS mit Erweiterungen
 
Usergroup Berlin Die Themen und Termine für die Treffen in Berlin
 
 
 
 

DropletsExtension - der Nachbrenner für ihre Code-Schnipsel

Es gibt Leute, die behaupten Droplets machen süchtig. Dafür gibt es gute Gründe, ich kenne kein anderes Content Management System, das über eine ähnlich leistungsfähige und flexible Möglichkeit verfügt an einer beliebigen Stelle mit einem einfachen Befehl Datenbankabfragen und Programmcode einzubinden.

DropletsExtensionSolange Droplets dazu verwendet werden beispielsweise mitten im Fliesstext auszurechnen, dass es noch 244 Tage dauert, bis das Christkind wieder vor der Tür steht, also kleine und einfache Berechnungen oder Datenbankabfragen durchzuführen, ergeben sich daraus keinerlei Nachteile. Droplets werden jedoch auch als Schnittstelle für vollständige Anwendungen genutzt und bilden z.B. eine Brücke zwischen einem Admin-Tool im Backend und der Interaktion mit dem Frontend.

Hieraus ergeben sich neue und sehr anpassungsfähige Anwendungsmöglichkeiten. So können Termine und Veranstaltungen mit kitEvent zentral und übersichtlich mit Hilfe eines Admin-Tools verwaltet und organisiert werden, die Ausgabe erfolgt an unterschiedlichen Stellen auf der Website. Diese Flexibilität wird durch Droplets überhaupt erst möglich.

Wo ist der Haken dabei?

Die Platzhalter für die Droplets werden unmittelbar vor der Anzeige einer Webseite herausgefiltert, der Code des Droplets ausgeführt und das Ergebnis des Mini-Programms an Stelle des Platzhalters auf der Seite eingefügt und die fertige Webseite danach im Browser angezeigt:

  • Nichts von dem, was ein Droplet berechnet, bei einer Datenbank abfragt und anzeigt wird von der WebsiteBaker oder LEPTON CMS Suchfunktion berücksichtigt - Droplets werden vollständig und sehr konsequent ignoriert.
  • Droplets haben keinen Einfluss auf den Seitentitel sowie auf die im Dateiheader enthaltene Kurzbeschreibung (description) und die aufgelisteten Schlüsselwörter (keywords), selbst dann nicht, wenn Sie den Inhalt einer Seite vollständig bestimmen.
  • Droplets können im Unterschied zu Seitenmodulen Cascading Stylesheets (CSS) nicht automatisch laden, der verantwortliche Webmaster muss den erforderlichen CSS Code von Hand im Stylesheet der Website einbinden.

Diese Nachteile behebt DropletsExtension vollständig, der Programmierer erhält eine Schnittstelle über die er seinem Droplet die gewünschten Fähigkeiten zur Verfügung stellen kann.

Wie funktioniert es?

Der erste Schritt besteht darin, das Seitenmodul DropletsExtension zu installieren. Dieses Seitenmodul erfüllt keinen unmittelbar sichtbaren Zweck, es muss vorhanden sein und es muss letztlich genau einmal auf irgendeiner Seite als zusätzlicher Abschnitt eingebunden sein. DropletsExtension bildet eine Brücke zwischen beliebigen Droplets und der Suchfunktion des Content Management System. Hierfür stellt es den Droplets ein Interface zur Verfügung.

Ein Droplet in die WebsiteBaker Suchfunktion einbinden

Zunächst muss das Droplet das DropletsExtension Interface einbinden:

// Connect with DropletsExtension Interface
if (file_exists(WB_PATH.'/modules/droplets_extension/interface.php')) {
  require_once(WB_PATH.'/modules/droplets_extension/interface.php');
}

Der nächste Schritt besteht darin, dass das Droplet sich bei DropletExtension für die Suchfunktion des CMS registriert:

// Register Droplet for the WebsiteBaker Search Function
if (function_exists('is_registered_droplet_search') && !is_registered_droplet_search('droplet_name', PAGE_ID)) {
  register_droplet_search('droplet_name', PAGE_ID, 'module_directory');
}

Die Funktion is_registered_droplet_search() dient dazu abzufragen, ob das angegebene Droplet bereits für die Suche in WebsiteBaker bzw. LEPTON CMS registriert ist, register_droplet_search() dient dazu das Droplet für die Suche anzumelden. Verwendet werden hierbei drei Parameter:

  • droplet_name ist der Bezeichner des jeweiligen Droplet
  • die Konstante PAGE_ID enthält die ID der Seite, auf der sich das Droplet befindet
  • module_directory ist der Name des /modules Verzeichnis im Content Management System, in dem sich das Addon befindet zu dem das jeweilige Droplet gehört.

Die WebsiteBaker und LEPTON Suche arbeitet in zwei Schritten. Im ersten Schritt werden die Seiteninhalte durchsucht und im zweiten Schritt erhalten Seitenmodule (und nur diese!) die über eine search.php im Modulverzeichnis verfügen eine Aufforderung die Inhalte bereitzustellen, die bei der Suche berücksichtigt werden sollen. DropletExtension reicht diese Aufforderung über seine eigene search.php an die jeweiligen Droplets durch.

Hierzu sucht DropletExtension im Modulverzeichnis der registrierten Droplets nach der Datei droplet.extension.php und in dieser Datei nach der Funktion module_directory_droplet_search($page_id, $page_url) - wobei module_directory durch den tatsächlichen Verzeichnisnamen des jeweiligen Addon zu ersetzen ist! DropletExtension liefert der Funktion die $page_id der Seite für die ein Suchergebnis zu liefern ist und zusätzlich mit $page_url die vollständige URL der Seite.

Als Rückgabe erwartet DropletExtension eine Gruppe von assoziativen Arrays mit der Struktur:

foreach ($items as $item) {
  $result[] = array(
    'url'           => $page_url,      // URL der Seite, die die Fundstelle anzeigt 
    'params'        => $params,        // zusaetzliche Parameter die uebergeben werden sollen
    'title'         => $title,         // Titel der Fundstelle
    'description'   => $description,   // Kurzbeschreibung der Fundstelle
    'text'          => $text,          // der zu durchsuchende Text der Fundstelle
    'modified_when' => $modified_when, // UNIX Timestamp
    'modified_by'   => $modified_by    // User ID
  );
}

Wobei die Funktion module_directory_droplet_search($page_id, $page_url) einfach alle in Frage kommenden Fundstellen zurückliefern soll - die eigentliche Suche wird von der WebsiteBaker Suchfunktion durchgeführt, die hierzu auf das Feld 'text' zugreift. Liefern Sie der Suchfunktion in dem Feld 'text' plain text ohne HTML Formatierungen. 

In dem Addon kitEvent sieht der vollständige Funktionsaufruf so aus:

function kit_event_droplet_search($page_id, $page_url) {
  global $dbEvent;
  global $dbEventItem;
  global $parser;

  $SQL = sprintf( "SELECT * FROM %s,%s WHERE %s.%s=%s.%s AND %s='%s' ORDER BY %s DESC",
                  $dbEvent->getTableName(),
                  $dbEventItem->getTableName(),
                  $dbEvent->getTableName(),
                  dbEvent::field_event_item,
                  $dbEventItem->getTableName(),
                  dbEventItem::field_id,
                  dbEvent::field_status,
                  dbEvent::status_active,
                  dbEvent::field_event_date_from);
  $events = array();
  if (!$dbEvent->sqlExec($SQL, $events)) {
    trigger_error(sprintf('[%s - %s] %s', __FUNCTION__, __LINE__, $dbEvent->getError()), E_USER_ERROR);
    return false;
  }
  $result = array();
  $htt_path = WB_PATH.'/modules/'.basename(dirname(__FILE__)).'/htt/';
  $tpl_title = new Dwoo_Template_File($htt_path.'search.result.title.htt');
  $tpl_description = new Dwoo_Template_File($htt_path.'search.result.description.htt');
  foreach ($events as $event) {
    $result[] = array(
      'url' => $page_url,
      'params' => http_build_query(array(eventFrontend::request_action => eventFrontend::action_event,
                                         eventFrontend::request_event => eventFrontend::view_id,
                                         eventFrontend::request_event_id => $event[dbEvent::field_id],
                                         eventFrontend::request_event_detail => 1)),
      'title' => $parser->get($tpl_title, array('date_time' => sprintf('%s %s', date(event_cfg_datetime_str, strtotime($event[dbEvent::field_event_date_from])), event_text_hour),
                                                'title' => $event[dbEventItem::field_title])),
      'description' => $parser->get($tpl_description, array('description' => strip_tags($event[dbEventItem::field_desc_short]))),
      'text' => strip_tags($event[dbEventItem::field_desc_short]).' '.strip_tags($event[dbEventItem::field_desc_long]),
      'modified_when' => strtotime($event[dbEvent::field_timestamp]),
      'modified_by'  => 1 // admin
    );
  }
  return $result;
} // kit_event_droplet_search()

Das Ergebnis kann sich sehen lassen.

Die Seitenbeschreibung durch ein Droplet festlegen lassen

Damit die Beschreibung einer Seite beliebig verändert werden kann, ist es erforderlich das Template der Website in diese Dynamik einzubeziehen. Hierzu dient eine spezielle Funktion von DropletsExtension die anstatt der Standard Aufrufe für die Seitenbeschreibung, Schlüsselwörter und den Seitentitel eingebunden wird.

Ersetzen Sie hierzu im Template der Website die Aufrufe:

<meta name="description" content="<?php page_description(); ?>" />
<meta name="keywords" content="<?php page_keywords(); ?>" />
<title><?php page_title('', '[WEBSITE_TITLE]'); ?></title>

durch die folgenden Zeilen:

<?php
  if (file_exists(WB_PATH.'/modules/droplets_extension/interface.php')) {
    require_once(WB_PATH.'/modules/droplets_extension/interface.php');
    print_page_head();
  }
  else { ?>
    <meta name="description" content="<?php page_description(); ?>" />
    <meta name="keywords" content="<?php page_keywords(); ?>" />
    <title><?php page_title('', '&#91;WEBSITE_TITLE&#93;'); ?></title>
  <?php }
?>

Die Funktion print_page_head() funktioniert vom Prinzip her wie das bekannte simplepagehead() von Chio Maisriml und unterstützt ebenfalls Topics sowie das News Modul.

Als nächstes definieren Sie in der Datei droplet.extension.php die Funktion module_directory_droplet_header($page_id), wobei Sie module_directory wieder durch den tatsächlichen Verzeichnisnamen des jeweiligen Addon ersetzen.

DropletsExtension ruft die Funktion module_directory_droplet_header($page_id) auf und erwartet die Rückgabe eines assoziativen Array, das folgende Angaben enthält:

$result = array(
  'title'       => $title,       // Seitentitel
  'description' => $description, // Kurzbeschreibung
  'keywords'    => $keywords     // Schluesselwoerter
);

Zu guter Letzt muss sich das Droplet noch bei DropletsExtension registrieren:

if (function_exists('is_registered_droplet_header') && !is_registered_droplet_header('droplet_name', PAGE_ID)) {
  register_droplet_header('droplet_name', PAGE_ID, 'module_directory');
}

... und schon kann das Droplet die Seitenbeschreibung selbst nach Belieben festlegen.

Automatisch ein Cascading Stylsheet für das Droplet laden

Jetzt fehlt nur noch die Möglichkeit, dass automatisch ein bestimmtes CSS-Stylesheet für das Droplet geladen wird. Die Voraussetzung hierfür ist, dass die Funktion print_page_head() im Template der Website eingebunden ist.

Das Droplet registriert einfach das gewünschte Template bei DropletsExtension:

if (function_exists('is_registered_droplet_css') && !is_registered_droplet_css('droplet_name', PAGE_ID)) {
  register_droplet_css('droplet_name', PAGE_ID, 'module_directory', 'frontend.css');
}

Die angegebene CSS-Datei muss sich im Verzeichnis des jeweiligen Moduls befinden.

Automatisch eine JavaScript Datei für das Droplet laden

Die Einbindung einer JavaScript Datei für das Droplet funktioniert genauso einfach. Auch hier ist die Voraussetzung, dass die Funktion print_page_head() im Template der Website eingebunden ist:

if (function_exists('is_registered_droplet_js') && !is_registered_droplet_js('droplet_name', PAGE_ID)) {
  register_droplet_js('droplet_name', PAGE_ID, 'module_directory', 'javascript.js');
}

Die angegebene JavaScript-Datei muss sich im Verzeichnis des jeweiligen Moduls befinden.

Ralf Hertsch - 23.05.2011

Feedback - Ihre Meinung interessiert uns!

E-Mail*
Nickname*
Website / Homepage
Betreff*
Feedback*
 

Verwenden Sie die Markdown Syntax zur Text Formatierung!

E-Mail bei neuen Kommentaren
 

Ihre E-Mail Adresse wird nicht veröffentlicht. Wenn Sie uns die URL Ihrer Website bzw. Homepage mitteilen, setzen wir automatisch einen Backlink für Sie!

Die Benachrichtigung bei neuen Kommentaren bezieht sich ausschließlich auf diese Seite und kann jederzeit wieder abbestellt werden.

 
Bitte Text eintragen
 
 
 
DropletsExtension

DropletsExtension

DropletsExtension erweitern die Möglichkeiten von Droplets um die Einbindung in die Suchfunktion, das Setzen von Seitentiteln, Beschreibungen, Laden von CSS, JS u.v.a.m.

Webseiten optimal in den sozialen Netzwerken präsentieren

Die DropletsExtension helfen Ihnen dabei Ihre Seite optimal in den sozialen Netzwerken zu präsentieren und darzustellen.

Creative Commons License

Sofern nicht ausdrücklich etwas anderes vermerkt ist, sind auf der phpManufaktur veröffentlichte Inhalte unter einer Creative Commons Attribution License lizenziert.