Мультикатегории MODX с улучшенной выборкой
По следам статьи Как сделать мультикатегории на MODX с TV-шкой хочу напомнить о существовании такого компонента, как customExtra. Это платный компонент, который позволяет использовать готовые таблицы в базе для хранения любых своих данных.
Во-первых, создадим ТВ, в котором будет храниться список категорий товара. Мне нравится использовать пакет SuperBoxSelect — он позволяет сделать выпадающий список ресурсов без использования @EVAL:
Теперь покажу, как customExtra может упростить выборку товаров, у которых указано несколько категорий. Решим как раз тот проблемный момент, когда нужно составить сложный нечитаемый длинный SQL-запрос со всякими LIKE и пр.
Мы просто создаём плагин на событие OnDocFormSave, который будет дублировать набор категорий в отдельной табличке в базе данных:
Теперь каждый раз, когда в админке менеджер будет заполнять товары и отмечать у них категории, данные будут дублироваться в табличке customExtraItem:
И теперь код выборки товаров будет выглядеть лаконично и читабельно:
Здесь мы, во-первых, «присоединили» к ресурсам данные из таблицы customExtraItem:
А во-вторых, указали условие выборки через ключевое слово OR — в таком случае будут выведены и прямые дочерние ресурсы, и те ресурсы, у который добавлена категория в ТВ-шке:
Вот демо с такой настройкой — http://s29869.h5.modhost.pro/products.html
Ну и такая выборка отработает гораздо быстрее, чем выборка с несколькими LIKE.
Во-первых, создадим ТВ, в котором будет храниться список категорий товара. Мне нравится использовать пакет 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.
Комментарии: 5
Демка поломалась
Я опять немного пофилософствую. Мне кажется, что у компонентов, которые представлены на modx.pro есть одна практически общая проблема. И проблема эта звучит так — по описанию компонента практически невозможно догадаться для чего он и какую задачу можно с его помощью решить.
Я прекрасно понимаю почему это происходит. Когда разработчик сделал что то новое и готов им поделиться, он «живет это разработкой», он работал над ней несколько дней (недель, месяцев) и ему кажется, что в ней и так все понятно. Вот ему же все понятно и логично, значит и другим будет понятно тоже. Но это не так.
Программист по сути тот же писатель, результатом нашей работы тоже является текст. И грамотность, продуманность, иерархичность должны присутствовать не только в коде, но и в наших мыслях, в наших текстах.
Может я один такой глупый, но прочитав 5 раз описание customExtra я так и не понял что он делает. И может это именно то, что я бы хотел, но из-за сжатых, странных формулировок в описании я пройду мимо и не куплю, просто потому что не пойму зачем этот компонент.
modstore.pro/packages/utilities/customextra
Под самым название компонента видим — Дополнительная табличка в админке MODX. Уже честно говоря сбивает с толку, потому что не понятное слово «табличка» еще и в уменьшительно ласкательном варианте. Это про таблицы в базе данных? Это про таблицы генерируемые extjs? Что за «табличка..»
Ниже по тексту читаем
И ниже идут скриншоты, простите но очень невнятные, на которых предлагается создать какой- то предмет. Что за предмет, не известно.
В итоге, дочитав описание до конца, я все еще остаюсь в состоянии полного непонимания, что же конкретно делает и какие задачи этот компонент решает.
А насколько было бы интуитивно понятнее, если бы автор пусть и в текстовом виде, привел пример какой то решаемой задачи.
По крайней мере для моего мозга справедливо все то, что я описал) Возможно другие люди прекрасно понимают такие вот краткие и сумбурные описания.
Я прекрасно понимаю почему это происходит. Когда разработчик сделал что то новое и готов им поделиться, он «живет это разработкой», он работал над ней несколько дней (недель, месяцев) и ему кажется, что в ней и так все понятно. Вот ему же все понятно и логично, значит и другим будет понятно тоже. Но это не так.
Программист по сути тот же писатель, результатом нашей работы тоже является текст. И грамотность, продуманность, иерархичность должны присутствовать не только в коде, но и в наших мыслях, в наших текстах.
Может я один такой глупый, но прочитав 5 раз описание customExtra я так и не понял что он делает. И может это именно то, что я бы хотел, но из-за сжатых, странных формулировок в описании я пройду мимо и не куплю, просто потому что не пойму зачем этот компонент.
modstore.pro/packages/utilities/customextra
Под самым название компонента видим — Дополнительная табличка в админке MODX. Уже честно говоря сбивает с толку, потому что не понятное слово «табличка» еще и в уменьшительно ласкательном варианте. Это про таблицы в базе данных? Это про таблицы генерируемые extjs? Что за «табличка..»
Ниже по тексту читаем
Компонент позволяет гибко кастомизировать табличку и формы создания / редактирования объектов из админки.Снова ступор. Ведь выше написано, что это для создания дополнительных (тоесть новых ) табличек, а это предложение говорит «кастомизировать» (то есть изменить существующую.)
И ниже идут скриншоты, простите но очень невнятные, на которых предлагается создать какой- то предмет. Что за предмет, не известно.
В итоге, дочитав описание до конца, я все еще остаюсь в состоянии полного непонимания, что же конкретно делает и какие задачи этот компонент решает.
А насколько было бы интуитивно понятнее, если бы автор пусть и в текстовом виде, привел пример какой то решаемой задачи.
По крайней мере для моего мозга справедливо все то, что я описал) Возможно другие люди прекрасно понимают такие вот краткие и сумбурные описания.
- Не у каждого компонента есть достоверное описание, не всегда понятно для чего он, что умеет, где можно применить и какую пользу получить
- Не о каждом компоненте есть более менее приличная заметка здесь. Не удивлюсь если о половине вообще ничего не написано, или написано очень кратко
- Какие-то компоненты заброшены, и есть смысл составить список тех, чье обновление требуется
- По каким то компонентам здесь на форуме много заданных, мало раскрытых вопросов. Можно составить контент-план по раскрытию вопросов. Необязательно самому писать. Для начала можно просто составить список тем, которые было бы неплохо раскрыть. Уверен ребята заметят активность и подключатся
Александр, а вот взялись бы за изучение существующих компонентов и дополнение информации о них.
Смотрите сами, сколько пользы можно принести сообществу
Смотрите сами, сколько пользы можно принести сообществу
Да, действительно. Спасибо, чуть подправил описание, надеюсь, теперь будет понятнее.
Подскажите пожалуйста а как вывести в чанке статьи категории к которым эта статья привязана?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.