[MIGxDB] Создание интерфейса управления кастомной таблицей в админке

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



Создание компонента.
Не буду повторяться, вот тут @Денис Усманов подробно описал как можно это сделать. До пункта 3 нужно делать всё как там.

Вывод таблицы на отдельной странице в админке
1. Добавление пункта меню.
Чтобы получить доступ к нашей таблице, нужно создать ссылку на какую-то страницу. Слава Бруно, саму страницу создавать не нужно, MIGx нарисует её сам.
а. Жмём на шестерёнку справа вверху и выбираем пункт «Меню»
б. Откроется дерево меню, а над ним будет кнопка «Добавить меню». Жмём.
в. В открышемся окне заполняем следующие поля
  • Родитель — у меня miniShop2, вы можете выбрать любого другого
  • Ключ словаря — это название пункта меню, тут можно указать ключ словаря и тогда надо будет добавить этот ключ в словарь для пространства имён migx, или просто написать название пункта меню, если мультиязычность не нужна
  • Пространство имён — migx, тут без вариантов
  • Параметры — тут пишем &configs=название_конфигурации её мы создали вместе с компонентом, в моём случае она называется sleepandglow_reviews
Из обязательных полей больше ничего заполнять не нужно. После сохранения и перезагрузки страницы в верхнем меню появится новый пункт «Отзывы». При переходе будет выводится ваша таблица.

Донастройка конфигурации
1. Добавим массовые действия. Для этого откроем интерфейс управления MIGx, найдём нашу конфигурацию, откроем её для редактирования. Перейдём на вкладку «Actionbuttons» и поставим галочку напротив пункта «bulk». После этого нам станут доступны такие массовые действия как опубликовать, снять с публикации и удалить выбранные. Если хотите, чтобы работало из коробки, важно чтобы в вашей таблице были поля published, publishedon, publishedby, deleted, deletedon, deletedby, deletedby, unpublishedon, unpublishedby. Но как по мне столько полей для таких простых действие это прям много. Поэтому мы создадим свой процессор для обработки массовых действий. Для этого в папке созданного нами компонента создадим папку processors/mgr/reviews/ создаём файл bulkupdate.php примерно с таким кодом
<?php

/**
 * @var \modX $modx
 * @var array $scriptProperties
 * @var array $data
 */
$basePath = $modx->getOption('base_path');
require_once $basePath . 'core/components/sleepandglow/services/vendor/autoload.php';

$Review = new \CustomServices\Manage\Review($modx, $scriptProperties);
$task = $modx->getOption('task', $scriptProperties, '');
$objectIds = explode(',', $scriptProperties['objects']);

foreach ($objectIds as $id) {
    $object = $modx->getObject($Review->className, $id);
    if ($object == null) {
        continue;
    }
    switch ($task) {
        case 'publish':
            $result = $Review->update(['id' => $id, 'published' => 1]);
            break;
        case 'delete':
            $Review->update(['id' => $id, 'published' => 0]);
            $Review->delete($id);
            break;
        case 'unpublish':
            $result = $Review->update(['id' => $id, 'published' => 0]);
            break;
        default:
            break;
    }

    if ($object->save() === false) {
        return $modx->error->failure($modx->lexicon('quip.comment_err_save'));
    }
}

//clear cache for all contexts
$collection = $modx->getCollection('modContext');
foreach ($collection as $context) {
    $contexts[] = $context->get('key');
}
$modx->cacheManager->refresh(array(
    'db' => array(),
    'auto_publish' => array('contexts' => $contexts),
    'context_settings' => array('contexts' => $contexts),
    'resource' => array('contexts' => $contexts),
));

return $modx->error->success();

Обратите внимание на то, что тут можно подключить свой класс, т.е. выполнить любые нужные вам действия А так же на то, что migx предоставляет доступ к выбранному действию через $scriptProperties['task'] и к списку id выбранных объектов через $scriptProperties['objects'].

Чтобы ваш процессор заработал надо указать путь к нему в настройках конфигурации. Для этого идём на вкладку MIGX db-Settings и в поле Processors Path пишем путь к папке с процессорами относительно core/components/название_вашего_компонента/processors/mgr/ в начале и в конце слэшей не ставьте. В нашем случае нужно просто написать reviews
Аналогично можно сделать процессоры для одиночных действий. Примеры процессоров, они же процессоры по умолчанию лежат тут core/components/migx/processors/mgr/default/

2. Добавим пункты контекстного меню.
Для этого перейдём на вкладку Contextmenues в интерфейсе редактирования конфигурации и отмечаем необходимое.

3. Добавим кнопки действий в каждую строчку таблицы.
Для этого перейдём на вкладку Columnbuttons в интерфейсе редактирования конфигурации и отмечаем необходимое. После переходим на вкладку Columns и добавляем поле Действия->actions. На вкладке Renderer в поле Renderer выбираем значение this.renderRowActions. Я дублирую сюда функционал контекстного меню, потому что как показывает практика не все контент-менеджеры знают что такое контекстное меню и как его вызвать.

4. Добавим фильтры.
Для этого перейдём на вкладку Db-filters в интерфейсе редактирования конфигурации и добавляем
а. Фильтр по товару, так как отзывы к товарам. В окне редактирования фильтра пишем
  • filter Name — имя переменной в которой будет передаваться введённое значение, например search
  • Label — не знаю где он выводится, но я заполнил
  • Empty text — отображаемый текст, когда значение не выбрано, например Все товары
  • Filter type — combobox, другими словами select, для этого типа фильтров обязательно создавать процессор для вывода списка значений
  • getlist-where — условия поиска в json, например {«resource_alias»:"[[+search]]"}, где search это значение из поля filter Name
  • getcombo processor — имя файла процессора для вывода списка значений без расширения
Процессор для вывода результатов выглядит примерно так
<?php

/**
 * @var \modX $modx
 * @var array $scriptProperties
 * @var array $data
 * @var int $count
 */
$config = $modx->migx->customconfigs;

$rows = [
    ['combo_id' => '1', 'combo_name' => '1'],
    ['combo_id' => '2', 'combo_name' => '2'],
    ['combo_id' => '3', 'combo_name' => '3'],
    ['combo_id' => '4', 'combo_name' => '4'],
    ['combo_id' => '5', 'combo_name' => '5'],
];

$emtpytext = $config['gridfilters'][$scriptProperties['searchname']]['emptytext'];
$emtpytext = empty($emtpytext) ? 'Все' : $emtpytext;

$rows = array_merge([['combo_id' => '', 'combo_name' => $emtpytext]], $rows);
return $this->outputArray($rows, $count);
$rows можно получать динамически, любым удобных способом, например запросом в БД, главное, чтобы он содержал массивы с ключами combo_id и combo_name, где combo_id — это значение которое будет передано в переменную фильтра, а combo_name — текст который увидит пользователь в списке значений.
б. Фильтр по имени пользователя. В окне редактирования фильтра пишем
  • filter Name — search_by_name
  • Label — Поиск по имени пользователя
  • Empty text — Введите имя
  • Filter type — textbox
  • getlist-where — {«customer_name:LIKE»:"%[[+search_by_name]]%"}
И всё, фильтр будет работать, процессор не нужен.

5. Подпись вкладки
Финальным штрихом сделаем так, чтобы при переходе на страницу с отзывами вкладка была подписана не undefined, а более благозвучно. Для этого перейдём на вкладку CMP-Settings в интерфейсе редактирования конфигурации и заполняем поля Main caption, Tab Caption, Tab Description (если подпись не нужна поставьте пару пробелов).

Спасибо за внимание!
Артур Шевченко
2 часа назад
modx.pro
1
37
+4
Поблагодарить автора Отправить деньги

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

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