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

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

Был в сети 04 августа 2021, 21:51
Заказы принимаю
[[!getPage?
                           &elementClass=`modSnippet`
                           &element=`getResources`
                           &tpl=`salonlist`
                           &includeTVs=`1`
                           &processTVs=`1`
                           &hideContainers=`1`
                           &depth=`1`
                           &limit=`10`
                           &parents=`16`
$sortby= $_GET['sortbyTV'] 
$sortdir= $_GET['sortdirTV']
                           &sortbyTVType=`integer`
                           &pageVarKey=`page`
                           &tvFilters=`metro==%[[!Metro?]]%`
                           &pageFirstTpl=`<li class="control"><a [[+classes]] href="[[+href]]">Первая</a></li>`
                           &pageLastTpl=`<li class="control"><a [[+classes]] href="[[+href]]">Последняя</a></li>`
                         ]]

— в этом вызове замените строчки
$sortby= $_GET['sortbyTV'] 
$sortdir= $_GET['sortdirTV']

на:
&sortby=`{"pagetitle":"ASC"}`

Важно: сейчас у вас реализован функционал, при котором перехватываются значения сортировки из адресной строки. При вышеописанных изменениях он пропадет. Если его необходимо сохранить — нужно будет дописать небольшой сниппет для переключения между желаемой сортировкой и вбитой в адресной строке.
Если вам нужно сортировать отображение раздела по умолчанию, то в выводящем сниппете допишите параметры:
&sortby=`pagetitle` &sortdir=`ASC`
— пример актуален для сниппетов семейства
pdoTools.
(параметры могут отличаться, если выводящий сниппет другой — укажите, чем вы вызываете раздел.)

Если вам нужно сортировать его по клику, то необходимо или дописать перехват сниппетом get-значений для сортировки или воспользоваться готовым решением, как mFilter2.
$dis = $modx->resource->getTVValue('discount');
Проблема как минимум в этой строчке, т.к. вам нужно получить не тв-поле текущего ресурса, а тв-поле товара.

У вас есть как минимум 2 способа реализовать данную задачу — через
систему плагинов или через расширение класса корзины.

В обоих случаях принцип работы примерно такой:
— при требуемых событиях (добавление товара, изменение количества, удаление товара и тд) для каждого конкретного товара или циклом во всей корзине получаем параметры товаров
— из полученных данных выбираем id и запрашиваем для каждого товара кастомное тв-поле со списком скидок
— если тв-поле присутствует, то в отсортированным по необходимому для скидки количеству массиве, через цикл сверяем значение с количеством товара в корзине. Так получаем соответствующую скидку по количеству для каждого товара.
— умножаем скидку на исходную цену товара
— возвращаем значение
Странно, только что проверил приложенный мной вызов на своем сайте — ресурсы возвращаются корректно:
[[!pdoPage?
	&parents=`0`
	&tpl=`@INLINE [[+pagetitle]]`
	&limit=`10`
	&ajaxMode=`1`
	&where=`{"createdby": [[!+modx.user.id]]}`
]]
Всего: [[+total]]
Вы ведь убрали все лишние строчки &element=`GetUserAction` и тому подобные?
А вы вообще авторизованы в системе? — плейсхолдер [[!+modx.user.id]] возвращает что-нибудь? И есть ли у авторизованного пользователя созданные ресурсы?

К слову, если вам нужно вернуть список ресурсов конкретного пользователя (не авторизованного), то вам нужно обращаться на страницу с гет-параметром (пример: site.ru/articles?author=1), перехватывать этот параметр и по аналогии заносить в where.
Если честно, не совсем понимаю, зачем так заморачиваться, если у сниппетов pdoTools есть параметр where?
[[!pdoPage?
	&parents=`0`
	&tpl=`user_tickets`
	&limit=`10`
	&ajaxMode=`1`
	&where=`{"createdby": [[!+modx.user.id]]}`
]]
Всего: [[+total]]

А вообще, если сниппет ничего не возвращает, то всегда можно воспользоваться параметром &showLog=`1` чтобы наглядно увидеть, на каком этапе появляется ошибка.
Если вы отправляете письмо своей функцией, укажите Content-type: text/plain.

По поводу переносов строк (
php.net): «В отличие от синтаксиса двойных кавычек и heredoc, переменные и управляющие последовательности для специальных символов, заключенных в одинарные кавычки, не обрабатываются.»
Если честно, не уверен..)

Вы можете написать простенький сниппет проверки, который заодно и решит проблему с постоянной обработкой AjaxForm вне зависимости от значения price:

[[! название_сниппета? &check=`[[*price]]` &acceptValue=`0` &tpl=`название_чанка_который_нужно_отобразить`]]

Код:
<?php
	if ($check == $acceptValue) {
		return $modx->getChunk($tpl);
	}
	else {
		return;
	}
Что вы подразумеваете под содержимым модификатора?

Сейчас у вас выполняется следующая логика:
— обрабатывается содержимое внутри then=``
— проверяется значение [[*price]] (если у вас minishop2, то такое значение в принципе не находит, т.к. там требуется иной плейсхолдер)
— значение [[*price]] не равно 0 (так как его в принципе нет).
— вам ничего не возвращает, так как нет условия :else=``

Вот пример того, когда вам всегда вернется какой-либо результат:

[[!+price:is=`0`:then=`Код формы`:else=`Цена на товар [[!+price]] рублей`]]
Minishop2 до версии 2.2 полностью разрабатывался Василием Наумкиным, после (версия 2.2 и 2.3) — студией SimpleDream.

В версиях 2.2 и 2.3 введен новый функционал характеристик товара (раньше реализовывалось ручным расширением таблиц) и торговые предложения.

По личному опыту, пожалуй, сейчас надежнее ставить версию 2.1.12-pl (находится в репозитории modx), так как она стабильна и поддерживает все выпущенные к ней дополнения.
Если вы используете minishop2 для формирования карточки товара, то вам необходим плейсхолдер не [[*price]], а [[!+price]]. В остальном все верно.

Единственный минус подобного решения — из-за специфики работы преобразования плейсхолдеров модкса, в вашем примере вначале выполняется содержимое внутри then (в любом случае, вне зависимости от значения price), а уже после — проверка условия. Что негативно сказывается на производительности, в случае, если количество товаров больше 0 и форма не нужна в принципе.
Что-нибудь в духе Uploadify для загрузки с фронта + javascript, срабатывающий на завершение загрузки, считающий количество фотографий и перехватывающий выбранный формат.

Дальше, исходя из полученных данных — простой калькулятор на js.

Чуть сложнее будет только если для каждой фотографии можно будет выбирать отдельный формат, но это опять же вполне реализуется в рамках яваскрипта.
К слову, у каждого товара есть параметр контекста, откуда он был добавлен => первым шагом будет разделение 2 раздела каталога по двум контекстам — так товары по умолчанию будут попадать в отдельные контексты (вызывать и отображать их не будет большой проблемой, т.к. у большинства сниппетов есть параметр, указывающий из каких контекстов брать данные). Ну и чуть-чуть придется подправить javascript корзины для динамичного обновления данных.