Verwenden von Variablen in statischen CMS-Blöcken mit {{abhängig}}

7

Ich habe die {{abhängige}} Vorlagenfunktion verwendet, bevor ich E-Mail-Vorlagen verwendet habe, und ich frage mich, ob dies in statischen CMS-Blöcken möglich ist, zum Beispiel:

<a href="{{store url='customer/account'}}">Login/Account</a>

Könnte aktualisiert werden auf:

<a href="{{store url='customer/account'}}">
  {{depend loggedIn}}Account{{/depend}}
  {{depend loggedOut}}Login{{/depend}}
</a>

Dies kann nützlich sein, um Kunden die Möglichkeit zu geben, diese innerhalb des CMS-Blocks zu aktualisieren, während die Abhängigkeitsfunktionalität erhalten bleibt.

Offensichtlich hängt diese Abhängigkeit von den Variablen ab, die für den Block selbst verfügbar sind, den die E-Mail-Vorlage mithilfe der folgenden Kriterien erreicht (die mit einem Umschreiben auf den cms-Block / das cms-Modell angewendet werden können):

public function setTemplateParams(array $templateParams)
{
    return $this->setData('template_params', $templateParams);
}

Ich bin mir nicht sicher, wie die im Block verwendete Vorlagensprache auf diese Informationen zugreift. Das Hinzufügen von {{depend}}Tags zu einem Block wird einfach als einfacher Text ausgegeben. Ich gehe davon aus, dass vor dem Rendern des HTML-Codes ein Kompilierungsschritt angewendet wird, aber ein Anstoß in die richtige Richtung, wie vorzugehen ist, wäre eine große Hilfe.

Aufrufen
quelle

Antworten:

4

Dies ist keine Antwort auf die Frage, aber möglicherweise eine Lösung für das Problem.
Ich denke nicht, dass es eine gute Idee ist, alle Arten von Umschreibungen vorzunehmen. Sie können dasselbe erreichen, indem Sie einen Block und eine Vorlage erstellen und diese in Ihrem statischen Block verwenden.

Erstellen Sie den Block [Namespace]/[Module]/Block/Link.phpmit diesem Inhalt:

<?php 
class [Namespace]_[Module]_Block_Link extends Mage_Core_Block_Template
{

    public function getAccountUrl()
    {
        if (Mage::getSingleton('customer/session')->isLoggedIn()) {
            return $this->getUrl('customer/account');
        } 
        return $this->getUrl('customer/account/login');
    }
    public function getLabel()
    {
        if (Mage::getSingleton('customer/session')->isLoggedIn()) {
            return Mage::helper('customer')->__('Account');
        } 
        return Mage::helper('customer')->__('Login');
    }
}

Erstellen Sie dann die Vorlage app/design/frontend/base/default/template/[namespace]_[module]/link.phtml

<a href="<?php echo $this->getAccountUrl()?>"><?php echo $this->getLabel()?></a>

Fügen Sie dies nun in Ihren CMS-Block ein

{{block type="[block_alias]/link" template="[namespace]_[module]/link.phtml"}}
Marius
quelle
Ich muss zustimmen, das ist The Right Way ™
Fabian Schmengler
absolut richtig !!
Rajeev K Tomy
Das einzige Problem dabei The Right Way™ist, dass dies nur für diese bestimmte Instanz (des Anmeldelinks) gilt und ich andere Block- / Vorlagenkombinationen für andere Instanzen schreiben müsste, für die möglicherweise die {{abhängige}} Funktionalität erforderlich ist.
Rufen Sie den
OK, nachdem ich darüber nachgedacht habe, denke ich, dass dies die sinnvollste Lösung ist (siehe meinen Kommentar zur Antwort von @fschmengler unten aus einigen Gründen) - Ich denke, ich werde die getLabel()Funktion aktualisieren , damit ich Etiketteninformationen über die cms mit {{ [...] logged_out_label="Login to your account"}}und Zugriff weitergeben kann sie mit $this->getBlockParams()so dass der Editor die Markierung aus dem cms statischen Block außer Kraft zu setzen - ich fühle , dass ein guter Kompromiss ist.
Rufen Sie den
Ja. Das klingt nach einem guten Ansatz.
Marius
4

Die Filteranweisungen werden verarbeitet, in Mage_Cms_Model_Template_Filterdenen erbt von Mage_Core_Model_Email_Template_Filter, sodass Sie alle Funktionen von E-Mail-Vorlagen auch in CMS-Blöcken und -Seiten haben.

Aber Sie haben Recht, dass alles davon abhängt, welche Variablen verfügbar sind. Und leider weisen die CMS-Seiten dem Filter keine Variablen zu, wie Sie in sehen können Mage_Cms_Block_Block::_toHtml():

$processor = $helper->getBlockTemplateProcessor();
$html = $processor->filter($block->getContent());

Zwischen diesen Zeilen $processor->setVariables($block->getData())wäre nützlich.

So aktivieren Sie Vorlagenvariablen in CMS

Umschreiben Mage_Cms_Block_Blockund Mage_Cms_Block_Pagewie oben beschrieben.

Sie könnten dann zusätzliche Variablen mit $block->setData()einem anderen Umschreiben festlegen , aber ich würde vorschlagen, stattdessen einen Beobachter zu verwenden, um flexibler zu sein. Beobachten Sie das Ereignis cms_page_renderfür CMS-Seiten oder core_block_abstract_prepare_layout_afterfür statische Blöcke, um allen Blöcken / Seiten dynamische Variablen wie "logged_in" hinzuzufügen.

Warum siehst du nichts?

Der Grund, den Sie {{depend}}als einfachen Text sehen, ist wahrscheinlich, dass keine Vorlagenvariablen festgelegt wurden. Wenn Sie sich die dependDirectiveImplementierung ansehen , werden Sie feststellen , dass die Direktive unverändert zurückgegeben wird, wenn keine Vorlagenvariablen vorhanden sind ( $constructioneine Übereinstimmung, die von preg_match_allund $construction[0]dem gesamten Untermuster zurückgegeben wird):

public function dependDirective($construction)
{
    if (count($this->_templateVars)==0) {
        // If template preprocessing
        return $construction[0];
    }

    if($this->_getVariable($construction[1], '')=='') {
        return '';
    } else {
        return $construction[2];
    }
}

Solltest du das wirklich tun?

Wahrscheinlich nicht. In Marius 'Antwort finden Sie eine Lösung für Ihr Problem, wie es von Magento beabsichtigt ist.

Achten Sie in beiden Fällen auf die Auswirkungen des Blockcaches. Möglicherweise müssen Sie dem Block zusätzliche Cache-Tags hinzufügen, um den dynamischen Inhalt zu unterscheiden.

Fabian Schmengler
quelle
Vielen Dank für die Details System. Ich denke, insgesamt überwiegen die Nachteile die Vorteile, ein großes Lob dafür, dass Sie mir eine detaillierte Erklärung geschrieben und mir dann gesagt haben, ich soll sie nicht verwenden! > _ <
Rufen Sie den