Пределываем paramEdit на multiTV

И так, суть состоит в том, чтобы избавится от phx и paramEdit и переделать все доп параметры товаров на multiTV.

И так начнем.
P.S. Если вы устанавливаете SHK из Extras. То там уже изменен нужный файлик для совместимости с multiTV.
github.com/extras-evolution/Shopkeeper/commit/928d54ac4ef167d7178535afedc866692d15ed4b
если же нет то рекомендую обновить, иначе работать не будет.

Теперь наш json из multiTV будет передаваться в корзину и выводится в плесхолдере
[+addit_data+]
Дальше на multiTV можно делать все что душе пожелается.

Далее на примере селекта переделаем наш paramEdit на multiTV
На странице товара вместо
[*size:shk_widget=`select:size:desc_page:first_selected`*]

Вставляем вызов multiTV с нужными классами, чтобы все работало на стандартном js шопкипера.

[[multiTV?
&tvName=`params`
&docid=`[*id*]`
&outerTpl=`@CODE:<select class="addparam" onchange="jQuery.additOpt(this)" name="params__[*id*]">((wrapper))</select>`
&rowTpl=`price-row`
&display=`all`
]]

Чанк price-row
<option value="[[if? &is=`[+iteration+]-1` &math=`on`]]__[+price+]" [[if? &is=`[+iteration+]-1:=:0` &then=`selected="selected"` &math=`on`]]>[+size+]</option>

теперь все работает из коробки с использованием multiTV, что дает нам гораздо больше гибкости, чем paramEdit


Единственный важный момент в данном способе в конфиге multiTV у Вас должны быть обязательно название полей size и price.

27 комментариев

avatar
Переделывать SHK не нужно я в extrass уже обновил ))
Так что первую часть поста замени просто на: скачиваем SHK с репозитория или github :)
github.com/extras-evolution/Shopkeeper/commit/928d54ac4ef167d7178535afedc866692d15ed4b
avatar
а с испортом и экспорт как дела обстоят? он в json будет экспорт делать?
avatar
Как раз ради этого и задумывалась переделка на multiTV. Запись в multiTV на проблема сделать при экспорте. Но не через catalogFill
avatar
Вообщем теперь можно по уму импортировать товары с разными размерами + сделать учет по количеству в разной модификации + делать сетку размеров цветов в разы проще. Раньше с paramEdit не получалось такого ибо там всего 2 параметра было доступно для работы а тут теперь сколько нужно )
avatar
Получается что если название поля будет не size, а color например, нужно будет в конфиге менять?

$a_val_arr[] = $v['size'].'=='.$v['price']; 


И если добавить второй вызов мультиТв, с какой нибудь платной опцией, нужно будет добавить вторую строчку в конфиг?

типа:

$a_val_arr[] = $v['optionname'].'=='.$v['price']; 
Комментарий отредактирован 2016-02-10 20:58:10 пользователем Advanced
avatar
p.s. С редактированием беда какая то. Опечатался, не в конфиге, а в классе шопкипера.
avatar
Добрый день.
А можно ли непосредственно название и цену брать из мультиТВ?
Если, например, есть меню
Роллы >
Филадельфия с огурцом > цена
Филадельфия угорь > цена
Никак догнать не могу, как составить чанк shopStuff, если это вообще возможно.
avatar
А зачем так замудренно? Проще сделать отдельным документом. Данное решение подходит для дополнительных параметров каждого товара. У Вас же каждое блюдо меню — это отдельный товар. А на одной странице можете собрать при помощи доклистера.
avatar
в том то и дело… Раньше там не было возможности заказа, поэтому все было сделано на МультиТВ, чтобы не заводить сотни наименований… А так просто и быстро, только категория и в ней наименования, с фотографией и ценой. А теперь появилась необходимость в корзине. И вот теперь, либо решать эту проблему с мультиТВ, либо переносить весь каталог в отдельные товары. Что очень трудоёмко)
avatar
А почему вы упираетесь именно в «стандартные» схемы ShK?

Если у вас есть готовый вывод товаров (неважно из mTV или вообще из отдельной таблицы в БД) в каталоге, значит вы можете организовать с помощью JS их добавление либо в js-корзину, либо в сессию.

Кроме того, если вам все же хочется попасть в комфортную и привычную среду, перенос товаров из одного формата в другой с использованием ModxAPI займет 1 час на написание + 1 час на отладку + 2 минуты на перенос + 10 минут на проверку, что все корректно перенеслось.
avatar
Возможно неправильно понял вашу фразу про «Стандартные схемы». То есть совсем отказаться от SHK? Но этого бы не хотелось из-за готового функционала типа списка заказов или готового модуля Я.Кассы.
Просто предположил, что есть какой-либо способ использовать то что есть, а у меня на него мозгов не хватает)
avatar
Под стандартными схемами я подразумеваю использование плейсхолдеров Ditto/CatalogView. У вас в каталоге выводятся товары через возможности mTV — ну так перепишите чанк шопкипера shopStuff с одним товаром, чтобы вместо этих плейсхолдеров использовались поля mTV и вызов сниппета mTV.

Я бы привел более конкретный пример кода, но ShK не пользуюсь уже очень давно. Тем не менее, схема вывода данных будет в любом варианте привычная для modx. Вызвать сниппет в чанке другого сниппета и убедиться, что нет подвоха с id товаров (ЕМНИП ссылки на товары в корзине все же требуют честных id ресурсов).

А вообще, я бы в вашем случае все же глянул бы в сторону конвертации mTV в ресурсы. Это проще, чем кажется.
avatar
Не совсем понятно в чем суть проблемы.
Вывод каждой строки multiTV оборачиваете в форму. Id передаете общий (ресурса, к котрому привязан товар), название из multiTV, и цену. Потом цену ловите в плагине на событии OnSHKgetProductPrice и вставляете свою.
Делов на 10 минут в принципе :)
avatar
Да, действительно. Спасибо большое.

Сделал так, если кому надо:
Из формы передаётся дополнительное поле с ценой ([+price+] указан в конфиге multiTV)

<input type="hidden" name="price__[+id+]__add" value="[+price+]" />

а на событие OnSHKgetProductPrice вешаю плагин:

$e = &$modx->Event;
$p_price = "";

if ($e->name == 'OnSHKgetProductPrice') {
// узнаем ID
	$prodIdArr = explode('__',$purchaseArray['shk-id']);
        $p_id = is_numeric($prodIdArr[0]) ? $prodIdArr[0] : 0;
// беру нужное значение	
	$prodPrice = 'price__'.$p_id.'__add';
	$prodPriceArr = explode('__',$purchaseArray[$prodPrice]);
        $p_price = is_numeric($prodPriceArr[0]) ? $prodPriceArr[0] : 0;
	
	$e->output($p_price);
}


всё работает)
avatar
А если я в отладчике исправлю значение value, сделаю заказ и оплачу — привезете пиццу или что там? ((:
avatar
Как вариант — передаем дополнительно в форме еще и [+iteration+] из multiTV, а потом берем в плагине значение multiTV для общего продукта и сравниваем цену у нужной итерации.
Можно саму цену вообще не передавать, а только iteration, а цену брать уже в плагине по известному id продукта и номеру строки в multiTV.
avatar
Да. Это не правильно конечно). Переделал так:
В форме заменил input c ценой на
<input type="hidden" name="multitvid__[+id+]__add" value="[[if? &is=`[+iteration+]-1` &math=`on`]]" /> 

и в плагине:

$e = &$modx->Event;
$output = "";

if ($e->name == 'OnSHKgetProductPrice') {
        
        $prodIdArr = explode('__',$purchaseArray['shk-id']);
    $p_id = is_numeric($prodIdArr[0]) ? $prodIdArr[0] : 0;
        
        $prodRowName  = 'multitvid__'.$p_id.'__add';
        
        $prodRowArr  = explode('__',$purchaseArray[$prodRowName]);
        $prodRowId = is_numeric($prodRowArr[0]) ? $prodRowArr[0] : 0;
        
$data = $modx->db->getValue($modx->db->select("value",$modx->getFullTableName('site_tmplvar_contentvalues'),  "tmplvarid = 9 AND contentid='".$p_id."'"));
 
        $tvO = json_decode($data, true);
        
        if (isset($tvO['fieldValue'])) {
                $output= $tvO['fieldValue'][$prodRowId]['price'];
        }

        $e->output($output);
}

tmplvarid =9 понятно надо менять на свой.
avatar
здравствуйте!
а как в случае с multitv и приведенном последнем скриншоте фильтровать вывод списка товаров по цене и, допустим, характеристикам?
я пока сравниваю в базе какие товары и что прилетает из REQUEST своим сниппетом с парсингом json. может есть какие уже готовые элегантные решения?
спасибо!
Комментарий отредактирован 2016-11-30 20:51:27 пользователем dim2
  • dim2
  • 0
avatar
[[if? &is=`[+iteration+]-1:=:0` &then=`selected="selected"` &math=`on`]]

=
[[if? &is=`[+iteration+]:=:1` &then=`selected="selected"`]]

зачем усложнять :)
avatar
Ничего ты не понимаешь :) когда ж все сильно просто это ж не круто :)
Надо что б побольше всего что б работало медленно и что б никто другой разобраться не мог :)))
avatar
Точно, не хватает связки композер+феном :)
avatar
забыл xPDO и extJs3 ))))))
avatar
прошлый век, лучше сразу react + node.js, так оно надежней будет :)
avatar
И для лендинга в 2-3 секции :))))
avatar
А было бы неплохо =)
avatar
п.с.
суть состоит в том, чтобы избавится от phx
насколько я помню, multiTV подключает свой phx, который доступен в шаблонах. Разве нет?:)
avatar
да есть такое дело но он работает внутри только multiTV
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.