web-dev-qa-db-fra.com

Modèle de courrier électronique Magento Si

Le modèle de courrier électronique Magento Si les déclarations ne sont pas évaluées comme vraies lorsque je les attend. Quelqu'un peut-il me dire ce qui ne va pas? Regardez le code suivant:

{{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 sortie est

4
Print True
Print False
Print False
Print False

J'ai essayé de mettre des citations autour du 4, mais le même résultat. Comment puis-je évaluer les égalités avec le modèle de courrier électronique magento dans les déclarations?

21
John

En fouillant dans le code, il semble que le modèle logique soit implémenté par Varien_Filter_Template (sous lib\Varien not app\code) dans la fonction filter qui envoie un rappel à la fonction ifDirective si le modèle correspond à la regex. ifDirective utilise à son tour la fonction _getVariable pour évaluer votre condition if. _getVariable puis marque la condition de Varien_Filter_Template_Tokenizer_Variable dans une propriété ou une méthode. 

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

Lorsque la condition if est détectée comme étant une méthode, elle l'exécutera, sinon elle renvoie simplement la valeur de chaîne de la variable. 

Cela signifie (je pense!) Que si vous souhaitez évaluer une expression dans l'instruction if, vous devez ajouter un nouvel attribut client (il existe des extensions disponibles pour cela) que le modèle peut évaluer. Donc, si vous définissez un attribut booléen "isMemberOfGroupNameX", le modèle devrait alors fonctionner. 

J'imagine que ce n'est pas la réponse que vous recherchez, mais je suis à peu près sûr que c'est le cas.

HTH, JD

16
Jonathan Day

J'ai résolu ce problème en utilisant la technique du «bloc».

Ce que vous faites est que vous passez la commande à un bloc puis faites votre logique à l'intérieur de ce bloc.

Bien que ma solution soit pour un problème différent, l'approche devrait fonctionner ici.

Ce que je voulais, c'était une option de paiement par chèque et un texte supplémentaire dans le courrier électronique de confirmation leur rappelant de payer. J'ai ajouté ceci dans le nouveau modèle de commande:

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

Puis j'ai créé un fichier app/design/frontend/default/default/template/paymentstatus/orderemail.phtml

Cela a la logique «si», dans mon cas, je voulais voir si le statut de la commande était celui d’un chèque et ensuite seulement rappeler au client que sa commande nécessitait des fonds compensés.

<?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>"; }?>
31
ʍǝɥʇɐɯ

J'ai pu plus ou moins accomplir ce droit dans le modèle en utilisant {{depend}} balises de modèle.

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

Vous devrez créer cette variable dans app/code/local/Mage/Sales/Model/Order.php dans des méthodes telles que sendNewOrderEmail (), etc.

7
Greg Robbins

Dans les blocs/classes Magento normaux, vous utiliseriez $customer->getGroupId() pour accéder à la valeur de l'ID du groupe. L'équivalent du modèle CMS/Email est customer.getGroupId(), pas customer.group_id comme vous l'avez écrit.

0
duttyman