суббота, 28 февраля 2015 г.

Где в X-CART 5 смотреть ошибки?

Все просто: /VAR/LOGS

Причем логи ведутся по человечески, все наглядно и достаточно для отладки. Причем наверно не стоит забывать их чистить...  Судя по моему другому сайду они могут разбухать до сотен мегабайт в год, а зачем оно надо... бекапить все это сто раз (например)

Эх, еще бы в случае критических ошибок сделать так, чтобы мне на телефон отправлялась СМС... это так, заметка на будущее )))

понедельник, 16 февраля 2015 г.

Как перестать бояться REST API и полюбить ее

Прежде всего читаем официальную доку: http://kb.x-cart.com/display/XDD/REST+API+documentation вполне возможно, что информация там уже куда более новая и дополненная, ну а это... это я пишу для себя.

1. Прежде всего важно, что можно получать не только productuser and order entities, но и другие, ровно точно так же, например, передав &_path=address/22 вернет нам адрес с его ID=22.

2. REST API X-Cart (в 5.1.10 - точно) может отдавать данные не только JSON, но и XML, для этого нам нужно просто WebRequest.Accept присвоить значение 'application/xml', но какого то практического смысла я в этом не нашел (хотя с XML работал много и привык).

3. Мы можем выбирать данные с ЛЮБЫМИ условиями, для этого нам надо уметь их передать... это делается так:

http://<MY-XCART-PATH>/admin.php?target=RESTAPI&_key=rest-api-key&_path=product&_cnd[orderNumber]=3

Если нам нужно передать больше параметров, то передаем их как массив...

...&_cnd[orderNumber][0]=3&_cnd[orderNumber][1]=8 

Какие же выборки мы можем делать?


Идем в папку xcart\classes\XLite\Model\Repo - вот какие классы мы тут видим, те мы и можем выбирать, по крайней мере для меня это кажется логичным.

Далее, какие условия для фильтрации данных нам доступны? Смотрим код интересующего нас класса - видим блок

    /**
     * Allowable search params
     */



Это оно. Например для Currency доступно два параметра 

    const SEARCH_ORDER_BY = 'orderBy';
    const SEARCH_LIMIT    = 'limit';


а гдето ниже по коду мы найдем два соответствующих метода... да, есть такие! например

protected function prepareCndOrderBy(\Doctrine\ORM\QueryBuilder $queryBuilder, array $value, $countOnly)
    {
        if (!$countOnly) {
            list($sort, $order) = $this->getSortOrderValue($value);
            $queryBuilder->addOrderBy($sort, $order);
        }
    }


интереснее конечно выборки например для ордеров


    protected function prepareCndOrderMore(\Doctrine\ORM\QueryBuilder $queryBuilder, $value)
    {
        if (!empty($value)) {
            $queryBuilder->andWhere('o.order_id > :order
More')
                ->setParameter('order
More', $value);
        }
    }
а вызывать мы его будем как 

........&_path=order&_cnd[orderMore]=value

важно только не забыть (я поначалу забыл) прописать 

    const ORDER_MORE = 'orderMore';

    protected function getHandlingSearchParams()
    {
        $params = parent::getHandlingSearchParams();
        $params[] = self::ORDER_MORE;
        return $params;
    }

 

разумеется все это кладем в 

abstract class Order extends \XLite\Model\Repo\Order implements \XLite\Base\IDecorator
{
.....


в соответствующий файл (в нашем случае - Order.php) в папку /Model/Repo вашего модуля.