пятница, 9 января 2015 г.

Как отключать некоторые виды оплаты в зависимости от способа доставки

Весьма обыденная ситуация: вам нужно запретить "наложенный платеж" при доставке "транспортной компанией" (собственно, варианты могут быть любые, например ваш курьер не принимает карты, не важно - принцип один).

Как правило, в крупных, давно и правильно настроенных ИМ (типа Озона) это делается путем последовательного отображения пользователю страниц выбора адреса - вариантов доставки - вариантов оплаты. В X-Cart 5 же (и это ЛУЧШЕ - потому что наглядно, потому что все видно сразу) все это собрано на одной странице, а значит (де)активация способов оплаты должна происходить динамически, в зависимости от выбранного пользователем способа доставки.

Мой вопрос на офф форуме, его обсуждение и ссылку на статью в документации по X-Cart можно посмотреть по ссылке.

В моем случае есть два способа доставки:
= Почта (ID=1) и Транспортная Компания (ID=2)
и два способа оплаты:
=  Яндекс Касса (ID=67) и Наложенный Платеж (ID=73).
ID методов доставки и оплаты можно увидев, зайдя в админке в их настройку - ID отобразится в урле соответствующей страницы, например так: site.ru/admin.php?target=payment_method&method_id=67.

Мне нужно запретить Наложенный Платеж в случае, если доставка будет осуществляться транспортной компанией. Для этого в вашем модуле, который отвечает за бизнес логику вашего ИМ, создаем файл XLite\Module\DAG\SpecialOffer\Model\Order.php (на имя конкретно моего модуля внимания не обращаем, так вышло, что я начал со скидок, а теперь уже просто лень его переименовывать)
<?
// vim: set ts=4 sw=4 sts=4 et:

namespace XLite\Module\DAG\SpecialOffer\Model;

/**
 * Class represents an order
 */
abstract class Order extends \XLite\Model\Order implements \XLite\Base\IDecorator
{
    public function getPaymentMethods()
    {
        if (0 < $this->getOpenTotal())
    {

            $list = \XLite\Core\Database::getRepo('XLite\Model\Payment\Method')
                ->findAllActive();

            foreach ($list as $i => $method)
        {
                if (!$method->isEnabled() || !$method->getProcessor()->isApplicable($this, $method)
                    || $this->getShippingId() == 2 && $method->getMethodId() == 73)
        {
                    unset($list[$i]);
                }
            }

        }
    else
    {
            $list = array();
        }

        return $list;
    }
}
Красным цветом выделены ID методов доставки и оплаты, комбинация которых недопустима. Перезагружаем магазин, убеждаемся что работает. Честно говоря, я не ожидал, что будет работать так здорово!




Комментариев нет:

Отправить комментарий