Мультикатегории MODX с улучшенной выборкой

По следам статьи Как сделать мультикатегории на MODX с TV-шкой хочу напомнить о существовании такого компонента, как customExtra. Это платный компонент, который позволяет использовать готовые таблицы в базе для хранения любых своих данных.



Во-первых, создадим ТВ, в котором будет храниться список категорий товара. Мне нравится использовать пакет SuperBoxSelect — он позволяет сделать выпадающий список ресурсов без использования @EVAL:



Теперь покажу, как customExtra может упростить выборку товаров, у которых указано несколько категорий. Решим как раз тот проблемный момент, когда нужно составить сложный нечитаемый длинный SQL-запрос со всякими LIKE и пр.

Мы просто создаём плагин на событие OnDocFormSave, который будет дублировать набор категорий в отдельной табличке в базе данных:

<?php
/* Подключаем customExtra */
$modx->addPackage('customextra', $modx->getOption('core_path').'components/customextra/model/');

/* Вытаскиваем список категорий */
$categories = explode('||', $resource->getTVValue('categories'));

/* Удаляем записи, если категорию у товара убрали */
$existing = $modx->getCollection('customExtraItem', ['id1' => $resource->id]);
foreach ($existing as $item) {
    if (!in_array($item->id2, $categories)) {
        $item->remove();
    }
}

/* Для каждой выбранной категории создаём запись, если её ещё нет */
if (!empty($categories)) {
    foreach ($categories as $category_id) {
        $data = [
            'id1' => $resource->id,
            'id2' => $category_id
        ];

        if (!$item = $modx->getObject('customExtraItem', $data)) {
            $item = $modx->newObject('customExtraItem');
            $item->fromArray($data);
        }
        $item->set('name', $resource->pagetitle);
        $item->save();
    }
}

Теперь каждый раз, когда в админке менеджер будет заполнять товары и отмечать у них категории, данные будут дублироваться в табличке customExtraItem:



И теперь код выборки товаров будет выглядеть лаконично и читабельно:

[[pdoResources?
    &parents=`[[*id]],9`
    &tpl=`tpl.product`
    
    &loadModels=`customextra`
    &groupby=`modResource.id`

    &leftJoin=`{
        "customExtraItem": { "on": "customExtraItem.id1 = modResource.id" }
    }`
    &where=`[
        { "parent":[[*id]] },
        { "OR:customExtraItem.id2:=":[[*id]] }
    ]`
]]

Здесь мы, во-первых, «присоединили» к ресурсам данные из таблицы customExtraItem:

&leftJoin=`{
    "customExtraItem": { "on": "customExtraItem.id1 = modResource.id" }
}`

А во-вторых, указали условие выборки через ключевое слово OR — в таком случае будут выведены и прямые дочерние ресурсы, и те ресурсы, у который добавлена категория в ТВ-шке:

&where=`[
    { "parent":[[*id]] },
    { "OR:customExtraItem.id2:=":[[*id]] }
]`

Вот демо с такой настройкой — http://s29869.h5.modhost.pro/products.html

Ну и такая выборка отработает гораздо быстрее, чем выборка с несколькими LIKE.
Илья Уткин
13 июня 2022, 17:50
modx.pro
1
562
+12
Поблагодарить автора Отправить деньги

Комментарии: 4

Сергей
15 июня 2022, 21:05
0
Демка поломалась
    Александр Мельник
    17 июня 2022, 08:05
    +2
    Я опять немного пофилософствую. Мне кажется, что у компонентов, которые представлены на modx.pro есть одна практически общая проблема. И проблема эта звучит так — по описанию компонента практически невозможно догадаться для чего он и какую задачу можно с его помощью решить.

    Я прекрасно понимаю почему это происходит. Когда разработчик сделал что то новое и готов им поделиться, он «живет это разработкой», он работал над ней несколько дней (недель, месяцев) и ему кажется, что в ней и так все понятно. Вот ему же все понятно и логично, значит и другим будет понятно тоже. Но это не так.

    Программист по сути тот же писатель, результатом нашей работы тоже является текст. И грамотность, продуманность, иерархичность должны присутствовать не только в коде, но и в наших мыслях, в наших текстах.

    Может я один такой глупый, но прочитав 5 раз описание customExtra я так и не понял что он делает. И может это именно то, что я бы хотел, но из-за сжатых, странных формулировок в описании я пройду мимо и не куплю, просто потому что не пойму зачем этот компонент.

    modstore.pro/packages/utilities/customextra
    Под самым название компонента видим — Дополнительная табличка в админке MODX. Уже честно говоря сбивает с толку, потому что не понятное слово «табличка» еще и в уменьшительно ласкательном варианте. Это про таблицы в базе данных? Это про таблицы генерируемые extjs? Что за «табличка..»
    Ниже по тексту читаем
    Компонент позволяет гибко кастомизировать табличку и формы создания / редактирования объектов из админки.
    Снова ступор. Ведь выше написано, что это для создания дополнительных (тоесть новых ) табличек, а это предложение говорит «кастомизировать» (то есть изменить существующую.)
    И ниже идут скриншоты, простите но очень невнятные, на которых предлагается создать какой- то предмет. Что за предмет, не известно.

    В итоге, дочитав описание до конца, я все еще остаюсь в состоянии полного непонимания, что же конкретно делает и какие задачи этот компонент решает.

    А насколько было бы интуитивно понятнее, если бы автор пусть и в текстовом виде, привел пример какой то решаемой задачи.

    По крайней мере для моего мозга справедливо все то, что я описал) Возможно другие люди прекрасно понимают такие вот краткие и сумбурные описания.
      Николай Савин
      17 июня 2022, 09:54
      +1
      Александр, а вот взялись бы за изучение существующих компонентов и дополнение информации о них.
      Смотрите сами, сколько пользы можно принести сообществу
      • Не у каждого компонента есть достоверное описание, не всегда понятно для чего он, что умеет, где можно применить и какую пользу получить
      • Не о каждом компоненте есть более менее приличная заметка здесь. Не удивлюсь если о половине вообще ничего не написано, или написано очень кратко
      • Какие-то компоненты заброшены, и есть смысл составить список тех, чье обновление требуется
      • По каким то компонентам здесь на форуме много заданных, мало раскрытых вопросов. Можно составить контент-план по раскрытию вопросов. Необязательно самому писать. Для начала можно просто составить список тем, которые было бы неплохо раскрыть. Уверен ребята заметят активность и подключатся
        Илья Уткин
        17 июня 2022, 13:57
        0
        Да, действительно. Спасибо, чуть подправил описание, надеюсь, теперь будет понятнее.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        4