Максим Кузнецов

Максим Кузнецов

Был в сети 04 августа 2021, 21:51
Заказы принимаю
Не за что.)

Если с минимальными потерями (корзины похожи, но отличаются незначительно) — то легче всего при помощи ксс..))
<div class="ms2_total_product mini">[[!msCart]]</div>
<div class="ms2_total_product main">[[!msCart]]</div>
В противном случае — редактировать основной javascript-файл, передавая в него параметр, какую страницу подгружать при обновлении и перехватывать его в классе корзины, добавляя зависимые от него условия вывода чанков.

Ну и (за это уже не ручаюсь) — посмотреть, переварит ли сниппет msCart параметры &tplRow и &tplOuter и, если нет, то добавить ему такую возможность (но это плохое решение [костыль], говорю сразу).
Раз появляется массив — значит js нормально отправляет ajax-запрос и получает результат.

=> проблема в классе корзины, которая возвращает данные, не распихав массив по чанку и его плейсхолдерам. Кидайте код класса корзины (+ вы ведь указали ваш новый класс в системных настройках minishop'a?)
Ну, как вариант — выставлять условия на плейсхолдер итоговой цены.

Для чанка корзины (tpl.msCart.outer):
[[+total_count:lt=`5000`:then=`
Для оформления заказа сумма должна превышать 5000 рублей.
`:else=`
(дефолтное содержание чанка корзины с кнопкой для оформления заказа)
`]]
Для чанка оформления заказа (tpl.msOrder.outer) использовать ту же логику, только плейсхолдером выступит [[+order_cost]]

+ перехватывать итоговую стоимость плагином на события msOnBeforeChangeOrderStatus и аналогичным, сравнивая стоимость с требуемой и, в зависимости от этого, редиректить или выводить необходимые алерты.

Единственное, если у вас, допустим, расширен класс корзины для ajax-обновления, то также придется повесить условия на javascript.
Необходимо создать плагин и включить его на событие OnDocFormSave.

Код примерно такой:

<?php
	if ($modx->event->name == 'OnDocFormSave') {
		if ($resource->get('template') == 'номер_шаблона' AND strlen($resource->get('introtext')) > 0) {
			$resource->setTVValue('название_тв', $resource->get('introtext'));

			$resource->save();
		}

	}
Все работает, только в лог сыпятся ошибки:

[2015-06-10 08:11:24] (ERROR @ /home/s2040/www/system_heart/components/minishop2/custom/cart/mscustomcarthandler.class.php : 30) PHP warning: Missing argument 1 for myCustomCart::getProducts(), called in /home/s2040/www/system_heart/components/minishop2/custom/cart/mscustomcarthandler.class.php on line 13 and defined
[2015-06-10 08:11:24] (ERROR @ /home/s2040/www/system_heart/components/pdotools/model/pdotools/pdofetch.class.php : 18) Recoverable error: Argument 1 passed to pdoFetch::setConfig() must be of the type array, null given, called in /home/s2040/www/system_heart/components/pdotools/model/pdotools/pdotools.class.php on line 41 and defined
[2015-06-10 08:11:24] (ERROR @ /home/s2040/www/system_heart/components/pdotools/model/pdotools/pdofetch.class.php : 45) PHP warning: array_merge(): Argument #2 is not an array
[2015-06-10 08:11:24] (ERROR @ /home/s2040/www/system_heart/components/pdotools/model/pdotools/pdotools.class.php : 51) Recoverable error: Argument 1 passed to pdoTools::setConfig() must be of the type array, null given, called in /home/s2040/www/system_heart/components/pdotools/model/pdotools/pdofetch.class.php on line 46 and defined
[2015-06-10 08:11:24] (ERROR @ /home/s2040/www/system_heart/components/pdotools/model/pdotools/pdotools.class.php : 66) PHP warning: array_merge(): Argument #2 is not an array
Наверное, лучше вывести это в плагин на событие OnDocFormSave, чтобы не нагружать вызов.

Как-то в духе:

if ($modx->event->name == 'OnDocFormSave') {
	if($resource->get('class_key') == 'msProduct'){
		$tv_value = $resource->getTVValue('tv_name'); //заменить tv_name на название тв-поля/параметра товара

		//кол-во необходимых нулей
		if (strlen($tv_value) < 3) {
      			$newTvValue = = '0' . $tv_value;
			$resource->set('tv_name', $newTvValue);
		}

		$resource->save();
	}
}
Конечно. У меня, в свое время, тоже она возникла..) Сортировка — при помощи mfilter2:

<a data-sort="rating" data-dir="[[+mse2_sort:is=`rating:asc`:then=`asc`]]" data-default="desc" class="rating sort">рейтингу <span></span></a>
А у самого вызова я leftJoin'ю сниппет VoteForms:

[[!mFilter2? &suggestions=`1` &limit=`25` &loadModels=`voteforms` &paginator=`pdoPage@Pagination` &class=`msProduct` &element=`msProducts` &depth=`0` &toPlaceholders=`mse2_` &includeThumbs=`70x70` &showEmptyFilters=`0`
&sort=`price:asc, rating:desc`
&where=`{"class_key":"msProduct"}`
&leftJoin=`{
	"VoteFormThread": {
		"class": "VoteFormThread",
		"on": "msProduct.id = VoteFormThread.resource AND VoteFormThread.form = 1"
	}
}`
&select=`{"Data": "[[!getProductDataFields]]",  "VoteFormThread": "VoteFormThread.rating AS rating, VoteFormThread.users_count AS totalVoted"
}`
&tpls=`item.list.table`
]]