2011-01-25 10 views
21

Il modello di e-mail Magento Se le dichiarazioni non vengono valutate come vere quando mi aspetto che lo facciano. Qualcuno può dirmi cosa c'è che non va? Date un'occhiata al seguente codice:Modello e-mail Magento Se Istruzioni

{{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}} 

L'uscita è

4 
Print True 
Print False 
Print False 
Print False 

Ho provato a mettere le virgolette attorno al 4, ma lo stesso risultato. Come posso valutare le uguaglianze con il modello di email magento se le istruzioni sono?

risposta

15

Scavando attraverso il codice, sembra che la logica del modello è attuato da Varien_Filter_Template (sotto lib \ Varien non app \ codice) nella funzione filter il quale emette un richiamo alla funzione ifDirective se il modello corrisponde alla espressione regolare. Il ifDirective utilizza a turno la funzione per valutare la condizione if. quindi tokenizes la condizione in Varien_Filter_Template_Tokenizer_Variable in una proprietà o in un metodo.

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 = ''; 
     } 

Quando la condizione è rilevata se per essere un metodo, viene eseguito tale metodo, altrimenti restituisce semplicemente il valore di stringa della variabile.

Tutto ciò significa (credo!) Che se si desidera valutare un'espressione all'interno dell'istruzione if, è necessario aggiungere un nuovo attributo cliente (ci sono estensioni disponibili per questo) che il modello può valutare. Quindi se si definisce un attributo booleano "isMemberOfGroupNameX", allora il modello dovrebbe funzionare.

Immagino che questa non sia la risposta che stai cercando, ma sono abbastanza sicuro che sia così.

HTH, JD

+0

Correggimi se sbaglio, ma da quello che dici, potrebbe anche creare un metodo di qualche tipo (forse un metodo di supporto?) Che potrebbe controllare anche questo, giusto? –

+0

Potrebbe anche essere possibile creare la logica all'esterno del modello per compilare una determinata variabile cliente in fase di esecuzione. – Chris

+0

@Joseph: sì, è possibile creare un metodo, ma penso che sarebbe necessario trovarsi sull'oggetto Cliente in modo da poter utilizzare {{if customer.isGroupMember()}} che richiede l'estensione del modello Cliente. Non è qualcosa che raccomando necessariamente per questo requisito, ma ancora un'opzione valida –

30

Ho risolto questo problema utilizzando la tecnica 'blocco'.

Quello che fai è passare l'ordine a un blocco e poi fare la tua logica all'interno di quel blocco.

Sebbene la mia soluzione sia per un problema diverso, l'approccio dovrebbe funzionare qui.

Quello che volevo era avere un pagamento con l'opzione di controllo e qualche testo in più nell'e-mail di conferma che ricorda loro di pagare. Ho aggiunto questo nel nuovo modello di ordine:

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

Poi ho creato un file app/design/frontend/default/default/template/paymentstatus/orderemail.phtml

Questo ha il 'se' la logica, nel mio caso ho voluto vedere se lo stato dell'ordine era che per un controllo e solo allora ricorda al cliente che il loro ordine aveva bisogno di fondi disponibili.

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

dove è '{{block type = 'core/template' area = 'frontend' template = 'paymentstatus/orderemail.phtml' order = $ order} }
'questo codice che hai inserito – Kichu

+0

Grazie! Aggiunte istruzioni sulla lingua russa, http://www.magefast.com/letter-template-magento-fantastico/ – Magefast

+1

Ho usato il seguente codice per recuperare il tipo di pagamento: $ payment_type = $ this-> getData ('order') - > getPayment() -> getMethodInstance() -> getCode(); – deanpodgornik

6

Sono stato in grado di eseguire più o meno questo diritto nel modello utilizzando i tag del modello {{depend}}.

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

Si dovrà evocare questa variabile in app/code/local/Mage/Vendite/Modello/order.php nei metodi come sendNewOrderEmail() e così via.

+0

Sarebbe possibile rilevare il metodo di spedizione gratuito? {{depend $ order.freeshippingmethod}} ... aiuto apprezzato –

0

All'interno di normali blocchi/classi Magento si utilizza $customer->getGroupId() per accedere al valore di identificazione del gruppo.L'equivalente modello CMS/Email è customer.getGroupId(), non customer.group_id come hai scritto tu.

Problemi correlati