Tag in Seitenstruktur

Dieser RT soll zeigen, wie mit Hilfe von Tags in der Seitenstruktur die Seitenausgabe beeinflusst werden kann.

Angenommenes Problem:

In jeder der vier Jahreszeiten soll eine spezielle CSS-Dateien geladen werden. Darüberhinaus soll im Template abhängig von der eingestellten Jahreszeit z.B. ein anderes Bild geladen werden.



Vorgehensweise:

In der Seitenstruktur im Feld “Beschreibung der Seitenebene” von “HOME” (also ID=0) wird ein Tag eingetragen der das Verhalten des RTs im /frontend_render/ steuert, z.B.

[JAHRESZEITEN] #Tag1, #Tag2, Tag3, #Tag4,...[/JAHRESZEITEN]

Der Umschließer [JAHRESZEITEN] trennt die Tags von den restlichen Eintragungen in diesem Feld.
Die nicht gültigen Tags werden einfach mit einem vorangestellten # deaktiviert. (Im Bsp. oben ist also Tag3 aktiv).

Achtung, beim nächsten Update bitte darauf achten, dass die Datei config/phpwcms/conf.indexpage.inc.php vorher gesichert und danach abgeglichen wird. (Das ist der Spezialfall “HOME”)
Die Datei kann übrigens auch per FTP editiert werden um die Tags zu ändern 8-) :!:

Im RT werden die entsprechenden Tags ebenfalls eingetragen, z.B. (im aktiven Status eintragen also ohne #)

$my_tags = 'fruehling, sommer, herbst, winter';

Auf diese hier eingetragenen Tags wird das Feld “Beschreibung der Seitenebene” untersucht. Kommt es zur ersten Übereinstimmung, wird dieser Tag herangezogen und weiterverarbeitet. Es ist nur ein Tag gültig.

CSS ersetzen:

Eine neue CSS-Datei soll in Abhängigkeit vom Tag geladen werden. Um dem Problem “Reihenfolge der CSS-Dateien” zu begegnen, wird eine Dummy- bzw. Fallback-CSS-Datei in template/inc_css/* angelegt und an der richtigen Stelle im Template (Vorlage) eingebunden.
Diese CSS-Datei wird durch den RT genau an dieser Stelle ausgetauscht. Im RT wird dazu der Name der zu tauschenden CSS-Datei angegeben:

$my_css  = 'master_template.css';

Achtung: Groß/Kleinschrift beachten!

Der Name der ausgetauschten CSS-Datei ist hier der Einfachheit halber gleich dem Namen des Tags, z.B.
Tag = sommerCSS-Datei = specific/sommer.css (die Ersatz-CSS-Dateien liegen im Verzeichnis template/inc_css/specific/)

Das Ergebnis ist hier sichtbar:

Kein Tag aktiv:


Der Tag “Winter” aktiv:


Meta-Text für “description” bei aktiver Seite “Home” (ID=0 alias=index)


Content ersetzen:

Natürlich ist es auch möglich bestimmten Content auszutauschen.

Im unteren Bereich des Skriptes V1.1 sind einige Beispiel aufgezeigt (Custom Funktionen).

Bsp01.: direktes ersetzen im Template/Content

  • Die php Function str_replace('Suchmuster', 'wird ersetzt durch', 'zu durchsuchender Inhalt'); wird verwendet.
    $content['all'] = str_replace('Suchmich Wort',Tolles Wort', $content['all']);


Bsp02.: Ersetzen mit Umschlieszer (wrapper) im Template/Content

In der Vorlage/Content steht z.B.: “Jetzt [SEASON]im Jahr ist es farbig[/SEASON].”

  • Mit Hilfe der eingebauten Funtion replace_cnt_template('zu durchsuchender Inhalt', 'TAG', 'wird ersetzt durch'); kann das recht einfach realisiert werden:
    $content['all'] = replace_cnt_template($content['all'], SEASON, 'im Winter ist es weiß');


Bsp03.: Ersetzen mit Tag {TAG} im Template/Content

In der Vorlage/Content steht z.B.: “Jetzt ist der {SEASON} da.”

  • Wie oben wird hier die php Funktion str_replace(…); verwendet.
    $content['all'] = str_replace('{SEASON}', 'Winter', $content['all']);


Sicherheitshalber muss nun noch geprüft werden, ob noch Umschließer-Reste im Content vorhanden sind (Das passiert z.B. wenn kein TAG trifft).

Dazu kommt noch die Voreinstellung (Fallback) bei einem Einzelersetzer wie z.B. {ERSETZE}. Trifft kein Tag aus unserer Liste, muss hier ein Default-Wert eingetragen werden.

  • $content['all'] = str_replace('{ERSETZE}', 'Default-Wert', $content['all']);


Code

rt_tag_in_site_structure V1.0 26.11.09

Docu: –
Forum: http://forum.phpwcms.org/viewtopic.php?p=121111

Autor: K.Heermann (flip-flop) http://planmatrix.de
CMS Version: >= 1.3
Version: V1.0

Tag: –

Dateiname: rt_tag_in_site_structure.php

Verzeichnis: template/inc_script/frontend_render/

Bedingung:/config/phpwcms/conf.inc.php

  • $phpwcms['allow_ext_render'] = 1;



V1.0:

rt_tag_in_site_structure

<?php
/**
 * 26.11.09 KH (flip-flop) tags in site structure "category infotext"
 * This RT is to show how with can the help of tags in the page structure, the output of the pages can be influenced.
 *
 * Usage: sample Replacement Tag
 *
 * in the field "category infotext" in site structure (in this example we uses
 * the category HOME)
 *
 * Tag:
 * -> [JAHRESZEITEN]#Fruehling, #Sommer, #Herbst, Winter[/JAHRESZEITEN]
 *    (We trigger on "Winter", there is no # in front)
 *
 * Meta descrition if you want:
 * -> My descrition text for home
 *
 * Corresponding tags/entries in this rt:
 * -> $my_tags = 'FRUEHLING, SOMMER, HERBST, WINTER';
 *
 * encloser:
 * -> $enclose = 'JAHRESZEITEN';
 *
 * dummy/fallback css filename:
 * -> $my_css  = 'master_template.css';
 *
 **/
 
// ----------------------------------------------------------------
// OBLIGATE CHECK FOR PHPWCMS CONSTANTS
if (!defined('PHPWCMS_ROOT')) {die("You Cannot Access This Script Directly, Have a Nice Day.");}
// ----------------------------------------------------------------
 
 
// ist im Feld Beschreibung der Seitenebene" etwas vorhanden?
if (!empty($content["struct"][0]['acat_info']))
{
    // ===== Usereingabe =====================================
        // Vorgabe: Tags eintragen, wie im Infofeld
 
        $enclose = 'JAHRESZEITEN';                        // Umschlieszer
        $my_tags = 'fruehling, sommer, herbst, winter';    // Die Tags
        $my_css  = 'master_template.css';                 // Name der Dummy-CSS Datei bzw.
                                                        // Fallback Datei die ersetzt wird
    // ===== ENDE Usereingabe ================================
 
 
    // Tags abholen aus "HOME" ID=0
    $info = returntagcontent($content["struct"][0]['acat_info'], $enclose);
 
    // irgendeine Tagansammlung vorhanden?
    if ( !empty($info['tag']) )
    {
        $be_tags = explode(',',$info['tag']);    // BE-Tags holen
        $my_tags = strtolower($my_tags);        // normieren
        $tag = '';                                // Hier wird der Tag festgehalten
 
 
        // Vergleich ob ein Tag aus dem BE in der Vorgabe enthalten ist
        foreach ($be_tags as $key => $value)
        {
            $be_tags[$key] = strtolower(trim($value));            // normieren
 
            if (strpos($my_tags, $be_tags[$key]) != false) {     // Tag gefunden
                $tag = $be_tags[$key];
                break;                                            // foreach Abbruch da gefunden
            }
        }
 
 
        // Custom Funktionen, wie CSS austauschen oder Teile im  Template ersetzen
        // =============================================================
        if ( !empty($tag) )
        {
            // wenn Tag vorhanden, dann z.B. Dummy/Fallback-css austauschen
            // die Position in der Reihenfolge der Dateien bleibt eralten
            // -------------------------------------------------------
            $key = array_search($my_css, $block['css']);
            if ($key) $block['css'][$key] = 'specific/'.$tag.'.css';
 
 
            // Ersetzer im Template
            // -------------------------------------------------------
            if ($tag == 'winter') // wenn "winter" dann mache folgendes:
            {
                $content['all'] =
                str_replace('{RANDOM:templates/header-random/normal}',
                            '{RANDOM:templates/free_XL/header-random/weihnachten}',
                            $content['all']);
            }
        }
 
 
        // Das ganze getagge löschen, wenn "Beschreibung der Seitenebene" fuer die description gebraucht
        // ==============================================================================================
        $content["struct"][0]['acat_info'] = replace_cnt_template($content["struct"][0]['acat_info'], $enclose, '');
        $content["struct"][0]['acat_info'] = trim($content["struct"][0]['acat_info']);
 
    }
}
 
?>


V1.1:

Exemplarisch erweitert um einige Ersetzer für den Content (siehe Bereich “Custom Funktionen”).

rt_tag_in_site_structure

<?php
/**
 * 26.11.09 KH (flip-flop) tags in site structure "category infotext"
 * This RT is to show how with can the help of tags in the page structure, the output of the pages can be influenced.
 * V1.1
 *
 * Usage: sample Replacement Tag
 *
 * in the field "category infotext" in site structure (in this example we uses
 * the category HOME)
 *
 * Tag:
 * -> [JAHRESZEITEN]#Fruehling, #Sommer, #Herbst, Winter[/JAHRESZEITEN]
 *    (We trigger on "Winter", there is no # in front)
 *
 * Meta descrition if you want:
 * -> My descrition text for home
 *
 * Corresponding tags/entries in this rt:
 * -> $my_tags = 'FRUEHLING, SOMMER, HERBST, WINTER';
 *
 * encloser:
 * -> $enclose = 'JAHRESZEITEN';
 *
 * dummy/fallback css filename:
 * -> $my_css  = 'master_template.css';
 *
 **/
 
// ----------------------------------------------------------------
// OBLIGATE CHECK FOR PHPWCMS CONSTANTS
if (!defined('PHPWCMS_ROOT')) {die("You Cannot Access This Script Directly, Have a Nice Day.");}
// ----------------------------------------------------------------
 
 
// ist im Feld Beschreibung der Seitenebene" etwas vorhanden?
if (!empty($content["struct"][0]['acat_info']))
{
    // ===== Usereingabe =====================================
        // Vorgabe: Tags eintragen, wie im Infofeld
 
        $enclose = 'JAHRESZEITEN';                        // Umschlieszer
        $my_tags = 'fruehling, sommer, herbst, winter';    // Die Tags
        $my_css  = 'master_template.css';                 // Name der Dummy-CSS Datei bzw.
                                                        // Fallback Datei die ersetzt wird
    // ===== ENDE Usereingabe ================================
 
 
    // Tags abholen aus "HOME" ID=0
    $info = returntagcontent($content["struct"][0]['acat_info'], $enclose);
 
    // irgendeine Tagansammlung vorhanden?
    if ( !empty($info['tag']) )
    {
        $be_tags = explode(',',$info['tag']);    // BE-Tags holen
        $my_tags = strtolower($my_tags);        // normieren
        $tag = '';                                // Hier wird der Tag festgehalten
 
 
        // Vergleich ob ein Tag aus dem BE in der Vorgabe enthalten ist
        foreach ($be_tags as $key => $value)
        {
            $be_tags[$key] = strtolower(trim($value));            // normieren
 
            if (strpos($my_tags, $be_tags[$key]) != false) {     // Tag gefunden
                $tag = $be_tags[$key];
                break;                                            // foreach Abbruch da gefunden
            }
        }
 
        // ====================================================================
        // Custom Funktionen, wie CSS austauschen oder
        // Teile im  Template/Content ersetzen
        // ====================================================================
 
        // TAG ueberhaupt vorhanden und TAG in unserer Menge enthalten?
        if ( (!empty($tag)) AND (strpos($my_tags, $tag) != false) )
        {
            // wenn Tag vorhanden, dann z.B. Dummy/Fallback-css austauschen
            // die Position in der Reihenfolge der Dateien bleibt eralten
            // -------------------------------------------------------
            $key = array_search($my_css, $block['css']);
            if ($key) $block['css'][$key] = 'specific/'.$tag.'.css';
            // -------------------------------------------------------
 
            // -------------------------------------------------------
            // Bsp01.: direktes ersetzen im Template/Content
            // -------------------------------------------------------
            if ($tag == 'winter') // wenn "winter" dann mache folgendes:
            {
                $content['all'] =
                str_replace('{RANDOM:templates/header-random/normal}',
                            '{RANDOM:templates/free_XL/header-random/weihnachten}',
                            $content['all']);
            }
            // -------------------------------------------------------
            // Bsp02.: Ersetzen mit Umschlieszer (wrapper) im Template/Content
            // In der Vorlage/Content z.B.:
            // "Jetzt [SEASON]im Jahr ist es farbig[/SEASON]."
            // -------------------------------------------------------
 
            switch($tag) {
 
                // Verwendet wird die Funktion:
                // replace_cnt_template($text='', $tag='', $value='');
 
                case 'winter':
                    $content['all'] =
                    replace_cnt_template($content['all'], SEASON, 'im Winter ist es weiß');
                    break;
 
                case 'fruehling':
                    $content['all'] =
                    replace_cnt_template($content['all'], SEASON, 'im Fr&uuml;hling ist es gr&uuml;n');
                    break;
 
                case 'sommer':
                    $content['all'] =
                    replace_cnt_template($content['all'], SEASON, 'im Sommer ist es gelb');
                    break;
 
                case 'herbst':
                    $content['all'] =
                    replace_cnt_template($content['all'], SEASON, 'im Herbst ist es braun');
                    break;
 
            }
 
            // -------------------------------------------------------
            // Bsp03.: Ersetzen mit Tag {TAG} im Template/Content
            // In der Vorlage/Content z.B.:
            // "Jetzt ist der {SEASON} da."
            // -------------------------------------------------------
 
            switch($tag) {
 
                case 'winter':
                    $content['all'] = str_replace('{SEASON}', 'Winter', $content['all']);
 
                case 'fruehling':
                    $content['all'] = str_replace('{SEASON}', 'Fr&uuml;hling', $content['all']);
 
 
                case 'sommer':
                    $content['all'] = str_replace('{SEASON}', 'Sommer', $content['all']);
 
                case 'herbst':
                    $content['all'] = str_replace('{SEASON}', 'Herbst', $content['all']);
 
 
            }
            // -------------------------------------------------------
 
 
        } // ---ENDE if ( !empty($tag) ) -------------------------
 
 
 
        // All unsere [wrapper] und {Tags} in der Vorlage/Content loeschen,
        // wenn noch vorhanden   (wenn kein Tag gesetzt wurde)
        // und Fallback setzt bei {TAG}
        // --------------------------------------------------------------------
        $content['all'] = str_replace('{SEASON}', 'Regen', $content['all']);  // Fallback
        $content['all'] = preg_replace('/\[SEASON\](.*?)\[\/SEASON\]/is', '$1', $content['all']);
        // --------------------------------------------------------------------
 
 
        // Loeschen des ganze "Getagges" in der Struktuebene,
        // wenn "Beschreibung der Seitenebene" fuer die description gebraucht wird
        // ---------------------------------------------------------------------
        $content["struct"][0]['acat_info'] = replace_cnt_template($content["struct"][0]['acat_info'], $enclose, '');
        $content["struct"][0]['acat_info'] = trim($content["struct"][0]['acat_info']);
        // ---------------------------------------------------------------------
 
    }  // ---ENDE if ( !empty($info['tag']) ) -------------------------
 
}  // ---ENDE if (!empty($content["struct"][0]['acat_info'])) ----
 
 
?>

Die hier gezeigteb Varianten reagiert auf den ersten übereinstimmenden Tag, nur dieser wird berücksichtigt. Es wird also nur ein tag verarbeitet. Unter “Ersetzer im Template” können nun mehrere Aktionen bezüglich des gefundenen Tags ausgeführt werden.

deutsch/ersetzer_rts/frontend_render/tag-site-structure.txt · Last modified: 2009/12/11 07:30 by Knut Heermann (flip-flop)
www.planmatrix.de www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0