Magento电子邮件模板中的If语句

21

当我期望时,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语句中评估等式?
4个回答

33

我通过使用“块技术”解决了这个问题。

你所要做的就是将订单传递给一个块,然后在该块内部执行你的逻辑。

尽管我的解决方案适用于不同的问题,但在这里应该也能起作用。

我想要的是在确认电子邮件中提供支票付款选项和一些额外的文本提醒他们付款。我将这些内容添加到新订单模板中:

{{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>"; }?>

你放置了这段代码 {{block type='core/template' area='frontend' template='paymentstatus/orderemail.phtml' order=$order}}<br /> 在哪里? - Kichu
谢谢!已添加俄语语言指令,http://www.magefast.com/letter-template-magento-fantastico/ - Alex
1
我使用了以下代码来检索付款类型:$payment_type = $this->getData('order')->getPayment()->getMethodInstance()->getCode(); - deanpodgornik
嗨,deanpodgornik,你把那段代码添加到哪里了?是电子邮件模板还是orderemail.phtml文件中? - Kaspar L. Palgi
我喜欢这个想法,但是遇到了麻烦。当预览电子邮件模板时,附加模板文件中的文本被包含在内,但发送时却没有。我尝试在PHP语句中使用echo,以及在模板中包含纯文本,结果总是一样--预览时显示,但发送时未包含。有什么建议吗? - PartialOrder
显示剩余2条评论

16

从代码中看,模板逻辑是由Varien_Filter_Template(位于lib\Varien而不是app\code下)的filter函数实现的,如果模式与正则表达式匹配,则它会回调ifDirective函数。而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"属性,则模板应该可以正常工作。
我想这可能不是您要找的答案,但我相当肯定情况是这样的。
希望对你有所帮助, JD

请纠正我,但从你所说的,他也可以创建某种方法(可能是辅助方法?)来检查这个,对吗? - Joe Mastey
您也可以在模板之外构建逻辑,以便在运行时填充特定的客户变量。 - Chris
@Joseph - 是的,你可以创建一个方法,但我认为它需要在Customer对象上,这样你才能使用{{if customer.isGroupMember()}},这要求你扩展Customer模型。虽然这不是我推荐的解决方案,但仍然是一个有效的选项。 - Jonathan Day

7

我能够在模板中使用{{depend}}模板标签来更或多或少地完成这个任务。

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

你需要在app/code/local/Mage/Sales/Model/Order.php文件中的sendNewOrderEmail()等方法中创建此变量。

能否检测到免费送货方式?{{depend $order.freeshippingmethod}}...感谢您的帮助。 - snh_nl

0

在标准的Magento模块/类中,您可以使用$customer->getGroupId()来访问组ID值。而在CMS/电子邮件模板中,相应的代码是customer.getGroupId(),而不是像您所写的customer.group_id


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接