2011-01-25 44 views
21

Magento電子郵件模板如果語句在我期望它們時未評估爲真。有人能告訴我什麼是錯的嗎?看看下面的代碼:Magento電子郵件模板如果語句

{{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電子郵件模板的平等?

回答

15

通過代碼挖,它看起來像模板邏輯由Varien_Filter_Templatefilter功能如果該圖案在正則表達式匹配,其發出一個回調到ifDirective功能實現(lib下\瓦瑞恩不應用\代碼)。 ifDirective反過來使用函數來評估您的if條件。然後將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語句內的表達式,你需要添加一個新的客戶屬性(有可用於該擴展),模板可以評估。所以如果你定義了一個布爾型「isMemberOfGroupNameX」屬性,那麼該模板應該可以工作。

我想這不是你要找的答案,但我相當肯定是這種情況。

HTH, JD

+0

糾正我,如果我錯了,但從你說什麼,他也可以創建一種方法(可能是一個輔助方法?),可以檢查這一點,對吧? – 2011-01-26 00:26:12

+0

您也可以在模板外部構建邏輯以在運行時填充特定的客戶變量。 – Chris 2011-01-26 01:37:37

+0

@Joseph - 是的,您可以創建一個方法,但我認爲它需要位於Customer對象上,以便您可以使用需要擴展Customer模型的{{if customer.isGroupMember()}}。不是我必須爲此需求推薦的東西,但仍然是一個有效的選項 – 2011-01-26 04:15:45

30

我通過使用 '塊' 的技術解決了這個問題。

你要做的是將命令傳遞給一個塊,然後在該塊內部執行你的邏輯。

雖然我的解決方案是針對不同的問題,但這種方法應該在這裏工作。

我想什麼是有支票選項,並在確認電子郵件一些額外的文字,提醒他們支付工資。我加入到這個新秩序的模板:

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

然後,我創建了一個文件app/design/frontend/default/default/template/paymentstatus/orderemail.phtml

這樣做的「如果」的邏輯,在我來說,我想看看,如果訂單的狀態是,一檢查然後才提醒客戶他們的訂單需要清理資金。

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

我在模板中使用{{depend}}模板標籤或多或少地完成了這項權利。

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

你將不得不想起了在應用程序/代碼/本地/法師/銷售/型號/ Order.php這個變量像sendNewOrderEmail()等方法。

0

在正常Magento的塊/類,你會用$customer->getGroupId()訪問值組ID。與您所寫的相同,CMS/Email模板等效於customer.getGroupId(),而不是customer.group_id