2011-01-25 12 views
21

La plantilla de correo electrónico de Magento If Las declaraciones no se están evaluando como verdaderas cuando espero que lo hagan. ¿Puede alguien decirme qué pasa? Echar un vistazo al siguiente código:Plantilla de correo electrónico de Magento If Statements

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

La salida es

4 
Print True 
Print False 
Print False 
Print False 

He intentado poner comillas alrededor del 4, pero mismo resultado. ¿Cómo puedo evaluar las igualdades con la plantilla de correo electrónico magento si las declaraciones?

Respuesta

15

de excavación a través del código, parece que la lógica de la plantilla es implementado por Varien_Filter_Template (en lib \ Varien no aplicación \ code) en la función filter que emite una devolución de llamada a la función ifDirective si el patrón coincide con la expresión regular. El ifDirective a su vez usa la función para evaluar su condición if. a continuación, tokenizes la condición en Varien_Filter_Template_Tokenizer_Variable en una propiedad o un método.

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

Cuando se detecta la condición if ser un método, se ejecutará ese método, de lo contrario, simplemente devuelve el valor de cadena de la variable.

Todo lo cual significa (¡creo!) Que si desea evaluar una expresión dentro de la declaración if, necesita agregar un nuevo atributo de cliente (hay extensiones disponibles para esto) que la plantilla puede evaluar. Entonces, si define un atributo booleano "isMemberOfGroupNameX", entonces la plantilla debería funcionar.

Imagino que esta no es la respuesta que está buscando, pero estoy bastante seguro de que ese es el caso.

HTH, JD

+0

Corrígeme si me equivoco, pero por lo que dices, también podría crear un método de algún tipo (¿tal vez un método de ayuda?) Que también podría verificar esto, ¿no? –

+0

También es posible que pueda compilar la lógica fuera de la plantilla para rellenar una determinada variable de cliente en el tiempo de ejecución. – Chris

+0

@Joseph: sí, podría crear un método, pero creo que debería estar en el objeto Cliente para que pueda usar {{si customer.isGroupMember()}}, que le exige ampliar el modelo de Cliente. No es algo que recomiendo necesariamente para este requisito, pero sigue siendo una opción válida –

30

I solucionó este problema mediante el uso de la técnica de 'bloque'.

Lo que hace es pasar el pedido a un bloque y luego hacer su lógica dentro de ese bloque.

Aunque mi solución es para un problema diferente, el enfoque debería funcionar aquí.

Lo que quería era tener una opción de pago por cheque y un texto adicional en el correo electrónico de confirmación que les recordaba que debían pagar. He añadido esto en la nueva plantilla de la orden:

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

Luego he creado un archivo app/design/frontend/default/default/template/paymentstatus/orderemail.phtml

Esto tiene el 'si' la lógica, en mi caso yo quería ver si el estado de la orden fue que para un chequeo y solo entonces recuérdele al cliente que su orden necesitaba fondos compensados.

<?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

donde está '{{block type = 'core/template' area = 'frontend' template = 'paymentstatus/orderemail.phtml' order = $ order} }
'este código que ha colocado – Kichu

+0

¡Gracias! Se agregaron instrucciones en idioma ruso, http://www.magefast.com/letter-template-magento-fantastico/ – Magefast

+1

Usé el siguiente código para recuperar el tipo de pago: $ payment_type = $ this-> getData ('order') - > getPayment() -> getMethodInstance() -> getCode(); – deanpodgornik

6

Pude más o menos cumplir este derecho en la plantilla usando las etiquetas de plantilla {{depends}}.

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

Tendrá que evocar esta variable en app/código/local/Mago/Ventas/modelo/order.php en los métodos como sendNewOrderEmail() y así sucesivamente.

+0

¿Sería posible detectar el método de envío gratis? {{depends $ order.freeshippingmethod}} ... ayuda apreciada –

0

Dentro de los bloques/clases normales de Magento, debe usar $customer->getGroupId() para acceder al valor de identificación del grupo.El equivalente de la plantilla CMS/Email es customer.getGroupId(), no customer.group_id como usted escribió.

Cuestiones relacionadas