Skip to content
  1. Компоненты
  2. customExtra

customExtra

Компонент позволяет вывести в админке MODX табличку, набор полей которой можно настраивать. Предназначен для упрощения жизни разработчиков.

После установки компонента, в админке появляется соответствующий раздел. В этом разделе можно увидеть обычную табличку со списком кастомных объектов.

Основные возможности

Все параметры компонента доступны в Настройках системы.

Первая настройка - Отображать табы. В этой настройке можно указать, какие табы вам необходимы. Всего в компоненте доступно 5 табов, различающихся только называниями: Предметы, Заказы, Операции, Медиа и Ссылки.

Чтобы отобразить все доступные табы, необходимо указать следующий список: item,order,operation,media,link.

Табы будут выведены в админке в том порядке, в котором они следуют в списке. Поэтому вы можете менять расположение табов, просто поменяв порядок в этой настройке.

Каждый таб - это отдельная табличка со своими настройками. У каждого объекта (предмета, заказа и т.д.) есть ID, название, описание и флаг активности (active).

Кроме этих полей в настройках системы можно указать, сколько и каких полей вам нужно добавить - для каждого таба в отдельности. Например, мы можем добавить Заказам два числовых поля и одну текстовую область, а для Ссылок вывести только одно текстовое поле.

Любой объект можно создать с помощью сниппета или плагина - где вам это необходимо:

php
<?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

modx
[[pdoResources?
  &class=`customExtraMedia`
  &loadModels=`customextra`
  &sortby=`id`
  &tpl=`tpl.media`
]]

Дополнительный функционал

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

Список чекбоксов: active,published,paid,new,hit,favorite

Два из них по умолчанию отмечены галочкой - Активный (active) и Опубликованный (published).

При выводе на фронтенд объекты можно фильтровать по этим чекбоксам (впрочем, как и по любым другим полям):

modx
[[pdoResources?
  &class=`customExtraItem`
  &loadModels=`customextra`
  &sortby=`id`
  &where=`{"active":1}`
  &tpl=`tpl.items`
]]

Массовые операции - продвинутое использование

Для каждого типа объектов можно указать сниппет для дополнительной кнопки. Эта кнопка появится, если будет найден сниппет, название которого указано в настройках.

При нажатии на кнопку сниппет будет запущен. Если вам необходимо обработать в этом сниппете множество объектов, необходимо разделять обработку на порции. Для этого сниппет должен "сообщить" компоненту о том, что обработка не завершена. Если сниппет вернет false, компонент запустит его еще раз - и так до тех пор, пока не будет получен ответ true.

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

php
<?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;
}

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