web-dev-qa-db-ja.com

MagentoメールテンプレートのIfステートメント

Magentoの電子メールテンプレートのIfステートメントが、期待どおりにtrueと評価されていません。誰かが私に何が悪いのか教えてもらえますか?次のコードを見てください。

{{var customer.group_id}}
{{if customer.group_id}}Print true{{else}}Print false{{/if}}
{{if customer.group_id==4}}Print true{{else}}Print false{{/if}}
{{if customer.group_id=4}}Print true{{else}}Print false{{/if}}
{{if customer.group_id eq 4}}Print true{{else}}Print false{{/if}}

出力は

4
Print True
Print False
Print False
Print False

4を引用符で囲んでみましたが、同じ結果になりました。 magentoメールテンプレートのifステートメントで同等性を評価するにはどうすればよいですか?

21
John

コードを掘り下げると、テンプレートロジックはfilterへのコールバックを発行するifDirective関数のVarien_Filter_Template(lib\Varienではなくapp\codeの下)によって実装されているようです。パターンが正規表現と一致する場合に機能します。次に、ifDirective_getVariable関数を使用して、if状態を評価します。次に、_getVariableは、Varien_Filter_Template_Tokenizer_Variableの条件をプロパティまたはメソッドのいずれかにトークン化します。

if($this->isWhiteSpace()) {
            // Ignore white spaces
            continue;
        } else if($this->char()!='.' && $this->char()!='(') {
            // Property or method name
            $parameterName .= $this->char();
        } else if($this->char()=='(') {
            // Method declaration
            $methodArgs = $this->getMethodArgs();
            $actions[] = array('type'=>'method',
                               'name'=>$parameterName,
                               'args'=>$methodArgs);
            $parameterName = '';
        } else if($parameterName!='') {
            // Property or variable declaration
            if($variableSet) {
                $actions[] = array('type'=>'property',
                                   'name'=>$parameterName);
            } else {
                $variableSet = true;
                $actions[] = array('type'=>'variable',
                                   'name'=>$parameterName);
            }
            $parameterName = '';
        }

If条件がメソッドであることが検出されると、そのメソッドが実行されます。それ以外の場合は、変数の文字列値が返されます。

つまり、ifステートメント内の式を評価する場合は、テンプレートで評価できる新しい顧客属性(これに使用できる拡張機能があります)を追加する必要があります(私は思います!)。したがって、ブール値の「isMemberOfGroupNameX」属性を定義すると、テンプレートは機能するはずです。

これはあなたが探している答えではないと思いますが、そうだと思います。

HTH、JD

16
Jonathan Day

私は「ブロック」技術を使用してこの問題を解決しました。

あなたがすることはあなたがブロックに注文を渡し、次にそのブロックの中であなたの論理をすることです。

私の解決策は別の問題に対するものですが、アプローチはここで機能するはずです。

私が欲しかったのは、小切手による支払いオプションと、確認メールに支払いを促す追加のテキストを含めることでした。これを新しい注文テンプレートに追加しました:

{{block type='core/template' area='frontend' template='paymentstatus/orderemail.phtml' order=$order}}<br />

次に、ファイルを作成しましたapp/design/frontend/default/default/template/paymentstatus/orderemail.phtml

これには「if」ロジックがあり、私の場合、注文のステータスが小切手の場合であるかどうかを確認し、その後、注文に資金の清算が必要であることをお客様に通知しました。

<?php if($this->getData('order')->getStatus()=='cheque') {
echo "<p>Please note that we will require your cheque to clear before we can despatch your order.</p>"; }?>
32
ʍǝɥʇɐɯ

{{depend}}テンプレートタグを使用して、テンプレートでこの権利を多かれ少なかれ達成することができました。

{{depend somevar}}
Print this if somevar evaluates to true
{{/depend}}

SendNewOrderEmail()などのメソッドでapp/code/local/Mage/Sales/Model/Order.phpのこの変数を呼び出す必要があります。

7
Greg Robbins

通常のMagentoブロック/クラス内では、$customer->getGroupId()を使用してグループID値にアクセスします。同等のCMS/Eメールテンプレートはcustomer.getGroupId()であり、あなたが書いたようなcustomer.group_idではありません。

0
duttyman