customExtra
Компонент позволяет вывести в админке MODX табличку, набор полей которой можно настраивать. Предназначен для упрощения жизни разработчиков.
После установки компонента, в админке появляется соответствующий раздел. В этом разделе можно увидеть обычную табличку со списком кастомных объектов.
Основные возможности
Все параметры компонента доступны в Настройках системы.
Первая настройка - Отображать табы. В этой настройке можно указать, какие табы вам необходимы. Всего в компоненте доступно 5 табов, различающихся только называниями: Предметы, Заказы, Операции, Медиа и Ссылки.
Чтобы отобразить все доступные табы, необходимо указать следующий список: item,order,operation,media,link
.
Табы будут выведены в админке в том порядке, в котором они следуют в списке. Поэтому вы можете менять расположение табов, просто поменяв порядок в этой настройке.
Каждый таб - это отдельная табличка со своими настройками. У каждого объекта (предмета, заказа и т.д.) есть ID, название, описание и флаг активности (active).
Кроме этих полей в настройках системы можно указать, сколько и каких полей вам нужно добавить - для каждого таба в отдельности. Например, мы можем добавить Заказам два числовых поля и одну текстовую область, а для Ссылок вывести только одно текстовое поле.
Любой объект можно создать с помощью сниппета или плагина - где вам это необходимо:
<?php
$modx->addPackage(
"customextra",
$modx->getOption("core_path") . "components/customextra/model/"
);
$request = $modx->newObject("customExtraOperation");
$request->set("name", $_POST["name"]);
$request->set("string1", $_POST["contact"]);
$request->set("description", $_POST["text"]);
$request->save();
return true;
и созданный объект сразу же появится в табличке. Таким же образом объекты можно и редактировать.
Выводятся объекты с помощью pdoTools
[[pdoResources?
&class=`customExtraMedia`
&loadModels=`customextra`
&sortby=`id`
&tpl=`tpl.media`
]]
Дополнительный функционал
Помимо числовых полей, текстовых строк и областей у объектов доступны для использования до шести чекбоксов. В соответствующей настройке вы можете указать, какие чекбоксы для каких объектов будут доступны.
Список чекбоксов: active,published,paid,new,hit,favorite
Два из них по умолчанию отмечены галочкой - Активный (active) и Опубликованный (published).
При выводе на фронтенд объекты можно фильтровать по этим чекбоксам (впрочем, как и по любым другим полям):
[[pdoResources?
&class=`customExtraItem`
&loadModels=`customextra`
&sortby=`id`
&where=`{"active":1}`
&tpl=`tpl.items`
]]
Массовые операции - продвинутое использование
Для каждого типа объектов можно указать сниппет для дополнительной кнопки. Эта кнопка появится, если будет найден сниппет, название которого указано в настройках.
При нажатии на кнопку сниппет будет запущен. Если вам необходимо обработать в этом сниппете множество объектов, необходимо разделять обработку на порции. Для этого сниппет должен "сообщить" компоненту о том, что обработка не завершена. Если сниппет вернет false, компонент запустит его еще раз - и так до тех пор, пока не будет получен ответ true.
Например, мы хотим убрать у всех заказов галочку "Новый". Наш сниппет будет выглядеть так:
<?php
$modx->addPackage(
"customextra",
$modx->getOption("core_path") . "components/customextra/model/"
);
// Укажем, по сколько объектов обрабатывать за раз
$step = 5;
// Формируем запрос
$q = $modx->newQuery("customExtraOrder", ["new" => 1]);
// Посчитаем, сколько всего объектов с отмеченной галочкой в базе
$count = $modx->getCount("customExtraOrder", $q);
// Если «Новых» объектов не найдено, останавливаем выполнение
if ($count == 0) {
return true;
}
// Установим лимит
$q->limit($step);
// И получим порцию объектов для обработки
$orders = $modx->getCollection("customExtraOrder", $q);
// Теперь можно обработать полученные объекты
foreach ($orders as $order) {
$order->set("new", 0);
$order->save();
}
// Если всего в базе объектов меньше, чем мы обрабатываем за один шаг
if ($count <= $step) {
// то мы останавливаем обработку
return true;
} else {
// если нет - указываем, что обработка не закончена
return false;
}
Теперь компонент послушно выполнит сниппет столько раз, сколько надо - и выполнение не оборвётся по таймауту.