2014-10-28 11 views
7

Zadałem to pytanie na Magento Stackexchange bez powodzenia, stąd teraz proszę tutaj.Magento - OnePage Zamówienie - Ukryj metodę płatności w zależności od metody wysyłki


Używam Magento Community Edition 1.9.0.1 i poprawnie utworzyłem i zarejestrowałem mój moduł, ale nie mogę wykryć metod wysyłki. Zasadniczo chcę ukryć Gotówka przy odbiorze, jeśli Stawka płaska lub została wybrana bezpłatna wysyłka. Oto kod mam dla mojej klasie obserwatora:

class Kol_PaymentToggle_Model_Observer 
{ 
    public function paymentMethodIsActive(Varien_Event_Observer $observer) { 
     $event = $observer->getEvent(); 
     $method = $event->getMethodInstance(); 
     $result = $event->getResult(); 
     $quote = $observer->getEvent()->getQuote(); 
     $shippingMethod = $quote->getShippingAddress()->getShippingMethod(); 
     if($shippingMethod == "standardshipping" || $shippingMethod == "free") { 
      if($method->getCode() == 'cashondelivery') { 
       $result->isAvailable = false; 
      } 
     } 
    } 
} 

Zgaduję, że nie zostały wykorzystane poprawnych nazw kodowych metody wysyłki lub nazwy kod metody płatności, ale jestem pewien. Czy ktoś ma jakieś rady?

EDIT: Mam tylko metody 3 wysyłki włączona:

  • Zbierz w magazynie
    title = Zbierz w Store
    Method Name = Zbierz w magazynie (Extension link)
  • Flat Rate
    Tytuł = dostawa standardowa
    Nazwa metody = standardowa wysyłka
  • Free Shipping
    Title = Bezpłatna dostawa
    Metoda Name = bezpłatny

EDIT 2: Wyjście config.xml

<?xml version="1.0"?> 
<config> 
    <modules> 
     <Kol_PaymentToggle> 
      <version>0.0.1</version> 
     </Kol_PaymentToggle> 
    </modules> 
    <frontend> 
     <events> 
      <payment_method_is_active> 
       <observers> 
        <paymentfilter_payment_method_is_active> 
         <type>singleton</type> 
         <class>Kol_PaymentToggle_Model_Observer</class> 
         <method>paymentMethodIsActive</method> 
        </paymentfilter_payment_method_is_active> 
       </observers> 
      </payment_method_is_active> 
     </events> 
    </frontend> 
</config> 

Mam nadzieję, że ta dodatkowa informacja może okazać się przydatna na pomoc mnie!

+0

czy możesz mi powiedzieć, w którym przypadku kod jest pożarem? –

+0

Cześć Amit. Jest przeznaczony do strzelania na miejscu w kasie w miejscu, w którym dana osoba musi wybrać metodę płatności. – maGz

+0

Wylogować kod xml –

Odpowiedz

9

Co do mnie, próbujesz ukryć niektóre metody płatności w oparciu o metodę wysyłki. Do tego nie trzeba w ogóle obserwować rzeczy. Po prostu możesz to zrobić, po prostu podążaj za mną,

Każda metoda (na jednej stronie sprawdź) zaksięguj metody wybrane do następnego poziomu. dzięki czemu możesz wybrać wybraną metodę wysyłki na poziomie metody płatności. Wystarczy wydrukować rzeczy pocztowych w

app/design/frontend/base/default/template/checkout/onepage/payment/methods.phtml 

w ten dodatek poniżej jednego,

<?php print_r($_POST); ?> 

Więc teraz można dostać metody wysyłki, które zostały wybrane poprzednim kroku. Zanotuj to, więc teraz możesz dodać tylko prosty logiczny (jeśli nie) warunek w tym samym pliku do ukrycia płatności,

Na przykład tutaj chcę ukryć metodę płatności check/money order, jeśli metoda wysyłki to flat. Tutaj kod metody płatności to checkmo. kod metody płatności można uzyskać, drukując tę ​​zmienną, taką jak echo $_code = $_method->getCode();, w tym samym pliku.tak tu po prostu dodać prosty czy innego,

<?php 
    $methods = $this->getMethods(); 


    $oneMethod = count($methods) <= 1; 
?> 
<?php if (empty($methods)): ?> 
    <dt> 
     <?php echo $this->__('No Payment Methods') ?> 
    </dt> 
<?php else: 
    foreach ($methods as $_method): 
     echo $_code = $_method->getCode(); 


if($_POST['shipping_method'] == 'flatrate_flatrate') { 
if($_code == 'checkmo') { 
    continue; 
} 
} 
?> 

Tutaj

if($_POST['shipping_method'] == 'flatrate_flatrate') { 
if($_code == 'checkmo') { 
    continue; 
} 
} 

sprawdza metodę wysyłki i pominąć metody płatności, które nie mają być wyświetlane. to jest to! Prosimy o komentarz tutaj, jeśli masz jakiekolwiek wątpliwości.

Uwaga:

shipping_method => flatrate_flatrate 
paymet_method => checkmo 
+0

@ Elvarasan: Dziękuję! Wiedziałem, że powinienem zamiast tego modyfikować PHTML. ma dużo więcej sensu. Zastąpię PHTML dla mojego podprogramu. – maGz

+0

Pytanie: gdzie powinienem wstawić ' ' – maGz

+0

ah, nevermind, wymyśliłem, gdzie – maGz

0

Oprócz rozwiązania dla onepage Checkout MDK dostarczonych przez @ Simbus82:

$shipping = Mage::getSingleton('checkout/session')->getQuote()->getShippingAddress()->getShippingMethod(); 

foreach ($methods as $_method): 
     $_code = $_method->getCode(); 
     if ($shipping == 'matrixrate_matrixrate_140' or $shipping == 'matrixrate_matrixrate_148') { 
      if($_code != 'cashondelivery') { 
       continue; 
      } 
     } 
0

chociaż the accepted answer prac, nie jest to eleganckie rozwiązanie, ponieważ skłania nas, aby sprawdzić dane pocztowe w pliku phtml, który nie jest dobrą metodą. Zamiast tego, zdecydowanie powinieneś poszukać zdarzenia, aby wykonać tę pracę.

Na szczęście mamy idealne wydarzenie do wykonania tej pracy i jest to payment_method_is_active. Proszę zobaczyć the detailed answer here.

Zasadniczo musisz ustawić metodę płatności nieaktywną za pomocą tej metody, jak widać w odpowiedzi.

Powiązane problemy