Сам это узнал в кулуарах гитхаба github.com/evolution-cms/evolution/issues/1409
Спасибо большое за помощь!
И Дмитрию писал, и в Телеге писал — никто не помогал. Но то было еще 2 месяца назад :)
  • avatar Aharito
  • 0
Согласен. Я разобрался с Multifields, но он мне как-то «не зашел», PageBuilder для меня также удобнее.

А mm_dd_multiplefields я не юзал, да ведь сейчас и нужды нет, при наличии PageBuilder и Multifields.
После того, как архив скачался и открылась страница инсталлера, надо зайти в консоли в папку core и запустить composer update, затем продолжить в веб инсталлере. На последнем шаге ему не удастся перезаписать конфиг и стереть папку /install, ее надо будет удалить самостоятельно
Я как-то с Multifields с наскока не разобрался и оставил его, pageBuilder для меня удобнее.
а еще ведь был mm_dd_multiplefields
  • avatar Aharito
  • 0
Круто! для новичков отличный материал!

По теме:
1) Я бы даже на стал писать про MultiTV<v, отношу его к морально устаревшим и также использую PageBuilder вместо него.

2) Если брать подобное МультиТВ дополнение, также использующее ТВ-параметры, то я бы упомянул Multifields. Но оно не так широко распространено, по крайней мере пока что.
  • avatar Aharito
  • 0
В доках пишут (там это очень незаметно написано):
В параметрах шаблонов следует указывать уровень на 1 меньше (например, rowTpl2 будет применен к документам третьего уровня, а rowTpl0 — первого).
Значит, пишем шаблон parentRowTpl1 и т.д.
  • avatar paic
  • 0
Так тоже работает.
Сделал через плагин и плейсхолдер для единообразия
switch ($modx->Event->name) {
    case 'OnWebPageInit': {
		if (ci()->carts->getCart('products')->has($modx->documentIdentifier)) {
			$modx->setPlaceholder('products_class','active');
		}
	}
	break;	
}

Планин в списке вызовов поставил последним.
Остальное как п. 4а (скрипт и кнопка + стили). В общем, красота, спасибо за компонент и за помощь в освоении.
  • avatar paic
  • 0
спасибо, попробую и так
  • avatar kassio
  • 1
Можно еще проще, кстати:
if (ci()->carts->getCart('products')->has($modx->documentIdentifier)) {
    return 'active';
}
  • avatar paic
  • 0
ага, понял, спасибо.
  • avatar kassio
  • 1
Ну вот простейший вариант:

$products = ci()->carts->getCart('products')->getItems();
$ids = array_flip(array_column($products, 'id'));
    
if (isset($ids[$modx->documentIdentifier])) {
    return 'active';
}
  • avatar paic
  • 0
Спасибо.
  • avatar kassio
  • 1
Да не обязательно, я понял задачу
  • avatar paic
  • 0
Спасибо.
Гит требует авторизоваться, пошел искать свои доступы
  • avatar paic
  • 0
Спасибо.
4. Да просто пока не въезжаю, как выцепить список товаров из корзины чтобы проверить есть там товар, на странице которой нахожусь, или нет ((
  • avatar kassio
  • 1
  • avatar kassio
  • 1
1. Плейсхолдер для дополнительной информации. Например, плагины оплаты выводят туда ссылку на оплату заказа.
2. Разницы нет.
4. Не знаю, почему для карточки товара не получилось, но смысл там такой же. Делайте сниппет и выводите класс кнопки им.
  • avatar sakhnov
  • 0
Тоже этот вопрос сильно интересует. После закрытия DLBuildMenu, как теперь задавать шаблоны второго уровня?
Поделитесь примером, кто как решил эту задачу.
  • avatar paic
  • 0
Всем добрый день. Продолжаю осваивать и чем могу — делюсь))
Появилось несколько вопросов, подскажите, пожалуйста:
1. В шаблоне order_reportback.tpl есть плейсхолдер [+extra+] — что в него должно выводиться? Как то не нашел, и не выводится ничего. В аналогичном шаблоне order_report.tpl такого плейсхолдера нет.

2. В указанных выше шаблонах разнятся плейсхолдеры оплаты и доставки [+delivery_method_title+] и [+payment_method_title+] в шаблоне order_report.tpl, [+order.fields.delivery_method_title+] и [+order.fields.payment_method_title+] в шаблоне order_reportback.tpl. Срабатывают оба варианта, а в чем разница?

3. Не хватает пустого шаблона для сниппета Order, как его можно сделать или может у кого есть решение? Смысл в том, что на сайте есть и страница Корзина, и страница Оформление заказа. На странице оформления заказа я сниппет Cart вызываю в чанке order_form для сниппета Order (так по дизайну — сначала форма, потом корзина, потом кнопка Отправить заказ). И получается. что если в корзине ничего нет, то страница Оформление заказа девственно чистая. На странице с корзиной — там все нормально, шаблон для пустой корзины есть и его можно стилизовать под дизайн сайта. Хотелось бы примерно так же и на странице Оформление заказа иметь шаблон пустого заказа.

4. Здесь будет много букв.
Хочу сделать такой функционал и на странице товара, и в анонсах товара на странице категории: Если товара нет в корзине — выводится кнопка В корзину. Если товар уже в корзине, то выводится кнопка Товар в корзине.
Ранее (выше) эти вопросы уже обсуждалось, но на реальном сайте когда все на аякс появляются дополнительные сложности.

4.а. Страница категории. В итоге в категориях сделал с помощью препаре LinkActiveDL от автора
$lists = $_extDocLister->getStore('commercelists');

if ($lists === null) {
    $carts = ci()->carts;
    $lists = [
        'products'   => $carts->getCart('products')->getItems(),
    ];
        
    foreach ($lists as $list => $items) {
        $lists[$list] = array_flip(array_column($items, 'id'));
    }
        
    $_extDocLister->setStore('commercelists', $lists);
}

foreach ($lists as $list => $ids) {
    if (isset($ids[$data['id']])) {
        $data[$list . '_class'] = ' active';
    }
}

return $data;

И все бы хорошо, но при добавлении товара в корзину не происходит ничего, поэтому пришлось добавить скрипт
$(document).on('cart-add-complete.commerce', function(e, params) {
	if (params.response.status == 'success') {
        $('.btn-cart[data-id="' + params.data.id + '"]').addClass(' active');
    }
});

а в кнопку атрибут data, кнопка в форме теперь выглядит так
<button type="submit" class="btn-cart[+products_class+]" data-id="[+id+]"><span></span></button>

И все стало работать как надо — и сразу при добавлении, и при серфинге по сайту ничего не пропадает.
Надписи в кнопку меняются стилями
.btn-cart span::before {
    content: "Купить";
}
.btn-cart.active span::before {
    content: "В корзине";

}
Не знаю, плохо ли или хорошо, но вроде работает, покритикуйте ежели что или предложите свой другой вариант))

4.б. Страница товара. Здесь у меня пока не получается и прошу «помощь зала».
Уже известно, что на странице товара доступны плейсхолдеры [+products_active+], [+products_contains+], [+products_count+]. Но при аяксе они не срабатывают (здесь можно тот же скрипт, что в 4а), а если страница кэшируемая (а она кэшируема), то все-равно глухо — индикация слетает. А плагин на OnWebPageInit, как ранее советовал kassio, из варианта препаре для DL, у меня не получился.

Подскажите как сделать переключатель кнопки В корзину/Товар в корзине на странице товара? Может у кого уже есть рабочий вариант.

Спасибо.