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 » Mo 19. Okt 2015, 09:25

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: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Content Teaser Inhalt Zählen

Beitrag von Faar » Mo 19. Okt 2015, 09:33

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 » Mo 19. Okt 2015, 09:57

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: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Content Teaser Inhalt Zählen

Beitrag von Faar » Mo 19. Okt 2015, 13:00

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 » Mo 19. Okt 2015, 13:08

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

LG - derJu
Contenido 4.8.20 | Contenido 4.9.12

Oldperl
Beiträge: 4250
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: Content Teaser Inhalt Zählen

Beitrag von Oldperl » Mo 19. Okt 2015, 15:21

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

Antworten