Fi1osof 28 октября 2013 1 14
В продолжение вот этого вопроса: modxclub.ru/blog/voprosy-spetsyalistov/257.html

Сейчас это еще не реализовано в официальной сборке, но покажу на примере слингов. Сразу скажу, что действий не мало надо сделать.
И еще: для обеспечения обратной совместимости хоть какой-то, придется дополнительно напрячься с переопределением классов. Единственное что могу сказать положительное, это то, что версия 2.1.0 как раз и вышла с дополнениями, которые писались под этот функционал.

Конечно, это не самое лучшее решение, и более правильный функционал появится позже в самой сборке, но если надо срочно, что чтож, значит надо делать. Итак, поехали.

Готовим параметры и базу данных

1. Создаем необходимые TV-параметры
Надо создать TV-шки этих параметров, меняющихся в товарах. В нашем случае это size и color. При этом надо в этих полях не конечное значение указать, а именно перечислить имеющиеся варианты. К примеру, у вас галстук с размерами L,X,XL и цветами Красный, Синий, Зеленый. В самом товаре надо будет выбрать все возможные значения, которые соответствуют наличию товара.
Лучше всего заводить TV-поле типа Мульти-список, в котором в возможных вариантах сразу прописать все возможные варианты. Вот так:


Или вот так:


В нашем случае не принципиально, но все-таки числовые ID-шники всегда предпочтительней.
В таблице заполненных данных TV-полей у вас будут примерно такие данные: M||XXL||L. То есть по разделителю || можно будет понять, что по этому товару есть размеры M,XXL,L. Получить массив размеров можно будет через explode('||', $value);

2. Редактируем таблицу Заказ-Товар
Надо отредактировать вручную таблицу modx_billing_order_products (через phpMyAdmin или типа того):
2.1 Добавить колонки этих параметров (повторюсь, в нашем случае это size и color). Тип данных сами определите, но ни в коем случае эти колонки не должны быть nullable, и нельзя вставлять значения null.
2.2 Надо подправить индексы — удалить уникальный ключ order_id-product_id и создать уникальный ключ со своими параметрами. В нашем случае это order_id-product_id-size-color.
2.3 Подправить map-файл класса OrderProduct. Надо в него добавить описание ваших колонок. Лучше всего для этого использовать CMPGenerator. На всякий случай ревизия: gist.github.com/Fi1osof/f0372195175ade7a72fb/revisions

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

3. Правим шаблоны
Все, на этом этапе мы уже имеем возможность добавлять товары с различными параметрами. Теперь нам просто надо в форме вывести чекбоксы или выпадающие списки с размерами и цветами, и эти данные отправить на процессор добавления товара в корзину. С шаблоном ничего показывать не буду — это обычная задача на уровне шаблона добавить поля в форму. Эти данные автоматически будут передаваться в запросе. Нам остается только на сервере поймать эти данные и учесть в добавлении товара. И вот тут начинаются трудности побольше…

Переопределяем процессоры

Для начала немного общей теории по добавлению товаров в корзину.
При добавлении товаров в корзину, запрос идет на процессор orders/products/add. Но если товара нет в заказе, то его надо добавить к заказу новой строчкой. А если уже есть, то тогда запись надо обновить. Это уже два разных действия и два совершенно разных процессора: один — create-процессор, создающий новую запись, а второй — update-процессор, обновляющий существующую запись.

Как это работает?

Есть add-процессор modMgrOrdersProductsAddProcessor. В нем в методе process выполняется поиск товара через метод findExistingObject() github.com/Fi1osof/ShopModxBox/blob/17791a616ccb43245dfdac5f6defb81a2c90b815/core/components/billing/processors/mgr/orders/products/add.class.php#L37
и в зависимости от результата выполняется тот или иной конечный процессор.

Вот наша задача здесь — это изменить принцип поиска товара в корзине. То есть здесь выполняется поиск по ключу order_id-product_id github.com/Fi1osof/ShopModxBox/blob/17791a616ccb43245dfdac5f6defb81a2c90b815/core/components/billing/processors/mgr/orders/products/add.class.php#L94
а нам надо сделать поиск по ключу order_id-product_id-size-color (или order_id-product_id-size, как это конкретно в моем примере). Вот для этого нам надо переопределить add-процессор и перенаправлять запросы на него.

3. Добавляем свой add-процессор.
Создаем свой add-процессор в вашей папке процессоров (у меня это site/web/basket/orders/products/add в неймспейсе modxsite), и в нем переопределяем метод поиска записи товара в заказе: gist.github.com/Fi1osof/642525c6ed5de4b38698#file-gistfile1-php-L28
Собственно здесь все. Если запрос на добавление товара будет отправляться на этот процессор, то товар будет искаться с учетом заданных параметров. Только не отправляйте поиск объекта дальше в родительский процессор, а то он получит первый же попавшийся товар с этим id, только без учета дополнительных параметров.

4. Переопределяем action-процессор.
Вот теперь надо сделать главное — это перенаправить запросы с клиента на этот новый add-процессор. В целом, это относительно простая задача. У нас есть в баскете общий action-процессор: github.com/Fi1osof/ShopModxBox/blob/master/core/components/basket/processors/basket/web/public/action.class.php

Вот такой у меня переопределяющий action-процессор: gist.github.com/Fi1osof/86d19bd9e5299756de55#file-gistfile1-php-L15

Запросы на него попадают двумя способами:
1. Ajax — через коннектор. github.com/Fi1osof/ShopModxBox/blob/master/assets/components/basket/connectors/connector.php#L22
2. Не Ajax — через плагин. github.com/Fi1osof/ShopModxBox/blob/master/core/components/basket/elements/plugins/basket.plugin.php#L14
То есть надо подправить путь на свой action-процессор в коннекторе (настройка будет добавлена позже), а в плагине в параметрах плагина изменить параметры basket_processor и basket_namespace (именно настройки плагина в админке, а не исходный код плагина).

Ну, в общих чертах все. Процессор вывода товаров корзины получит все записи товаров с их данными: github.com/Fi1osof/ShopModxBox/blob/17791a616ccb43245dfdac5f6defb81a2c90b815/core/components/basket/processors/basket/mgr/orders/products/getdata.class.php#L69

Останется только одна небольшая задача: в админке в модуле управления заказами не будет колонки вывода размена и цен, поэтому либо ориентироваться на данные из писем, либо править JS-ы этого модуля. github.com/Fi1osof/ShopModxBox/blob/17791a616ccb43245dfdac5f6defb81a2c90b815/manager/components/shopmodxgroupedit/js/widgets/grid.js

Вот моя ревизия на слингах: gist.github.com/Fi1osof/380d7b0587c61738b967/revisions
В целом там совсем не много.

Вот и все. Более удобный функционал для подобных задачах появится в самых ближайших версиях движка.
14 комментариев
Tramp13571
Tramp1357 30 октября 2013г в 00:23 #
базу вроде подправил (orderproducts.map.inc.php, Billing.mysql.schema.xml все отображают) (кстати, там два каталога: billing и Billing — это так и надо?), но по getCollection не выдает size и color

c процессорами вроде все понятно
Fi1osof1
Fi1osof 30 октября 2013г в 01:00 #
Billing.mysql.schema.xml вообще не играет здесь никакой роли. Он только может использоваться для генерации классов компонента, но после этого он вообще не нужен.

кстати, там два каталога: billing и Billing — это так и надо?)
Я уже где-то писал — Billing — это рудимент. Это просто у меня после CMPgenerator-а остается.
А нужен именно с маленькой буквой. И если сомневаешься — смотри в источниках файлов или в пространствах имен.


А нужный мап-файл ты так и не подправил (он указан на скриншоте). Смотри результат:
<?php
$o = $modx->newObject('OrderProduct');
print '<pre>';
print_r($o->toArray());
Tramp13571
Tramp1357 31 октября 2013г в 23:31 #
Коля, привет!
Все сделал, товары добавляются. Но есть еще несколько вопросов:
1. мини-корзина обновляется только при полной перезагрузке странички. что-то я не доделал?
2. Появилась идея в корзине менять не только количество, но и цвета и размеры. что нужно сделать, чтобы эти изменения сохранялись, а также при изменении любого параметра происходила запись в базу (примерно как при изменении цены)? че-то я запутался в процессорах :)
Fi1osof1
Fi1osof 01 ноября 2013г в 00:08 #
1. мини-корзина обновляется только при полной перезагрузке странички. что-то я не доделал?
Скорее всего ты классы не правильно прописал в верстке. Напомни мне в скайл адрес сайта.
2. Появилась идея в корзине менять не только количество, но и цвета и размеры. что нужно сделать, чтобы эти изменения сохранялись, а также при изменении любого параметра происходила запись в базу (примерно как при изменении цены)? че-то я запутался в процессорах :)
Вот с этим не советую заморачиваться. Пусть удаляют и добавляют верные товары. А иначе тебе придется проверять в своем процессоре при обновлении уже имеющуюся запись с такими параметрами в БД, и обновлять там кол-во, а текущую запись удалять. Это будет слишком накладно сейчас по расходам в калориях.
Tramp13571
Tramp1357 01 ноября 2013г в 00:15 #
А иначе тебе придется проверять в своем процессоре при обновлении уже имеющуюся запись с такими параметрами в БД
Да, я про это тоже подумал… после того, как заложил :)
Согласен. Уберу. Хотя прикольно было бы в плане юзабилити.
Fi1osof1
Fi1osof 01 ноября 2013г в 00:19 #
Прикольно, но не сейчас. Я подумаю на счет этого в новой версии.
Fi1osof1
Fi1osof 01 ноября 2013г в 00:18 #
По первому вопросу: у тебя совершенно не соблюдены атрибуты HTML-тегов, поэтому скрипт просто не срабатывает. Вот посмотри как в исходном шаблоне:
github.com/Fi1osof/ShopModxBox/blob/17791a616ccb43245dfdac5f6defb81a2c90b815/core/components/modxsite/templates/default/shop/basket/entity/index.tpl#L17

Обрати внимание на все, включая data-smodx-basket=«minibasket», data-smodx-data=«cost», class=«num» и т.п.
Tramp13571
Tramp1357 21 ноября 2013г в 23:36 #
Николай, добрый день. JS я подправил (кстати, там уже все идет из коробки, просто закомментировано :)), все заработало, но не могу разобраться с одной проблемкой: в таблице поля color и size выводятся, но у меня там хранятся коды, а названия — в других таблицах (я при старте формирую из них массивы)


        $c=$modx->getCollection('shopSize');
        $sz=array();
        foreach($c as $i){
            $sz[$i->get('id')]=$i->get('name');
        }
        $modx->setPlaceholder('shopSize',$sz);

        $c=$modx->getCollection('shopColor');
        $cl=array();
        foreach($c as $i){
            $cl[$i->get('id')]=$i->get('name');
        }
        $modx->setPlaceholder('shopColor',$cl);


И теперь мне нужно эти названия подставить вместо кодов. Я вижу два способа сделать это:
1) получить название по коду через ajax (я попробовал использовать Ext.Ajax.request, но в результате у меня все развалилось);
2) подправить процессор, который формирует данные для этой таблицы, чтобы вместо кодов он выдавал названия (я не смог разобраться, какой процессор это делает)
Не подскажешь, как лучше сделать? Может, есть какой-то более правильный путь?
Fi1osof1
Fi1osof 22 ноября 2013г в 12:14 #
Саша, привет!

У тебя есть процессор, который получает данные товаров. Как правило это web/catalog/products/getdata. Вот тебе там и надо в метод setSelection() добавить дополнительные колонки. Или в методе afterIteration() уже в конечном массиве данных добавить элементы.
Ты скорее всего добавил в исходный TV сразу набор значений, к примеру X==1||XL==2 и т.п. Я же обычно делаю это на документах (там специально заведен контекст spravochniki). Вот если у тебя это было бы сделано на документах, то тебе бы только оставалось в setSelection() приджоинить таблицу документов по значениям-ключам TV-шек и все, получил бы названия размеров, цветов и т.п.
Но у тебя скорее всего готовый набор значений. Значит тебе надо сделать так: я специально для таких случаев вот написал сниппет на скорую руку:
<?php
$elements = array();

if($id AND $doc = $modx->getObject('modTemplateVar', $id)){
    if($els = $doc->elements){
        $els = explode('||', $els);
        
        foreach($els as $el){
            $a = explode('==', $el);     
            
            if(isset($a[1])){
                $el_value = $a[1];
            }
            else{
                $el_value = $a[0];
            }
            
            $title = $a[0];
            
            $elements[$el_value] = $title;
        }
    }
}

return isset($elements[$value]) ? $elements[$value] : null;


Пример вызова: [[getListValue?id=`10`&value=`[[*color]]` ]]

Параметры:
id — id TV-параметра.
value = значение TV-параметра.

Это для тех TV-шек, где данные четко перечислены в самом TV-параметре, к примеру Выберите цвет==0||Черный==1||Красный||Белый==3
Tramp13571
Tramp1357 22 ноября 2013г в 20:17 #
Коля, привет. спасибо за ответ.
Но у тебя скорее всего готовый набор значений.
Нет, у меня две таблички с полями (id,name) и их можно джойнить. весь вопрос в том, какой процессор готовит данные для вывода содержимого заказа в менеджере (управление заказами)

от и есть web/catalog/products/getdata?
Fi1osof1
Fi1osof 23 ноября 2013г в 20:16 #
от и есть web/catalog/products/getdata?
Ну да, если ты ничего не менял, то это он. Но ты посмотри это там, где у тебя идет вызов процессора и все.
Tramp13571
Tramp1357 23 ноября 2013г в 22:41 #
Понял, спасибо
Fi1osof1
Fi1osof 23 ноября 2013г в 23:37 #
Не за что.
Tramp13571
Tramp1357 23 ноября 2013г в 23:31 #
И все-таки я не совсем понял. У меня там нет вызова процессора, эта табличка выводится в админке, в менеджере заказов. Ты же писал в топике:
Останется только одна небольшая задача: в админке в модуле управления заказами не будет колонки вывода размена и цен, поэтому либо ориентироваться на данные из писем, либо править JS-ы этого модуля.
JS я подправил, но выводится только код.
Fi1osof1
Fi1osof 23 ноября 2013г в 23:37 #
Смотри процессор, который используется при получении данных.
M
MisterN 20 января 2015г в 22:15 #
Да, все хочу и все забываю задать вопрос. Я изминил таблицу, core\components\billing\model\billing\mysql\orderproduct.map.inc.php и формы покупки. А вот с переопределением процессоров чет путаюсь и в первый и во-второй раз.
Вместо переопределения я чуть дописал свой параметр к методу getObject из core\components\billing\processors\mgr\orders\products\add.class.php

    protected function getObject(){
        $object = null;
        if(
            $order_id = $this->getProperty('order_id', null) 
            AND $product_id = $this->getProperty('product_id', null)
            AND $myVar = $this->getProperty('myVar', 'null)
        ){
            $object = $this->modx->getObject('OrderProduct', array(
                'order_id'  => $order_id,
                'product_id'=> $product_id,
                'warehouse' => $myVar,

            ));
        }
        
        return $object;
    }

Ну, скрипты CMP тоже подправил, естественно. Я понимаю, что должен более точно описать, что делал, но переносил ночью и точно не помню )
Этот более короткий способ, чем описан выше. И вроде так работает. Я хотел узнать, я этим не накосячил сильно, так же можно делать? Никаких глюков не заметил и работало так неск.месяцев.
Fi1osof1
Fi1osof 20 января 2015г в 22:19 #
AND $myVar = $this->getProperty('myVar', 'null)
С этим только проблемка может быть. Если не был передан myVar, то объект не будет получен. Это обязывает все твои товары иметь свойство myVar. Но если это так, то проблем никаких не должно быть.
M
MisterN 20 января 2015г в 22:26 #
Ок, спасибо. Да он там везде в форме подставлен, так что не должно быть. Ну, вообще-то я там замутил, что если myVar-а нет, то смотреть соответствующий тв, и если там значит пусто или два варианта, то подставлять дефолт, а если один — то ставить его. Но дело ночью было и что-то не полетело. Забил ))
M
MisterN 20 января 2015г в 22:19 #
Просто я не менял ничего в процессорах, кроме core\components\billing\processors\mgr\orders\products\add.class.php
Fi1osof1
Fi1osof 20 января 2015г в 22:29 #
Ну, работает, и славно.
a
andrei.balkin 07 июля 2015г в 08:02 #
Добрый день подскажите, а для вывода Групповой редактор значения твшки достаточно отредактировать /manager/components/shopmodxgroupedit/js/widgets/grid.js. Почему то кастомные поля выводит а tv нет.
a
andrei.balkin 07 июля 2015г в 10:15 #
Все работает и товар падает в корзину, но не выводит значения tv в Групповом редакторе, совсем пусто там ) Причем пробовал выводить не tv поле (introtext) — все отлично. Делаю все аналогично — gist.github.com/Fi1osof/380d7b0587c61738b967/revisions
a
andrei.balkin 07 июля 2015г в 10:39 #
Или все таки нужно редактировать еще процессоры shopmodxgroupedit?
a
andrei.balkin 07 июля 2015г в 10:49 #
Да именно — все разобрался)
Fi1osof1
Fi1osof 07 июля 2015г в 16:32 #
Должно быть:
1. В ExtJS описание колонок (fields), чтобы возпринимал передаваемые с сервера данные.
2. Там же описание колонок для грида (чтобы понимать что выводить из записей).
3. Процессор с сервера должен отдавать нужные вам данные.
Тогда все ОК будет.
Fi1osof1
Fi1osof 07 июля 2015г в 16:33 #
2. Там же описание колонок для грида
Columns или ColumnsModel (он же cm).
a
andrei.balkin 07 июля 2015г в 16:40 #
Спасибо Николай, с этим порядок уже )
a
andrei.balkin 07 июля 2015г в 17:08 #
Николай подскажите еще такую штуку раньше не делал, алгоритм действий хотя бы, мне необходимо чтобы при смене размера менялись и цены, тоесть попадали в заказ и далее. Добавлю в MIGX Tv еще одну колонку, (у меня там уже есть — артикул, цвет, размер). Вот с ценой проблемиус, куда копать подскажите
Tramp13571
Tramp1357 07 июля 2015г в 17:21 #
надо просто переписать процессоры, чтобы не sm_price исполььзовали, а эту колонку с ценой. А в sm_price прописать базовое значение — для сортировки и фильтрации
a
andrei.balkin 07 июля 2015г в 17:25 #
А базово в каких это процессорах не подскажите?
Tramp13571
Tramp1357 07 июля 2015г в 17:35 #
[modxsite]web/catalog/products/getdata
Ну и tpl надо будет тоже подправить, которые с ценами работают.
Tramp13571
Tramp1357 07 июля 2015г в 17:28 #
на сервере при добавлении товара в корзину его цена берется из базы, а не из запроса. Товар в корзине/заказе идентифицируется по первичному ключу (order_id,product_id,,...) т.е. достаточно переписать процессоры getdata для товаров, да на JS [+ajax] дописать функционал показа нужной цены на страничке.
Да, еще при оформлении заказа нудно по ключу получить цену.
Как-то так. :)
a
andrei.balkin 07 июля 2015г в 17:33 #
Ок спасибо сейчас попробую, я что-то перемудрил помоему
Fi1osof1
Fi1osof 07 июля 2015г в 17:35 #
Включи поиск. Это все уже подробно описывалось. Саша уже замахался ссылки постить, я тоже.
a
andrei.balkin 07 июля 2015г в 17:38 #
Да все тут вроде и обсуждается на этой странице ) Спасибо, если что простите за повторы. Скоро разберусь буду сам постить тем кому не понятно )
a
andrei.balkin 07 июля 2015г в 19:20 #
Нет все таки не могу понять я ) как можно MIGx развернуть в web/catalog/products/getdata получаю только последнее значение

public function afterIteration(array $list){
       $list = parent::afterIteration($list);
         foreach($list as & $l){
            if(!empty($l['tvs']['options']['value']) AND $options = json_decode($l['tvs']['options']['value'], true)) {   
                $l['options'] = array();
                foreach($options as $item){
                     $l['options'][] = $item;
                }
            }    
                  if(!empty($l['tvs']['options']['value'])){ 
                $l['sm_price'] =  $item['price'];
            }       
        }
         return $list;
    }
     

Tramp13571
Tramp1357 07 июля 2015г в 20:01 #
Я так делаю (функция afterIteration)
if ($views=$l['tvs']['options']['value']){
                    $views=json_decode($views,1);
                    $options=[];
                    foreach($views as $r){
                        $vs=json_decode($r['views'],1);
                        $o=[
                            'option'=>$r['option'],
                            'price'=>$r['price']?$r['price']:$l['sm_price'],
                            'views'=>[],
                        ];
                        foreach($vs as $v){
                            $o['views'][]=$images_base_url . $v['img'];
                        }
                        $options[]=$o;
                    }
                    $l['options']=$options;
//                    unset($l['tvs']['options']);
                }
a
andrei.balkin 07 июля 2015г в 20:28 #
Спасибо, но мозг закипел еще сильнее, наверное завтра разберу теперь )
Tramp13571
Tramp1357 07 июля 2015г в 21:03 #
Данные в переменной MIGX хранятся в JSON, поэтому сперва распакуем их
$vs=json_decode($r['views'],1);

и после этого формируем данные как угодно
a
andrei.balkin 08 июля 2015г в 07:15 #
ну у меня данные MIGX в таком виде
[{"MIGX_id":"1","art":"m","size":"91\/47 \u0441\u043c","price":"1900"},{"MIGX_id":"2","art":"x","size":"121\/63 \u0441\u043c","price":"2300"},{"MIGX_id":"3","art":"xl","size":"153\/80 \u0441\u043c","price":"2900"}]


Собственно второй раз не нужно как у вас для views.

Второй момент
'price'=>$r['price']?$r['price']:$l['sm_price'],
немного не понял смысл этого выражения

Третий момент

public function afterIteration(array $list){
       
       $list = parent::afterIteration($list);
        foreach($list as & $l){
                   if($list=json_decode($l['tvs']['options']['value'],1)){
                    $options=[];
                    foreach($list as $r){
                        $o=[
                            'art'=>$r['art'],
                            'price'=>$r['price']?$r['price']:$l['sm_price'],
                            'size'=>$r['size'],
                        ];
                        $options[]=$o;
                    }
                    $l['options']=$options;
    } 
        }
         return $list;
    }

вывел у себя вот так, на выходе получил только массив MIGX, а остальное куда пропало. Туплю чего то
a
andrei.balkin 08 июля 2015г в 10:42 #
Да с мигой разобрался, получил массив, но вот цена все равно мне не ясно как? у меня же в getdata их три для каждого товара
a
andrei.balkin 08 июля 2015г в 11:28 #
Help. Как переопределить эти цены? Помогите + 500 на развитие проекта
a
andrei.balkin 08 июля 2015г в 11:40 #
Может кто лично объяснить на примерах за вознаграждение?
Fi1osof1
Fi1osof 08 июля 2015г в 11:48 #
Помогите + 500 на развитие проекта
+ 500 на развитие — это люди просто сбрасывают молча и все. К слову, не часто делают последнее время. Но это и не страшно.
Лично объяснить? — 2000 рублей часовая консультация. Достаточно, чтобы разобрать все эти моменты.
a
andrei.balkin 08 июля 2015г в 11:50 #
Николай да час там нечего объяснять я думаю это много по времени ) хотя вам виднее конечно. Если сможете буду рад
Fi1osof1
Fi1osof 08 июля 2015г в 11:55 #
2000 через форму отправляйте и на n.lanets@modxclub.ru пишите, время согласуем на ближайшие дни.
a
andrei.balkin 08 июля 2015г в 17:05 #
Хорошо Николай, в ближайшие дни тогда, просто мне нужно это сейчас добить )

Я так в принципе все разобрал сам, но будут еще вопросы по движку, который хотелось понять раз и навсегда. Сейчас если не сложно могли бы помочь понять такую штуку

Как при оформлении заказа по ключу получить цену. Это в процессоре processors/mgr/orders/products/create.class.php я правильно понял? Необходимо переопределить его функцию setPrices()
a
andrei.balkin 08 июля 2015г в 17:21 #
Переопределил подобно описанию Александра в посте
modxclub.ru/topics/izmenyaemaya-czena-na-shopmodxbox-1259.html

И теперь бы понять как по ключу получить цену, у меня по три для каждого товара, в массиве options
Tramp13571
Tramp1357 08 июля 2015г в 17:42 #
сам товар получаешь по product_id, потом раскладываешь MIGX options в массив и по остальным параметрам, переданным в запросе, подбираешь цену.
a
andrei.balkin 08 июля 2015г в 17:50 #
я так понимаю не спроста вот в getdata
'price'=>$r['price']?$r['price']:$l['sm_price'],
a
andrei.balkin 08 июля 2015г в 17:52 #
Пример бы, уже сбился столку
Tramp13571
Tramp1357 08 июля 2015г в 18:02 #
кодга добавляешь новый товар к заказу, с сайта приходят product_id, quantity и несколько параметров.
по product_id получаешь этот товар, берешь поле options и в цикле ищешь в нем запись, в которой параметры совпадают.
например, после json_decode имеем для товара
$options=[
[color=red,size=1,price=100],
[color=blue,size=2,price=200],
[color=blue,size=4,price=400],
]
в запросе передано color=blue, size=4
Ищем запись, в которой color и size совпадают, и берем цену из этой записи.

Извиняюсь, но времени нет более подробные примеры писать.
a
andrei.balkin 08 июля 2015г в 18:05 #
Спасибо и на этом уже логика понятна, но не ясно как получить товар по product_id, буду думать
a
andrei.balkin 08 июля 2015г в 18:10 #
$product = $this->modx->getObject('ShopmodxProduct', (int)$this->getProperty('product_id')) так?
Tramp13571
Tramp1357 08 июля 2015г в 18:16 #
да. в нем есть resource_id. тут написал modxclub.ru/blog/dokumentatsiya-dlya-spetsialistov/258.html#comment-7023
Tramp13571
Tramp1357 08 июля 2015г в 17:52 #
да, утром закрутился, не ответил.
Это позволяет задать базовую цену, а в MIGX указывать только цены, отличные от нее. Простая дань лени (или забота о менеджерах :))
т.е. если цена не зависит от опций, то достаточно указать sm_price (базовую)
Tramp13571
Tramp1357 08 июля 2015г в 18:14 #
Внимательно изучи процессор core\components\billing\processors\mgr\orders\products\create.class.php — там все есть.

Или можно в форму кроме product_id передавать еще и resource_id — тогда проблем вообще не будет.
a
andrei.balkin 08 июля 2015г в 18:18 #
Огромное спасибо, человечище.
a
andrei.balkin 08 июля 2015г в 18:31 #
а как бы протестить это дело в консоли, или никак
Tramp13571
Tramp1357 08 июля 2015г в 18:48 #
легко. Воспользуйся поиском по сайту — тут где-то скрипт лежит вызова процессора через консоль. Я только в консоли все и проверяю
a
andrei.balkin 08 июля 2015г в 19:44 #
Спасибо Николай правильно ли я получаю options?

$product = $this->modx->getObject('ShopmodxProduct', (int)$this->getProperty('product_id'));
    $options = $product->get('options');


Почему то не возвращает
a
andrei.balkin 08 июля 2015г в 20:05 #
protected function getPrice($product){
    $prod = $this->modx->getObject('ShopmodxProduct', (int)$this->getProperty('product_id'));
    $id = $prod->get('resource_id');
    $resource = $modx->getObject('modResource',$id);
    $options = $resource->getTVValue('options');
    $options = $resource->getTVValue(15); 
    $op = json_decode($options, 1);
    $art = $this->getProperty('art');
    $size = $this->getProperty('size');
    foreach($op as $key=>$option){
        if(in_array($art,$option) && in_array($size,$option)){
            $opt[]=$option;
        }
    }

    foreach($opt as $k ){
       $product = $k['price']; 
    }
    
        return $product;
}

Посмотрите где может быть ошибка пожалуйста
Fi1osof1
Fi1osof 08 июля 2015г в 22:00 #
Неправильно. Почему? Не скажу. Не надо тыкать пальцем в небо. Изучите нормально xPDO, если в это лезете. Вот в помощь ilyaut.ru/xpdo/
a
andrei.balkin 08 июля 2015г в 22:15 #
Разобрался Николай ) Все работает. Огромное вам спасибо. Как вам приемлимо будет в какой день меня подтаскивать немного надо все же в этом деле. В выходные наверное? С ошибками комменты может стереть )
Fi1osof1
Fi1osof 08 июля 2015г в 22:17 #
Пишите на n.lanets@modxclub.ru, согласуем.
Удалять ничего не надо. Кому-нибудь пригодится.
a
andrei.balkin 08 июля 2015г в 22:22 #
Ок. Еще раз спасибо за функционал. Реально крутой движок. На мой взгляд в чем-то Битрикс нервно курит в сторонке )
А
Андрей Балкин 04 августа 2015г в 12:11 #
Подскажите а в каком процессоре подменять $object.image в зависимости от цвета попадающего в корзину и в заказ, или может как то иначе нужно, запутался…
Tramp13571
Tramp1357 04 августа 2015г в 12:18 #
если нужна картинка в заказ, то я бы так делал: при добавлении в заказ (orderproduct) нужно просто сохранять id или название цвета. А при выводе (getdata) просто по этому id подбирать нужную картинку и прописывать ее в image
А
Андрей Балкин 04 августа 2015г в 12:25 #
При добавлении в заказ у меня сохраняется цвет в в базу orderproduct. А при выводе не могу понять в каком процессоре подбирать
А
Андрей Балкин 04 августа 2015г в 12:35 #
Получается в процессоре getdata Получения данных корзины?
Tramp13571
Tramp1357 04 августа 2015г в 16:41 #
Да, basket/mgr/orders/products/getdata
А
Андрей Балкин 04 августа 2015г в 17:21 #
Спасибо в корзину временно добавил через сниппет ). Если сделать через процессор то в заказ тоже автоматически попадет? или там тоже надо все равно в другом процессоре подбирать. Мне нужно совсем переопределить переменную $object.image, чтобы везде была такая логика. Изначально где инклюдится $object.image?
Tramp13571
Tramp1357 04 августа 2015г в 18:56 #
[modxsite]web/resources/getdata
Но этого мало. этот процессор не учитывает, какая опция выбрана при помещении в корзину.
переопределять надо именно [basket]basket/mgr/orders/products/getdata
А
Андрей Балкин 04 августа 2015г в 19:07 #
Да спасибо Александр, как раз ловлю переменную )
А
Андрей Балкин 04 августа 2015г в 19:49 #
Все нашел, а как записать то нужное значение?
А
Андрей Балкин 04 августа 2015г в 20:39 #
// Получаем фото товаров
          
        foreach($list as & $l){
               $color = json_decode($l['tvs']['color']['value'],1); 
                 foreach($color as $r){   
             if (str_replace(" ","",mb_strtolower(strip_tags($r['color']))) == $l['color']) {
                  $imgh = json_decode($r['renderimage'], 1); 
               }   
                    }; 
              $l['image'] =   $imgh[0]['image'];               
           }
        
        return $list;
    }
    
    public function outputArray(array $array, $count = false){


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