Seite 1 von 1

Content Teaser Inhalt Zählen

Verfasst: Mo 19. Okt 2015, 09:25
von derju
Guten Morgen,

gibt es die Möglichkeit das es bei dem Modul Html-Templates gezählt werden kann um eine css Variable bei Nummer sowieso einzustellen?

Code: Alles auswählen

<div class="column_quarter text">
    <!-- BEGIN:BLOCK -->
    <div class="col">
        <h3>{TITLE}</h3>
        <span class="date">{PUBLISHED}</span>
        <p>{TEXT}</p>
        <a href="{ART_URL}" class="more">{MORE} &raquo;</a>
    </div>
    <!-- END:BLOCK -->
    <div class="clear"></div>
</div>
LG - derJu

Re: Content Teaser Inhalt Zählen

Verfasst: Mo 19. Okt 2015, 09:33
von Faar
Moin,

alles was zwischen Begin:block und End:block steht, wird in einer Schleife ausgegeben, also kann man da auch einen Zähler einbauen.
Das muss man aber im Modul machen und im HTML den Platzhalter dafür einfügen.
z.B. {NUM} für den Zähler:

Code: Alles auswählen

<div class="column_quarter text">
    <!-- BEGIN:BLOCK -->
    <div class="col" id="box{NUM}">
        <h3>{TITLE}</h3>
        <span class="date">{PUBLISHED}</span>
        <p>{TEXT}</p>
        <a href="{ART_URL}" class="more">{MORE} &raquo;</a>
    </div>
    <!-- END:BLOCK -->
    <div class="clear"></div>
</div>
Den Modulcode habe ich nicht, der wäre natürlich wichtig.

Re: Content Teaser Inhalt Zählen

Verfasst: Mo 19. Okt 2015, 09:57
von derju
Das ist mir klar, mit Smarty hätte ich da auch eine Idee aber so leider nein ohne an die Klasse zugehen.

Ich setze den Standard Teaser von Contenido ein:

Code: Alles auswählen

<?php

/**
 * description: standard teaser - text teaser
 *
 * @package Module
 * @subpackage ContentTeaserText
 * @version SVN Revision $Rev:$
 *
 * @author timo.trautmann@4fb.de
 * @copyright four for business AG <www.4fb.de>
 * @license http://www.contenido.org/license/LIZENZ.txt
 * @link http://www.4fb.de
 * @link http://www.contenido.org
 */

echo "CMS_TEASER[3]";

mi18n("MORE");

?>
LG - derJu

Re: Content Teaser Inhalt Zählen

Verfasst: Mo 19. Okt 2015, 13:00
von Faar
Ja, sieht doof aus in der Klasse. Schön abgeschlossen, in sich gekehrt... :(
Ich würde dann nicht den Standard-Teaser nehmen, sondern ein anderes Modul.
:?

Re: Content Teaser Inhalt Zählen

Verfasst: Mo 19. Okt 2015, 13:08
von derju
OK, ich dachte vielleicht gibt es da eine Möglichkeit.

LG - derJu

Re: Content Teaser Inhalt Zählen

Verfasst: Mo 19. Okt 2015, 15:21
von Oldperl
Servus,

also es gibt da mehrere Lösungsansätze. Beispielsweise könnte man die Teaser-Klasse durch eine eigene Version, die dann einen entsprechenden Counter Platzhalter setzt, mittels Plugin austauschen/ersetzen. Nachteil dabei, bei einem Update des Core müssen eventuelle Änderungen auch in der eigenen Klasse eingepflegt werden.

Ich habe mich für eine andere Alternative, nämlich den Einsatz einer Chain-Funktion mittels der CECRegistry, entschieden. Das ist eigentlich recht simpel und es bietet sich dafür die entsprechende Schnittstelle in der Methode generate() der Template-Klasse (cTemplate) an.
Die Funktion addLoopCounter() nimmt den von der Chain aus der Template-Klasse gelieferten Content, prüft ihn auf das Vorhandensein einer Schleife und ersetzt ihn dann, und nur dann, durch einen geparsten Content mit dem zusätzlichen Platzhalter {LOOP_COUNT}.

Diese Erweiterung, bzw. deren Umsetzung, zeigt auch beispielhaft den Einsatz der CONTENIDO CHAIN-Schnittstelle in Modulen und wird sicherlich auch Teil meines Buches für Entwickler sein.

Hier nun der entsprechende modifizierte Modul-Output des Standard-Modules:

Code: Alles auswählen

<?php

/**
 * description: standard teaser - text teaser with loop count placeholder
 *
 * @package Module
 * @subpackage ContentTeaserText
 * @version SVN Revision $Rev:$
 *
 * @author timo.trautmann@4fb.de
 * @author Ortwin Pinke <o.pinke@conlite.org>
 * @copyright four for business AG <www.4fb.de>
 * @license http://www.contenido.org/license/LIZENZ.txt
 * @link http://www.4fb.de
 * @link http://www.contenido.org
 */
/**
 * Adds a template placeholder for counting the loop of dynamic content
 * using chain in cTemplate::render()
 * 
 * You may use it with placeholder {LOOP_COUNT} in your teaser templates
 * 
 * @author Ortwin Pinke <o.pinke@conlite.org>
 * @copyright (c) 2015, Ortwin Pinke
 * @version 1.0.0
 * 
 * @param string $sContent template content give by class cTemplate
 * @param cTemplate $oTpl use class object readonly
 * @return string new content if dynamic content was found, otherwise bypassed content
 */
if (!function_exists("addLoopCounter")) {

    function addLoopCounter($sContent, cTemplate $oTpl) {
        // If content has dynamic blocks we have to parse it
        // otherwise we will just return it
        $startQ = preg_quote($oTpl->tags['start'], '/');
        $endQ = preg_quote($oTpl->tags['end'], '/');
        if (preg_match('/^.*' . $startQ . '.*?' . $endQ . '.*$/s', $sContent)) {
            $pieces = array();
            preg_match_all('/^(.*)' . $startQ . '(.*?)' . $endQ . '(.*)$/s', $sContent, $pieces);
            // Safe memory
            array_shift($pieces);
            $sContent = '';
            // Now combine pieces together
            // Start block
            $sContent .= str_replace($oTpl->needles, $oTpl->replacements, $pieces[0][0]);
            unset($pieces[0][0]);

            // Generate dynamic blocks
            for ($a = 0; $a < $oTpl->dyn_cnt; $a++) {
                $aNeedles = $oTpl->Dyn_needles[$a];
                $aReplacements = $oTpl->Dyn_replacements[$a];

                // now we add our own loop replacements we need
                $aNeedles[] = "{LOOP_COUNT}";
                $aReplacements[] = $a + 1;

                $sContent .= str_replace($aNeedles, $aReplacements, $pieces[1][0]);
            }
            unset($pieces[1][0]);

            // End block
            $sContent .= str_replace($oTpl->needles, $oTpl->replacements, $pieces[2][0]);
            unset($pieces[2][0]);
        }

        return $sContent;
    }

}

$oCecReg = cApiCecRegistry::getInstance();
$oCecReg->addChainFunction("Contenido.Template.BeforeParse", "addLoopCounter");

echo "CMS_TEASER[3]";

$oCecReg->removeChainFunction("Contenido.Template.BeforeParse", "addLoopCounter");

mi18n("MORE");
?>
Das Ganze ist getestet und funktionierte bei mir in einem Demomandanten problemlos. Solltet ihr Probleme oder Fragen dazu haben, dann immer her damit.

Gruß aus Franken

Ortwin