среда, 28 января 2015 г.

Где X-Cart хранит настройки (например логин и пароль - доступ к БД)

Все очень просто - /etc/config.php

Постоянно забываю, лучше запишу тут.

пятница, 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 методов доставки и оплаты, комбинация которых недопустима. Перезагружаем магазин, убеждаемся что работает. Честно говоря, я не ожидал, что будет работать так здорово!




Много пустого места вокруг иконок с изображением товара

Или сами иконки слишком мелкие, реально 180 х 180 пикселов — ну куда это годится для современных мониторов?

Код простой, в файле XLite\Module\DAG\MaayaSkin\View\ItemsList\Product\Customer\ACustomer.php вашего модуля-скина пишем следующее:

 <?php

namespace XLite\Module\DAG\MaayaSkin\View\ItemsList\Product\Customer;

abstract class ACustomer extends \XLite\View\ItemsList\Product\Customer\ACustomer implements \XLite\Base\IDecorator
{

    public static function getIconSizes()

    {
        return array(
            static::WIDGET_TYPE_SIDEBAR . '.' . static::DISPLAY_MODE_STHUMB => array(180, 180),
            static::WIDGET_TYPE_SIDEBAR . '.' . static::DISPLAY_MODE_BTHUMB => array(180, 180),
            static::WIDGET_TYPE_CENTER . '.' . static::DISPLAY_MODE_GRID => array(220, 220)
            static::WIDGET_TYPE_CENTER . '.' . static::DISPLAY_MODE_LIST => array(220, 220),
            'other' => array(110, 110),
        );
    }
}
Уверен, что где прописать размеры иконок продуктов - понятно :) где какие иконки - понятно не сразу, но разобраться не сложно.

Сложнее другое. Эти иконки общие и используются и в других модулях, дизайн которых портится после изменения размена иконок. Так, например "рекомендуемые товары" в модуле Add2CartPopup начинают наползать друг на друга. И что делать?

Нужно найти ВСЕ такие проблемные модули и декорировать их классы, указав, что виджет должен оперировать "старым" размером изображений товаров. Для Add2CartPopup я в своем модуле-скине добавил файл XLite\Module\DAG\MaayaSkin\View\Products.php со следующим кодом (использование именно этого метода класса Products спорно, но почему бы и нет?):

<?php
// vim: set ts=4 sw=4 sts=4 et:

namespace XLite\Module\DAG\MaayaSkin\View;

class Products extends \XLite\Module\XC\Add2CartPopup\View\Products implements \XLite\Base\IDecorator
{

    protected function getMaxCount()
    {
        $this->widgetParams[self::PARAM_ICON_MAX_WIDTH]->setValue(180);
        $this->widgetParams[self::PARAM_ICON_MAX_HEIGHT]->setValue(180);

        return static::PARAM_MAX_PRODUCT_COUNT;
    }

}
Перезагружаем магазин и видим, что все ОК.

Я подозреваю, что явно указывая вместо self нужный класс виджета (в нашем случае это \XLite\Module\XC\Add2CartPopup\View\Products)- можно менять его параметры из другого виджета, не затрагивая кода самого класса.

обсуждение этой темы на офф форуме X-Cart доступно по ссылке