Dynamische Content Boxen mit Content Manager
02. Nov 2009 17:02 2 Kommentare
Der Content Manager erfüllt leider nur teilweise seinen Zweck, man kann zwar beliebig viele Links in zwei der Content Boxen "content" und "information" platzieren aber um eine weitere Box einzufügen, braucht man PHP-Kenntnisse. Und genau dieses Problem möchten wir mit unserer Lösung aus dem Weg schaffen.
Was macht die Lösung denn genau?
Die einzige PHP-Datei, nur 110 Zeilen (gut fomatiert) lang erzeugt automatisch alle Content Boxen und füllt sie mit
Inhalt (Links). Die Links können nach Wunsch und Layout Vorgaben mit
CSS formatiert werden. Das manuelles Erstellen der PHP-Dateien entfällt hier komplett, auch der Box Templates (bei einheitlichem Design).
Natürlich kann man die Box Templates/Vorlagen anlegen aber für den Betrieb ist nur eine einzige Vorlage notwendig, namens "box_content.html".
Installation
Schritt 1: Eine neue Datei erstellen und als "contents.php" unter /templates/xtc5/source/ abspeichern.
<?php
/**
* Dynamische Content Boxen
* Copyright 2009 Sergej Stroh, Southbridge Media.
* www.southbridge.de
*
*/
define('TABLE_CM_FILE_FLAGS', 'cm_file_flags');
function getContentFlags() {
global $smarty;
$box_smarty = new smarty;
$box_smarty->assign('language', $_SESSION['language']);
$box_smarty->assign('tpl_path', 'templates/'.CURRENT_TEMPLATE.'/');
if(!CacheCheck()) {
$cache=false;
$box_smarty->caching = 0;
} else {
$cache=true;
$box_smarty->caching = 1;
$box_smarty->cache_lifetime = CACHE_LIFETIME;
$box_smarty->cache_modified_check = CACHE_CHECK;
$cache_id = $_SESSION['language'].$_SESSION['customers_status']['customers_status_id'];
}
if(GROUP_CHECK == 'true')
$group_check = "AND group_ids LIKE '%c_".$_SESSION['customers_status']['customers_status_id']."_group%'";
$box_contents = array();
// Load Flags
$flags_query = "
SELECT
file_flag,
file_flag_name
FROM
".TABLE_CM_FILE_FLAGS."
ORDER BY
file_flag ASC";
$flags_query = xtDBquery($flags_query);
while($flags = xtc_db_fetch_array($flags_query, true)) {
$tpl = strtolower($flags['file_flag_name']);
$tpl_file = CURRENT_TEMPLATE.'/boxes/box_'.$tpl.'.html';
$box_contents[$tpl] = array();
if(!$box_smarty->is_cached($tpl_file, $cache_id.$tpl) || !$cache) {
$rebuild = true;
$content_query = "
SELECT
content_id,
content_title,
content_heading,
content_group,
file_flag
FROM
".TABLE_CONTENT_MANAGER."
WHERE
content_status = 1
AND
file_flag = '".$flags['file_flag']."'
AND
languages_id = '".(int)$_SESSION['languages_id']."'
".$group_check."
ORDER BY
sort_order ASC";
$content_query = xtDBquery($content_query);
while ($content = xtc_db_fetch_array($content_query, true)) {
$seo = '';
$css = '';
if (SEARCH_ENGINE_FRIENDLY_URLS == 'true')
$seo = '&'.xtc_cleanName($content['content_title']).'.html';
if ($_GET['coID'] == $content['content_group'])
$css = 'active';
$box_contents[$tpl][] = array(
'title' => $content['content_title'],
'link' => xtc_href_link(FILENAME_CONTENT, 'coID='.$content['content_group'].$seo),
'css' => $css
);
}
$box_smarty->assign('contents', $box_contents[$tpl]);
}
if ($rebuild) {
if (file_exists (DIR_FS_CATALOG . 'templates/' . $tpl_file))
$box_content = $box_smarty->fetch($tpl_file,$cache_id.$tpl);
else
$box_content = $box_smarty->fetch(CURRENT_TEMPLATE.'/boxes/box_content.html',$cache_id.$tpl);
} else {
if (file_exists (DIR_FS_CATALOG . 'templates/' . $tpl_file))
$box_content = $box_smarty->fetch($tpl_file,$cache_id.$tpl);
else
$box_content = $box_smarty->fetch(CURRENT_TEMPLATE.'/boxes/box_content.html',$cache_id.$tpl);
}
$smarty->assign('box_'.strtoupper($tpl), $box_content);
}
}
getContentFlags();
?>
Schritt 2: Vorhandene Boxen auskommentieren.
In der Datei "boxes.php" unter /templates/xtc5/source/ nach folgenden Zeilen suchen und zwei Slashes davor setzen.
//require(DIR_WS_BOXES . 'content.php'); //require(DIR_WS_BOXES . 'information.php');
Schritt 3: Neue Datei "contents.php" einbinden.
In die selbe Datei "boxes.php" binden wir nun unsere neue Datei ein.
require('contents.php');
Schritt 4: In diesem letzten Schritt soll die Box Vorlage "box_content.html" unter /templates/xtc5/boxes/ angepasst werden.
Wir ersetzen die Variable "{$BOX_CONTENT}" durch dies hier:
<ul>
{foreach name=cnt item=data from=$contents}
<li{if $data.css} class="{$data.css}"{/if}><a href="{$data.link}">{$data.title}</a></li>
{/foreach}
</ul>
Wie bindet man nun die Boxen im Template ein
Nun, eigentlich genau so wie vorher.
Man sollte aber stets auf Grossschreibung des Keywords achten, z.B. {$box_INFORMATION}.
Wie legt man eine neue Content Box an?
Die Box Variablen sind abhängig von den Einträgen in der Tabelle "cm_file_flags" und sind nach diesen benannt. D.h. Inhalt des Eintrages "information" ist über "{$box_INFORMATION}" erreichbar und "content" über "{$box_CONTENT}" usw.
Um eine neue Box einzufügen...
- Einen neuen Eintrag in der Tabelle "cm_file_flags" machen. (Vielleicht schreibe ich da eine kleine Erweiterung für Administration in einer der nächsten Tutorials).
Dieser Eintrag steht dann als Auswahlmöglichkeit unter Content Manager (Administration).
Beispiel: Ich möchte eine neue Box "info" haben. Ich mache einen neuen Eintrag "info" in der Tabelle "cm_file_flags". Dann füge ich die neue Box Variable "{$box_INFO}" in das Template "index.html". - Optional kann auch einen neue Box Vorlage namens "box_info.html" erstellt werden.
Schlusswort
Mit unserer neuen Funktion entfällt nun eine Menge Arbeit und alle unsere Boxen werden dynamisch erzeugt und mit Inhalt befüllt. Auch die Cache (DB Cache und Template Cache) Funktion wird für jede Box berücksichtigt, so dass bei vielen Boxen die Webserver Resourcen etwas geschonnt werden.
Die Funktion kann auch noch weiter optimiert werden, so dass alle SQL-Abfragen auf max. 2 reduziert werden.

Einen Kommentar schreiben
Kommentar von Greg | 05.05.2010
Vielen Dank für die super Anleitung, ich habe allerdings noch eine Frage zu den Boxen.
Wie kann man es anstellen, dass in den Boxen nicht der Link zum Content, sonder der Content selbst angezeigt wird?
Kommentar von gste | 22.11.2010
Ich würde mich meinem "Vorschreiber" anschließen.
Wie bekomme ich Inhalt in die Boxen? Nicht nur den Link dazu?
---
Southbridge Media
Ist eigentlich ganz easy,