Всего 123 803 комментария

Разработчик
22 декабря 2022, 01:38
0
Спасибо за ответ)

Тут не совсем стандартный проект, тут получается как каталог продуктов, что-то вроде рейтинга. Как такового каталога там нет.

Я решил проблему через where у pdoResources

Может косячно, но пока работает

1. Вот тут я собрал все контейнеры (папки) в которых лежат ресурсы. Так как все ресурсы выводятся на одной странице по папкам. Где первый элемент наверху, остальные скрыты в контейнере, то сделал так.

<div class="py-8 bg-light">
                <div class="container">
                    <div class="group-last-child">
                        [[!pdoResources?
                           &depth=`1`
                           &where=`{"isfolder":"1"}`
                           &tvPrefix=``
                           &tpl=`Tpl-lvl-1-catalog-All-Deposits`
                           &sortby=`{"menuindex":"ASC"}`
                           &includeTVs=`valuta, time-if-deposit`
                        ]]       
                    </div>
                </div>
            </div>

На этот этапе я фильтрую результат, сделав сниппет-обертку
Total — мне нужно для того, чтобы знать сколько элементов в папке и сравнивать с последним. Сравнивать с последним нужно для закрывающего тэга обертки. А открывается тег обертки на втором.

[[!mySnippetFilter?
   &parents=`[[+id]]`
   &depth=`5`
   &tplFirst=``
   &resources=``
   &tvPrefix=``
   &tpl=`Tpl-lvl-2-Bank-All-Deposits`
   &sortby=`{"menuindex":"ASC"}`
   &includeTVs=`valuta, time-if-deposit, from-sum-deposit, bet-for-deposit`
   &setTotal=`1`
   &toPlaceholder=`myOut`
]]  
[[+myOut]]

Данный снипет является оберткой над pdoResources, нужен для фильтрации результата

Сниппет представляет собой

$where = Array();

if(count($_POST['tv'])) {
    $where = array_merge($where, $_POST['tv'] );
    if (count($where['from-sum-deposit:<='])) {
        unset($where['from-sum-deposit:<=']);
    };  
    if (!empty($where['srok']) and $where['srok'] == 'all' ) {
        unset($where['srok']);
    }
}

$scriptProperties['where'] = json_encode($where);
$html = $modx->runSnippet('pdoResources', $scriptProperties);
echo $html;

А вывожу я все это при помощи Fenom на странице

{set $total = $_modx->getPlaceholder('total')} Присваиваю последний элемент переменной
{if $idx == 1} // Если это первый элемент, для него определенный вывод
Тут код чанка для первого элемента
{else}
{$idx == 2? 'код открытия оболочки для второго и последующих элементов, эта оболочка появляется и скрывается по кнопке' : ' '}
код для элементов внутренних, начиная от второго и дальше
{$idx == $total? 'проверка на последний элемент, получается если total равен idx тогда он последний и я закрываю два дива':''}
{/if}
Конечно тут накручено, но кое как с помощью получилось мне получить последний элемент в выдаче pdoResources))) Пока работает, в целом как мне нужно
Разработчик
22 декабря 2022, 01:28
0
Не совсем, точнее это было нужно немного для другого ))

У меня на странице выводятся все продукты компании. Но эти продукты группируются по папкам. Получается на одной странице есть результаты из каждой папки, при том у второго и последнего блока должны быть div обертки. Проблему решил следующим образом

<div class="py-8 bg-light">
                <div class="container">
                    <div class="group-last-child">
                        [[!pdoResources?
                           &depth=`1`
                           &where=`{"isfolder":"1"}`
                           &tvPrefix=``
                           &tpl=`Tpl-lvl-1-catalog-All-Deposits`
                           &sortby=`{"menuindex":"ASC"}`
                           &includeTVs=`valuta, time-if-deposit`
                        ]]       
                    </div>
                </div>
            </div>

Это сниппет — Tpl-lvl-1-catalog-All-Deposits

[[!mySnippetFilter?
   &parents=`[[+id]]`
   &depth=`5`
   &tplFirst=``
   &resources=``
   &tvPrefix=``
   &tpl=`Tpl-lvl-2-Bank-All-Deposits`
   &sortby=`{"menuindex":"ASC"}`
   &includeTVs=`valuta, time-if-deposit, from-sum-deposit, bet-for-deposit`
   &setTotal=`1`
   &toPlaceholder=`myOut`
]]  
[[+myOut]]

Данный снипет является оберткой над pdoResources, нужен для фильтрации результата

Сниппет представляет собой

$where = Array();

if(count($_POST['tv'])) {
    $where = array_merge($where, $_POST['tv'] );
    if (count($where['from-sum-deposit:<='])) {
        unset($where['from-sum-deposit:<=']);
    };  
    if (!empty($where['srok']) and $where['srok'] == 'all' ) {
        unset($where['srok']);
    }
}

$scriptProperties['where'] = json_encode($where);
$html = $modx->runSnippet('pdoResources', $scriptProperties);
echo $html;

А вывожу я все это при помощи Fenom на странице

{set $total = $_modx->getPlaceholder('total')}
{if $idx == 1}
Тут код чанка для первого элемента
{else}
{$idx == 2? 'код открытия оболочки для второго и поледующих элементов, эта оболочка появляется и скрывается по кнопке' : ' '}
код для элементов внутренних, начиная от второго и дальше
{$idx == $total? 'проверка на последний элемент, получается если total равен idx тогда он последний и я закрываю два дива':''}
{/if}

Конечно тут накручено, но кое как с помощью получилось мне получить последний элемент в выдаче pdoResources))) Может и косячно, но пока работает)
Алексей Шумаев
21 декабря 2022, 20:48
+3
Инструкция полезная по-любому, хотя бы для расширения кругозора.

Сдаётся мне, что весь сыр-бор с передачей функционала mSearch2 «на сторону» разгорелся вокруг нехватки ресурсов хоста, на котором крутится магазин + не оптимальной настройке сайта. Хотя, я достаточно давно от Modx отошёл, может быть, не совсем верно понял проблему.

У меня на поддержке осталось несколько магазинов, например:
1) 96000 товаров и 12 фильтров
2) 9000 и 55 фильтров (индексы в мускуле для msProductData уже закончились) :-)
modhost на максимальном тарифе, проблем нет, всё и всегда нормально работает, каких-то заметных задержек в фильтрах нет. Все свойства реализованы расширением msProductData.

Я не очень понимаю, чего может не хватать в msSearch2 разработчику, который работает с modx.
Если делаем «серьёзный» магазин и не устраивает msSearch2, то, очевидно, что и modx тут как-то совсем не в тему. Берём туже ларку с эластик. Ну и немного команду разрабов добавляем к себе на зарплату.
Всё имеет свою цену.

К вопросу же «серьёзности»: второй магазин — лидер рынка в «СНГ» в весьма живом сегменте с огромным оборотом. MODX+mSearch2 обеспечивает сайту нормальную работу уже лет 10.
И там за это время столько всего понаделано, аж страшно иногда. Там уже CRM по сути вместо сайта.
И ничего, всё ок.

С другой стороны, сейчас наблюдаю поневоле много сайтов на WP/Bitrix и т.п.
Во где ужас-то в большинстве случаев ) На большинстве таких сайтов я бы никогда ничего не заказал.

Так что на MODX и mSearch2 вполне можно и даже нужно клепать сайты. Только настраивать более-менее и хостинг не совсем бюджетный брать.

Ставить крест на MODX/mSearch2 я бы вообще не стал.
Сейчас, кмк, MODX не хватает продвижения в ru + выпуск 3 версии в момент фактического схлопывания сообщества сильно подгадил.
Алексей Смирнов
21 декабря 2022, 18:45
0
Вы пишите свой сниппет, верно?
И наверняка при выводе одной папки вы знаете кол-во в этой самой папке...?
Просто посчитайте количество и проверьте по условию.
Алексей Смирнов
21 декабря 2022, 18:33
0
По факту вы усложняете тем что хотите ключ один а названия разные — это чревато.
Если у вас свойств примерно 20..30, то лучше создавать опции специально под необходимые параметры. Так и выборки будут быстрее идти и не запутаетесь в опциях одинаковых. И потом поддерживать вам же будет проще.
Если хотите прям принципиально, то лучше уже использовать TV параметры. Там можно с помощью форм переназывать ТВ-шки.
Александр Туниеков
21 декабря 2022, 17:54
+3
Чудесные тут методы пишут :-). Проблема не в том чтобы отфильтровать по какому-то определенному значению. С этим и mysql легко справляется. Вопрос как получить список значений по каким можно фильтровать? И как получить кол-во ресурсов для этих значений? И как получить кол-во ресурсов для этих значений если какое-то значение уже выбрано
Николай Савин
21 декабря 2022, 13:30
0
Откуда взялся MIGX?
Есть же встроенный механизм присвоения категорий опциям.
Используйте его.
Как обойти проблему с вариативностью названий я вам написал.
Артур Шевченко
21 декабря 2022, 13:12
0
Можно его доработать и выбирать тип фильтра по типу опции.
Павел Бигель
21 декабря 2022, 10:12
0
Приходилось ли работать с postgress без прослойки ORM, а напрямую на SQL?
Ну разве что не в PHP проектах.
Синтаксис стопроцентно совпадает с mysql?
Конечно нет :). Если нужен совместимый с MySQL — вам к MariaDB.

Поделитесь пожалуйста, какие преимущества Postgres лично вы можете выделить
В основном они завязаны на вопросе масштабируемости.
В MySQL очень много вещей попросту платные либо нерешаемые относительно постгреса.
Дмитрий
21 декабря 2022, 09:59
0
В категории создано доп поле MIGX prnt.sc/C0ylMEOl15aj там задаю список опций для данной категории, как будет опция назваться и будет ли выводится в фильтре

на frontend я поменял название опций в фильтре, если они выводятся
[[getImageList? &tvname=`filtr_mini` &tpl=`@CODE: [[+option2]]` &where=`{ "option1:=":"{$filter}" }` ]]
Вопрос в том как в админке поменять, чтоб контент менеджер понимал, что заполнять, ведь там выводятся все опции
Дмитрий
21 декабря 2022, 09:50
0
спасибо за ответ. Вариант с SelectFilters оставляю на крайний случай. жаль что не позволяет выбрать фильтра (select, slider)
seosavspb
21 декабря 2022, 09:50
0
Спасибо большое за то что откликнулись. Сейчас попробую накопать что-нибудь по вашим подсказкам. Хорошего дня))
Александр Мельник
21 декабря 2022, 09:03
0
А еще лучше начинать все новые проекты сразу на Postgres. Ваши проекты скажут мне спасибо за совет :)
Поделитесь пожалуйста, какие преимущества Postgres лично вы можете выделить. Не абстрактные, а те с которыми реально столкнулись. Приходилось ли работать с postgress без прослойки ORM, а напрямую на SQL? Синтаксис стопроцентно совпадает с mysql?
maxgmm
21 декабря 2022, 06:09
0
нЕ РАБОТАЕТ в тикет коментариях РЕЙТИНГ И ИЗБРАНОЕ можете подсказать почему svoy.life/profile/
maxgmm
21 декабря 2022, 01:36
0
Все понял прав небыло!
maxgmm
21 декабря 2022, 01:18
0
Подскажите а как можно отсортировать по рейтингу SimpleRating
Павел Бигель
21 декабря 2022, 01:03
0
ПОчему нельзя тоже самое написать на чистом PHP + API Modx?
Почему же, можно.
Получишь, что-то вроде mSearch на выходе.
Артур Шевченко
21 декабря 2022, 00:38
+1
Fenom тебе ничем не поможет, это шаблонизатор. Задача описана весьма размыто, но осмелюсь предположить, что вес надо менять как количество. Соответственно надо добавить блок аналогичный тому, который есть в стандартном чанке для количества, заменить там count на weight. В админке создать плагин на событие msOnChangeInCart в котором и делать необходимые изменения. Ну и JS дописать на Cart.change.response.success чтобы ответ вставлять.
Вот про чекбокс не понятно. Если он должен быть в корзине, то общую стоимость поменять не выйдет, точнее выйдет, но при любом изменении заказа она будет пересчитана. Менять лучше всего стоимость заказа или отдельного товара или всех товаров.
Артур Шевченко
21 декабря 2022, 00:31
0
Очень интересно было прочитать про возможности Laravel. Только я так и не понял зачем он (Laravel) тут? ПОчему нельзя тоже самое написать на чистом PHP + API Modx? Это гораздо сложнее? Работать будет медленнее? Чем данный пример принципиально отличается от обычной подстановки значения в SQL запрос?

В общем я ничего не понял, но очень интересно)))