Global Blocks - Globale Inhalte |
Mit Hilfe eines ||CMS|| wie ||Website Baker|| hat man es auch dementsprechend einfach, die Inhalte dieser "global blocks" zu pflegen - also zu ändern. Man muss nicht jedesmal alle seine Seiten durchgehen und dort Hand anlegen, sondern man erledigt es genau einmal und die Änderung ist "global" erfolgt. Oder sogar mithilfe von ||PHP|| können solche Inhalte ganz automatisch aktuell bleiben (z.B. zeigt das Snippet "Anynews" automatisch die letzten Posts einer "News"-Seite an).
Im wesentlichen gibt es zwei Möglichkeiten, gleiche Inhalte an mehreren Stellen verfügbar zu machen. Entweder man bedient sich eines Moduls, ||Droplets||, oder man verwendet eigene Codezeilen im ||Template|| selbst oder auch in einem Code (oder auch Code²)-Abschnitt.
Dieses Modul heißt schlicht und einfach "Section Picker" und ist hier herunterzuladen.
Die Verwendung ist ganz einfach. Man kann sich Inhalte z.b. in einer versteckten Seite anlegen und diese dann auf den für alle sichtbaren Seiten mit dem ||Seitentyp|| "Sectionpicker" auswählen.
Der Section Picker ist das Mittel der Wahl, um Inhalte jederzeit im Backend leicht änderbar anders zusammenzustellen, oder auch Inhalte mehr als einmal auszugeben und dabei nur an einer Stelle Änderungen vorzunehmen.
Eine weitere Möglichkeit ist die sehr einfache Anzeige eines versteckten ||WYSIWYG|| Blocks mit Hilfe eines ||Droplets||.
Eine einfache Anleitung zum Einsatz von ||Droplets|| findest Du auf ||AMASP||.
Als Beispiel hier der Aufruf des ||Droplets|| "ShowSection":
[ [showsection?section=51] ] //ohne leerzeichen zwischen den Klammern verwenden!
Dieser kurze Text wird durch den Inhalt des Blockes mit der ||Section ID|| 51 ersetzt. Diesen Aufruf kann man beliebig oft verwenden, die Inhalte muss aber nur einmal bearbeiten. Du kannst sogar dieses ||Droplet|| in der index.php Deines ||Templates|| verwenden und so hast Du einen Globalen Block auf jeder Seite, auf der Du dieses ||Template|| verwendest.
Eine sehr einfache Form, eine komplette Seite samt Inhalten als globalen Block z.B. im Template darzustellen, funktioniert über den ||PHP|| Befehl include.
Hier ein kleines Beispiel:
<?php include (WB_URL."/pages/block1.php"); ?>
Die Seite "block1" wird durch diesen Aufruf in einem ||Website Baker|| Template geladen und auf jeder Seite dargestellt.
Diese Methode ist nicht auf allen Systemen erlaubt. Manche Server- und Webspacebetrieber verbieten diesen Aufruf aus scheinbar sicherheitstechnischen Gründen.
Eine weitere Methode ist das Einbinden mit Hilfe der cURL Erweiterung für ||PHP||. Ob Du auf diese Funktionen zurückgreifen kannst, findest Du herraus indem Du einfach folgenden code in eine Seite mit dem ||Seitentyp|| "Code" kopierst.
phpinfo();
Dort muss dann unter Erweiterungen/Extensions ein Eintrag zu cURL stehen.
Wenn Du diesen Eintrag findest, kannst Du folgenden Code zum einbinden eines globalen Blocks in deinem Template oder einer Codeseite benutzen.
Hier ein kleines Beispiel:
<?php $ch = curl_init(); $timeout = 5; // set to zero for no timeout curl_setopt ($ch, CURLOPT_URL, WB_URL.'/pages/pagename.php'); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $file_contents = curl_exec($ch); curl_close($ch); // display file echo $file_contents; ?>
Ja, das geht über eine Datenbankabfrage recht einfach. Gleiches Problem: eine Section mit Inhalt soll an einer anderen Stelle, oder sogar auf jeder Seite im ||Template|| verwendet werden.
Wenn Du den gleichen Effekt wie mit dem SectionPicker Modul erreichen willst, kannst Du den folgenden Codeabschnitt in einer Code-, oder auch Code²-Section verwenden. Bitte kopiere ihn dann aber ohne:
<?php .... ?>
Denn Code in diesen beiden Modulen wird immer als PHP Code ausgeführt. (Mit dem Code²-Modul gibt es noch weitere Möglichkeiten)
Hier nun das Beispiel für die Datenbankabfrage und Ausgabe einer beliebigen anderen Section:
<?php // beliebige Section ID im Backend unter Abschnitte verwalten ablesen und eintragen! $section_id = 65; // Datenbankabfrage für den gesuchten Abschnitt $query_sections = $database->query("SELECT section_id,module FROM ".TABLE_PREFIX."sections WHERE section_id = '$section_id' "); // Abfrage ob diese auch existiert und Ausgabe if($query_sections->numRows() > 0) { $section = $query_sections->fetchRow(); $section_id = $section['section_id']; $module = $section['module']; require(WB_PATH.'/modules/'.$module.'/view.php'); } ?>
Wir können nun perfekte globale Inhalte erzeugen und auch in unser Template einbauen. Soweit so gut, nun wollen wir aber, dass wir auf manchen Seiten gezielt etwas anderes darstellen.
Also ein "Standard-Inhalt" für alle Seiten (=Globaler Block im ||Template||) und auf einigen Seiten "Spezial-Inhalt" ausgeben.
Dafür braucht man im Template einen zusätzlichen Inhaltsblock. Wer nicht weiß, wie man diesen anlegt, kann in der ||Website Baker|| Hilfe nachschauen.
Diesen Inhaltsblock laden wir mit Hilfe des sogenannten Ausgabepuffers in eine Variable. Dann prüfen wir, ob dieser Block Inhalte hat, also ob im Backend auf dieser Seite ein Abschnitt für in meinem Beispiel Block 2 angelegt wurde. Wenn keine Inhalte vorhanden sind, wird der Standardinhalt (Wahl über eine Section ID) ausgegeben.
Hier das Beispiel:
<!-- Globaler Block beginnt hier --> <?php ob_start(); page_content(2); //in diesem Fall Page Content Block 2 $glblock=ob_get_contents(); ob_end_clean(); if ($glblock=="") { $section_id = 65; // Hier den Standardinhalt eintragen bzw. die passende Section ID $query_sec = $database->query("SELECT section_id,module FROM ".TABLE_PREFIX."sections WHERE section_id = '$section_id' "); if($query_sec->numRows() > 0) { $section = $query_sec->fetchRow(); $section_id = $section['section_id']; $module = $section['module']; require(WB_PATH.'/modules/'.$module.'/view.php'); } } else { echo '<div id="global_block">'; //hier eine css #id Deiner Wahl echo $glblock; // Ausgabe entweder Standardinhalt oder page_content(2) der angezeigten Seite echo '</div>'; } ?> <!-- end of the global block -->
Im Forum findet man dafür von sehr vielen Programmierern auch ganz andere Ansätze, die ich technisch auch nicht mehr nachvollziehen kann, aber trotzdem teilweise sehr gut und einfach funktionieren. Dieses Beispiel habe ich schon selbst getestet, aber das garantiert keineswegs, dass es auch funktioniert! Nur will ich mit diesem Tutorial auch zeigen, dass es hier keine Grenzen zu diesem umfassenden Thema gibt und für jedes individuelle Problem auch ganz eigenständige Lösungen möglich sind. Den ||Website Baker|| hat in solchen Dingen sehr viele Möglichkeiten.
global $wb; $wb->page_id = 14; page_content(2); $wb->page_id = 16; //I am not sure this is really necessary but just in case...
Hier möchte ich allen danken, die im ||Forum|| so gute Arbeit leisten und auch ihre kleinen genialen Erfindungen mit der Gemeinde teilen. Denn diese Beispiele habe auch ich nur im Forum gefunden. Ich hoffe aber, einmal die meisten Möglichkeiten übersichtlich zusammengeführt zu haben.
Martin Freudenreich