Typischer Head eines Templates

Natürlich geht auch: <html><head><title><?php page_title(); ?></title></head>...
Ein bisschen mehr macht aber auch ein bisschen glücklicher. 

Die extrem einfache Struktur von WBCE erlaubt es in Windeseile jede beliebige HTML-Seite zu einem Template zu konvertieren: Man braucht nur den Quellcode + CSS + JS in ein Verzeichnis speichern und danach die WBCE-typischen Schnippel reinkopieren.

In der Praxis wird man aber bald wollen, dass zb die Startseite anders aussieht als die übrigen Seiten, dass im Backend die gleichen Schriften und Farben verwendet werden wie im Frontend, dass es optionale Sidebars gibt und vieles mehr.

Hier kommt eine weitere Stärke von WBCE ins Spiel: Alles ist einfaches HTML und PHP. Man muss nicht das „Große Alles über CMS XX Handbuch“ lesen, sondern man findet alles in tausenden Foren zum Thema PHP. Fertige PHP-Schnippel, die man einfach einfügen kann.

<head>

Der Bereich bis zum <body>-Tag kann in jedem Template nahe gleich aussehen.

Zunächst wird unerlaubter Zugriff unterbunden:

if(!defined('WB_URL')) {
	header('Location: ../index.php');
	exit(0);
}

Gleich danach, im gleichen PHP-Block können grundsätzliche Variablen abgefragt werden, etwa, ob dies die Startseite ist.

Auf der Startseite ist die Variable $page_id nicht gesetzt. Das nutzen wir gleich, um das mal vorzumerken:

$isfrontpage = false;
if ( !isset($page_id) ) { $isfrontpage = true; }

Warum so eilig? Es kommt vor, dass schlampig programmierte Module die $page_id ändern - und dann hat sie einen Wert. Es kann also viel Fehlersuchen ersparen, das gleich zu erledigen, noch bevor ein Modul ins Spiel kommt.

Danach wird die Funktion SimplePageHead aufgerufen. Bei WBCE ist diese fix dabei, für WB braucht man eine Notlösung, damit zumindest die Hauptseiten eigene Titles und Metatags haben.
Diese Notlösung steht im else Zweig.

<?php 
if(function_exists('simplepagehead')) {
	simplepagehead(); 
} else { ?>
	<title><?php page_title(); ?></title>
	<meta http-equiv="Content-Type" content="text/html; charset=<?php if(defined('DEFAULT_CHARSET')) { echo DEFAULT_CHARSET; } else { echo 'utf-8'; }?>" />
	<meta name="description" content="<?php page_description(); ?>" />
	<meta name="keywords" content="<?php page_keywords(); ?>" />
<?php 
} 
?>

SimplePageHead ist nicht zwingend nötig, schon gar nicht, wenn man keine Module wie Bakery, Topics oder News nutzt. Aber: Es schadet nicht.

Jetzt kommen die Funktionen zur Integration aller nötigen CSS, jQuery und Javascript Dateien. Wichtig: Reihenfolgen beachten. Zuerst CSS, dann jQuery und dann erst JS, weil ja viele frontend.js bereits jQuery brauchen:

<?php  
if(function_exists('register_frontend_modfiles')) {
	register_frontend_modfiles('css');
	register_frontend_modfiles('jquery');
	register_frontend_modfiles('js');
}
?>

Wer eine andere jQuery-Version verwenden will, muss diese bereits vor diesem Block einbinden, dort natürlich auskommentieren – und beten, dass das funktioniert. Häufig klemmen dann Module.

Irgendwo hier hängt man dann die weiteren CSS und Javascript-Dateien ein. Ebenso Webfonts (wenn diese nicht besser gleich in die editor.css importiert sind)

<link rel="stylesheet" type="text/css" href="<?php echo TEMPLATE_DIR; ?>/editor.css"  />
<link rel="stylesheet" type="text/css" href="<?php echo TEMPLATE_DIR; ?>/template.css"  />
<meta name="viewport" content="width=device-width,
 initial-scale=1.0" />

Weitere Metatags nach Laune und Gefallen.

 

Jetzt gibt es 2 Möglichkeiten:

Natürlich kann man nach wie vor die Inhalte dort im Template aufrufen, wo sie dargestellt werden sollen. Das ist klar, sofort nachvollziehbar und wird keine Probleme machen.

Die andere Möglichkeit ist, die Inhalte zu puffern und in Variable zu schreiben:

<?php 
//Buffering content 1
ob_start(); page_content(1); $page_content_1 = ob_get_contents(); ob_end_clean();

//content 2
if(defined('TOPIC_BLOCK2') AND TOPIC_BLOCK2 != '') { 
	$page_content_2 = TOPIC_BLOCK2; 
} else {
	ob_start(); page_content(2); $page_content_2 = ob_get_contents(); ob_end_clean();
}
//Buffering content 3	
ob_start(); page_content(3); $page_content_3 = ob_get_contents(); ob_end_clean();
//Buffering content 4	
ob_start(); page_content(4); $page_content_4 = ob_get_contents(); ob_end_clean();
?>

Der Vorteil ist, dass mit diesen Variablen noch hantiert werden kann, etwa: Gibt es einen 2. Block? Wenn ja, stelle den ersten schmäler dar. Mehr noch: Manche Module definieren Konstante, die hier abgefragt werden können, etwa TOPIC_BLOCK2, die die Ausgabe für einen einen 2. Block enthalten kann.

Oder OG_IMAGE, die das Bild für ebendiesen Meta-Tag enthalten kann.

<?php 
if(defined('OG_IMAGE') AND OG_IMAGE != '') { 	echo '<meta property="og:image" content="'.OG_IMAGE.'"/>';}
?>

Das ist auch der Grund, warum man die Blöcke noch im <head> puffern sollte: Allfällige Meta-Tags können hier noch ausgegeben werden können.

Auch die Nachteile dieser Methode soll nicht verschwiegen werden: Kommt es zu schweren Fehlern (fatal error), erfolgt auch die Ausgabe der Fehlermeldung im <head>, wo sie nicht sofort entdeckt wird.

 

Gleich danach sollte der schließende </head> und öffnende <body> kommen. Es kommt immer wieder vor, dass Module „seltsame“ Sachen machen. Man sollte hier alles beisammen haben und sich nicht darauf verlassen, dass zb die $page_id noch ihren ursprünglichen Wert hat.

 

Daher jetzt gleich ein Wort zu ShowMenu2

Dieses Modul kann zur Weißglut treiben, und man sollte alles vermeiden, was zusätzliche Fehler verursachen kann.
Es ist keine blöde Idee, alle Menüs noch VOR der Ausgabe der Content-Blöcke zu puffern.

Zurück

Kommentare:

Wäre es Performancetechnisch nicht besser das register_frontend_modfiles('js'); aus dem head erhauszunehmen und erst vor dem </body> einzubauen?

Christoph am 12.04.2016
Antworten

Wie es aussieht schluckt das Kommentar-System HTML Befehle.

Sollte eigentlich "erst vor dem Bodyende einzubauen?" heien.

PS: Wo kann ich sehen welche Jquery Version bei WBCE verwendet wird?

Christoph am 12.04.2016
Antworten

Ja, bei Kommentaren werden alle Tags gelscht.

Fr JS, das ganz nach unten soll, gibt es
if (function_exists('register_frontend_modfiles_body')) { register_frontend_modfiles_body(); }

Es hngt eben immer davon ab, was ein Script macht.

Chio am 12.04.2016
Antworten

Hallo Chio. Ich finde die Idee, ob Startseite oder nicht in eine Variable zu puffern, super. Ich weiss nur nicht genau wie sich die Startseite definiert, also welche Seite (und warum) damit gemeint ist. Kannst du mir da bitte etwas weiterhelfen? Danke und freundliche Grsse.

Andy am 27.04.2016
Antworten

Auf der Startseite ist die Variable $page_id nicht gesetzt - steht ja oben:
if ( !isset($page_id) ) { $isfrontpage = true; }

Chio am 27.04.2016
Antworten

Das hatte ich so schon verstanden. Meine Frage war auch mehr wie sich die Startseite definiert. Vielleicht etwas naiv gefragt, sorry. Ich hatte da die Seiten- und Menu-Struktur im Kopf und schneller gepostet als nachgedacht. Nichts fr ungut und freundliche Grsse.

Andy am 27.04.2016
Antworten