Созданная страница будет иметь табличную структуру в административной части и свою таблицу в базе данных. Управление содержимым таблицы будет осуществляться через сниппет, подключённый к пакету.
Создание собственного пакета для управления данными страницы
Будем считать, что MIGX был когда-то установлен. Поэтому смело переходим в Пакеты - MIGX.
-
Вкладка Package Manager. В поле Package Name пишем название будущего пакета (для примера я назвал его
packename). Затем нажимаем Create Package.
-
Подготавливаем XML-схему для создания таблицы в базе данных. Вставляем её во вкладку XML Schema и сохраняем через Save Scheme.

Можно взять эту схему ⬇️ и заменить поля своими:
<?xml version="1.0" encoding="UTF-8"?>
<model package="packename" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" phpdoc-package="" phpdoc-subpackage="" version="1.1">
<object class="packenameComponent" table="packename_component" extends="xPDOSimpleObject">
<field key="cardcode" dbtype="varchar" precision="50" phptype="string" null="false" default="" />
<field key="name" dbtype="varchar" precision="100" phptype="string" null="false" default="" />
<field key="phone" dbtype="varchar" precision="50" phptype="string" null="false" default="" />
<field key="email" dbtype="varchar" precision="50" phptype="string" null="false" default="" />
<field key="created" dbtype="datetime" phptype="datetime" null="false" default="CURRENT_TIMESTAMP" />
</object>
</model>
- Переходим на вкладку Create Tables и нажимаем кнопку Create Tables. Так мы создали в базе данных таблицу packename_component с полями: id (создаётся автоматически как автоинкремент), cardcode, name, phone, email, created.

Для всех действий поле Package Name должно быть заполнено названием созданного пакета.
Можно посмотреть в админке, создалась ли таблица.

Создание страницы CMP с таблицей в MIGX
-
Во вкладке MIGX нажимаем на Добавить элемент.

-
Во вкладке Settings заполняем названием пакета поля Name и Unique MIGX ID.

-
Создаём форму для ручного редактирования полей (можно пропустить, если ручное управление не нужно).
- Добавить элемент. В поле Caption пишем название всплывающего окна.
- Добавить элемент. Здесь нужно добавить все поля, которые можно редактировать, в моём случае - cardcode, name, phone, email. Во вкладке Field, в поле Fieldname, указываем название поля (оно совпадает с тем, что указано в
<field key="ТУТ"...), а в поле Caption - описание этого поля. - Выполнить.
- Заполняем остальные поля (Fields) аналогично.
- Выполнить.

- Заполняем вкладку Columns. Принцип тот же, что и в предыдущем пункте. Эта вкладка формирует таблицу на Custom Manager Page.
Обязательно нужно создать столбец ID.
- Добавить элемент.
- Вкладка Column.
- Header - название столбца.
- Field - название поля, как в предыдущем пункте.
- Выполнено.
- Повторяем для всех столбцов.

-
Во вкладке Context menus проставляем галочки напротив тех пунктов, которые будут выводиться в контекстном меню при нажатии правой кнопкой мыши.

-
Привязываем таблицу к созданному ранее пакету. Во вкладке MIGXdb-Settings нужно указать название пакета и класс (
<object class="packenameComponent"...).
-
Оформляем CMP и таблицу на ней, указав название и описание во вкладке CMP-settings.

-
Нажимаем общую для окна кнопку Выполнено.
-
Привязываем пакет к верхнему меню: иконка шестерёнки → Меню.

Вот и всё. Теперь, перейдя по добавленному пункту меню, откроется кастомная страница с таблицей.
Управление данными в CMP
Будем использовать ранее созданный пакет. В сниппете или в другом месте пишем примерный код, обязательно подключив пакет:
if (!$modx->addPackage('packename', MODX_CORE_PATH . 'components/packename/model/')) {
return 'false';
}
// Создаём запись
$table = $modx->newObject('packenameComponent');
$array = [
'cardcode' => '209099',
'name' => 'Вася Пупкин',
'phone' => '+7(000)111-22-33',
'email' => 'vasya@pupkin.ru'
];
$table->fromArray($array);
$table->save();
// Делаем выборку
$response = $modx->getIterator('packenameComponent');
foreach ($response as $res) {
print_r($res->toArray());
}