{{depend}}でCMS静的ブロック内の変数を使用する


7

私はメールテンプレートを使用する前に{{depend}}テンプレート機能を使用しましたが、これがCMSスタティックブロック内で可能かどうか疑問に思っています。次に例を示します。

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

次のように更新できます:

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

これは、依存関係の機能を維持しながら、CMSブロック内でこれらを更新するオプションを顧客に許可するのに役立ちます。

明らかに、この依存関係は、メールテンプレートが以下を使用して達成するブロック自体で使用可能な変数に依存します(これは、書き換えによりcmsブロック/モデルに適用できます)。

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

ブロック内で使用されているテンプレート言語がこの情報にアクセスする方法がわからない{{depend}}ので、ブロックにタグを追加すると、プレーンテキストとして出力されます。HTMLがレンダリングされる前にコンパイル手順が適用されていると思いますが、続行方法について正しい方向に微調整すると非常に役立ちます。

回答:


4

これは質問に対する回答ではありませんが、問題の解決策になる可能性があります。
あらゆる種類の書き換えを行うのは良い考えではないと思います。ブロックとテンプレートを作成し、それを静的ブロックで使用することで、同じことを実現できます。

[Namespace]/[Module]/Block/Link.php次の内容でブロックを作成します。

<?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');
    }
}

次に、テンプレートを作成します app/design/frontend/base/default/template/[namespace]_[module]/link.phtml

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

これをcmsブロックに追加します

{{block type="[block_alias]/link" template="[namespace]_[module]/link.phtml"}}

私は同意する必要があり、これは右ウェイ™です
ファビアンSchmengler

絶対的に正しい !!
Rajeev K Tomy

唯一の問題The Right Way™は、これは(ログインリンクの)この特定のインスタンスにのみ対応しており、{{depends}}機能を必要とする可能性のある他のインスタンスの他のブロック/テンプレートの組み合わせを記述する必要があることです。
2015

OKそこらでそれを考えた後、私は(いくつかの理由のために、以下の@fschmenglerからの答えに私のコメントを参照)、これが最も賢明な解決策だと思う-私は更新すると思いgetLabel()、私は使用してCMS経由でラベル情報を渡すことができるように機能を{{ [...] logged_out_label="Login to your account"}}、アクセス$this->getBlockParams()エディターがcms静的ブロック内からラベル付けをオーバーライドできるようにすることで、これらは適切な妥協案だと感じています。
2015

うん。これは良いアプローチのように思えます。
マリウス

4

フィルターディレクティブはMage_Cms_Model_Template_Filterから継承して処理されるMage_Core_Model_Email_Template_Filterため、CMSブロックおよびページの電子メールテンプレートのすべての機能も利用できます。

しかし、それはすべて、どの変数が利用可能であるかに依存することは正しいです。そして、残念なことに、CMSページはフィルターに変数を割り当てませんMage_Cms_Block_Block::_toHtml()

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

それらの行の間で$processor->setVariables($block->getData())は、役に立つでしょう。

CMSでテンプレート変数を有効にする方法

書き換えMage_Cms_Block_Block及びMage_Cms_Block_Page上述のように。

その後$block->setData()、別の書き換えで追加の変数を設定できますが、より柔軟にするために代わりにオブザーバーを使用することをお勧めします。cms_page_renderCMSページまたはcore_block_abstract_prepare_layout_after静的ブロックのイベントを観察して、「logged_in」などの動的変数をすべてのブロック/ページに追加します。

何も表示されないのはなぜですか?

{{depend}}プレーンテキストとして表示されるのは、おそらくテンプレート変数が設定されていないためです。あなたが見ればdependDirective、実装、あなたは(何のテンプレート変数が存在しない場合には、ディレクティブがそのまま返されることがわかります$constructionから返された試合であるpreg_match_all$construction[0]全体のサブパターン):

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];
    }
}

本当にそうするべきですか?

おそらく違います。Magentoが意図した問題の解決策については、マリウスの回答を参照してください。

どちらの場合も、ブロックキャッシュの影響に注意してください。動的コンテンツを区別するために、ブロックに追加のキャッシュタグを追加する必要がある場合があります。


詳細をありがとう@fschmengler-考えてみると、このソリューションの実装に関する問題は、問題自体が変数の設定に移行することを意味し、変数をブロックに追加することを(全体的またはそれ以外の方法で)良いアイデアであるかどうかを示しますシステム。全体的に不利な点はメリットよりも重要だと思います。詳細な説明を書いて、それを使わないように言ってくれたのですが!> _ <
2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.