[Magento] Płatność zależna od dostawy

Data dodania wpisu: 26-05-2010

Magento cierpi z powodu braku jakiegokolwiek modułu umożliwiającego powiązanie ze sobą płatności i metod dostawy towaru tak, aby dostępne metody płatności były dostępne zależnie od wybranej metody dostawy towaru (w chwili pisania tego artykułu- nie wiem jak będzie później:P). Jak wiadomo, przy składaniu zamówienia przy OnepageCheckout, zakładka z płatnościami znajduje się po wyborze dostawy. Sprawę w temacie można załatwić kodowaniem na sztywno (zakładając, że mamy ustalone metody wysyłek i płatności i znamy ich kody systemowe). Co powinno nas interesować to modele poszczególnych form dostawy (Shipment) i płatności (Payment). W modelach metod dostawy znajdują się zmienne

$_code

, w których przechowywany jest identyfikator metody dostawy. Wystawczy spisać sobie te wartości i wiedzieć, która jest odpowiednia za jaką metodę płatności. Załóżmy, że mamy tam skonfigurowane dostawy UPS, DHL i np. Pocztę Polską skonfigurowaną dzięki Pw_Multipletablerates. Kolejno:

Mage_Usa_Model_Shipping_Carrier_Dhl
...
protected $_code='dhl';
Mage_Usa_Model_Shipping_Carrier_Ups
...
protected $_code='ups;
Pw_Multipletablerates_Model_Carrier_Multipletablerates
...
protected $_code='multipletablerates';

Dodatkowo, załóżmy, że korzystamy z płatności typu Dotpay (tutaj użyty moduł kkkonrada) i płatność za pobraniem (CashOnDelivery). Jeżeli chcemy, aby Dotpay był aktywny niezależnie od formy dostawy, to nie wprowadzamy of kors żadnych zmian. Za to jeśli chcemy, aby płatność za pobraniem była możliwa tylko w przypadku dostawy pocztowej skonfigurowanej na Multipletablerates, wystarczy że w modelu CashOnDelivery

Mage_CashOnDelivery_Model_CashOnDelivery

dodamy funkcję pobierającą wybraną wcześniej formę dostawy i dopiszemy warunek. Jeśli np. wybrana opcja dostawy będzie pokrywać się z warunkiem, funkcja zwróci false, co umożliwi ukrycie tej metody płatności.

	public function isAvailable($quote=null)
    {
        $shipping = Mage::getSingleton('checkout/session')->getQuote()
->getShippingAddress()->getShippingMethod();
        if(!eregi("multipletablerates",$shipping))
            return false;
        else
            return true;
	}

Aby jednak ją ukryć trzeba funkcję wywołać:) A wywołać ją trzeba w pliku templatki wyświetlania bloku z polem wyboru płatności (w zasadzie wystarczy nawet templatka wyświetlająca sam tytuł płatności;)) W:

template/cashondelivery/info.phtml

Zamieniamy:


<?php echo $this->getMethod()->getTitle() ?> <?php if ($this->getMethod()->getCustomText()): ?> <?php $this->getMethod()->getCustomText() ?> <?php endif; ?>

Na:

 

<?php if($this->isAvailable()): ?>
 <?php echo $this->getMethod()->getTitle() ?>
 <?php if ($this->getMethod()->getCustomText()): ?>
  <?php echo $this->getMethod()->getCustomText() ?>

 <?php endif; ?>
<?php endif; ?>

Adekwatnie możemy postępować z wieloma dostępnymi płatnościami i dostawami;) Wszystko zależy od tego, jakie warunki chcemy ustalić w zależnościach;)

Powyższe kawałki kodu był testowane na Magento 1.3.1.1 i 1.3.2.

Komentarze

: thank you for trying the soioultn. I first tried the soioultn on Drupal 7.15, and now on Drupal 7.17, and found it to be working.I suspect you didn't leave space between < ?php and function, which is causing the error while enabling it. Also please don't close the php tag (?>) as per .
Mam problemy z zapisaniem metod płatności. Jakieś wskazówki ?
Comments closed...