Content Teaser Inhalt Zählen

Alles rund um Module und Plugins in CONTENIDO 4.9.
Antworten
derju
Beiträge: 301
Registriert: Do 15. Jan 2009, 09:00
Kontaktdaten:

Content Teaser Inhalt Zählen

Beitrag 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
Contenido 4.8.20 | Contenido 4.9.12
Faar
Beiträge: 1951
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Hat sich bedankt: 15 Mal
Kontaktdaten:

Re: Content Teaser Inhalt Zählen

Beitrag 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.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
derju
Beiträge: 301
Registriert: Do 15. Jan 2009, 09:00
Kontaktdaten:

Re: Content Teaser Inhalt Zählen

Beitrag 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
Contenido 4.8.20 | Contenido 4.9.12
Faar
Beiträge: 1951
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Hat sich bedankt: 15 Mal
Kontaktdaten:

Re: Content Teaser Inhalt Zählen

Beitrag 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.
:?
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
derju
Beiträge: 301
Registriert: Do 15. Jan 2009, 09:00
Kontaktdaten:

Re: Content Teaser Inhalt Zählen

Beitrag von derju »

OK, ich dachte vielleicht gibt es da eine Möglichkeit.

LG - derJu
Contenido 4.8.20 | Contenido 4.9.12
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Re: Content Teaser Inhalt Zählen

Beitrag 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
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
Antworten