2011-01-25 16 views
21

Szablon wiadomości e-mail Magento Jeśli oświadczenia nie są prawdziwe, gdy się ich spodziewam. Czy ktoś może mi powiedzieć, co jest nie tak? Spójrz na poniższy kod:Szablon wiadomości e-mail Magento Jeśli oświadczenia

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

Wyjście jest

4 
Print True 
Print False 
Print False 
Print False 

Próbowałem oddanie cudzysłowy wokół 4, ale sam wynik. Jak ocenić równości z szablonem e-mailem magento, jeśli wyrażenia?

Odpowiedz

15

Kopanie poprzez kod, wygląda na to logika szablon jest realizowany przez Varien_Filter_Template (pod lib \ Varien nie app \ code) w funkcji filter która wydaje zwrotnego do funkcji ifDirective Jeżeli wzorzec pasuje do wyrażenia regularnego. Z kolei ifDirective używa funkcji do oceny Twojego stanu if. tokenizuje warunek z Varien_Filter_Template_Tokenizer_Variable na właściwość lub metodę.

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

Gdy jeśli warunek jest wykrywany za metodę, będzie wykonywał tę metodę, w przeciwnym razie po prostu zwraca ciąg znaków zmiennej.

Wszystko to oznacza (myślę!), Że jeśli chcesz ocenić wyrażenie wewnątrz instrukcji if, musisz dodać nowy atrybut klienta (dostępne są rozszerzenia), który szablon może ocenić. Jeśli więc zdefiniujesz boolowski atrybut "isMemberOfGroupNameX", szablon powinien działać.

Wyobrażam sobie, że nie jest to odpowiedź, której szukasz, ale jestem prawie pewien, że tak jest.

HTH, JD

+0

Popraw mnie, jeśli się mylę, ale z tego, co mówisz, on mógłby również stworzyć jakąś metodę (może metodę pomocnika?), Która mogłaby to sprawdzić, prawda? –

+0

Można również zbudować logikę poza szablonem, aby zapełnić określoną zmienną klienta w środowisku wykonawczym. – Chris

+0

@Joseph - tak, możesz utworzyć metodę, ale myślę, że musiałaby ona znajdować się w obiekcie klienta, abyś mógł użyć {{if customer.isGroupMember()}}, co wymaga rozszerzenia modelu klienta. Nie jest to coś, co koniecznie zaleciłbym dla tego wymogu, ale nadal jest to ważna opcja –

30

I rozwiązać ten problem za pomocą techniki 'zablokuj'.

Co zrobić, to przekazać zamówienie do bloku, a następnie wykonać swoją logikę wewnątrz tego bloku.

Chociaż moje rozwiązanie dotyczy innego problemu, podejście powinno tutaj działać.

To, czego chciałem, to mieć opcję zapłaty za pomocą czeku i dodatkowy tekst w wiadomości e-mail z potwierdzeniem przypominający o konieczności zapłaty. Dodałem to do nowego szablonu kolejności:

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

Potem utworzony plik app/design/frontend/default/default/template/paymentstatus/orderemail.phtml

To ma „if” logiki, w moim przypadku chciałem zobaczyć, czy status zamówienia było to, że do kontroli i tylko wtedy przypomnij klientowi, że jego zamówienie wymaga wyczyszczonych środków.

+0

gdzie jest to {{blokowy typ = 'rdzeń/szablon' obszar = 'frontend' szablon = 'paymentstatus/orderemail.phtml' order = $ order} }
'ten kod złożyłeś – Kichu

+0

Dziękujemy! Dodano instrukcję w języku rosyjskim, http://www.magefast.com/letter-template-magento-fantastico/ – Magefast

+1

Użyłem następującego kodu, aby pobrać typ płatności: $ payment_type = $ this-> getData ('order') - > getPayment() -> getMethodInstance() -> getCode(); – deanpodgornik

6

Byłem w stanie w mniejszym lub większym stopniu zrealizować to prawo w szablonie za pomocą {{depend}} znaczników szablonu.

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

Trzeba będzie wyczarować tę zmienną w app/code/local/Mage/Sprzedaż/model/Order.php w metodach, takich jak sendNewOrderEmail() i tak dalej.

+0

Czy możliwe byłoby wykrycie bezpłatnej metody wysyłki? {{depend $ order.freeshippingmethod}} ... pomoc doceniona –

0

W normalnych blokach/klasach Magento można użyć $customer->getGroupId(), aby uzyskać dostęp do wartości identyfikatora grupy.Odpowiednikiem szablonu CMS/Email jest customer.getGroupId(), a nie customer.group_id, jak napisałeś.