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...

  1. 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".
  2. 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.

Zurück

Einen Kommentar schreiben

Kommentar von Greg | 05.05.2010

Hallo!

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,

  1. Man erweitert die SQL Abfrage um "content_text".
  2. Im nächsten Schritt wird "$box_contents[$tpl][]" um "content"=> $content['content_text'] erweitert.
  3. Im Template kann man nun Ausgabe via "{$data.content}" erzeugen.

Umfrage

Nutzen Sie Ihr Smartphone für Online Shopping?
Gesamtanzahl der Stimmen= 39
Ja, ab und zu
23%
Ja, regelmäßig
18%
Nein
23%
Habe kein Smartphone
36%