MODX. MIGX Package Manager или работа MIGX с БД (базами данных)
Отредактировано: 30 Сентября 2024
Компонент MIGX достаточно многофункционален, и одна из его мало раскрытых способностей — работа с собственными таблицами данных.
Как же это можно сделать с помощью MIGX? Рассмотрим все этапы от начала и до конца.
В меню Extras (Пакеты) находим ссылку на компонент MIGX, заходим в него и видим две вкладки, по умолчанию открыта вкладка MIGX, а рядом Package Manager, которая нам и понадобиться в первую очередь.
- Во вкладке Package Manager вводим название пакета (Package Name) в моём примере elements (во избежании дальнейшей путанницы лучше использовать только строчные буквы), и нажимаем кнопку Create Package. После нажатия этой кнопки в директории core/components/elements (сюда подставляется введенное в Package Name название) создаются необходимые файлы.
- Теперь необходимо написать схему будущей таблицы, в этом может помочь официальная документация или курсы Василия Наумкина. Для примера создадим простую таблицу, которую надо вписать во вкладку Xml Scheme:
<?xml version="1.0" encoding="UTF-8"?> <model package="elements" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" phpdoc-package="" phpdoc-subpackage="" version="1.1"> <object class="elementsItem" table="elements_items" extends="xPDOSimpleObject"> <field key="title" dbtype="varchar" phptype="string" precision="100" null="false" default="" /> <field key="description" dbtype="text" phptype="string" null="false" default="" /> <field key="resource_id" dbtype="int" precision="10" phptype="integer" null="false" index="index" /> </object> </model>
Каждая строка описывает добавляемый в базу данных столбец. Убедившись в правильности всех строк нажимаем кнопку Save Scheme (не забывайте сохранять изменения после редактирования схемы). Еще один важный нюанс — если данные из таблицы надо будет выводить в ресурсе, то поле resource_id обязательно, это поле устанавливает связь с нужными ресурсами из MODX, через него определяется, у какого из ресурсов отображать строки из этой таблицы для просмотра и редактирования в админ-панели сайта.
-
После сохранения схемы переходим на вкладку Package и нажимаем Create Package. После этого создастся новый пакет.
-
После этого переходим на вкладку Create Table и нажимаем Create Tables. После чего в базе данных появится таблица с указанными в схеме столбцами. В случае необходимости, можно добавить новые или удалить лишние столбцы, с помощью редактирования этой схемы и кнопок Add fields и Remove fields.
Когда база данных создана, её необходимо заполнить. Это можно сделать с помощью CMP или с помощью собственного сниппета. Сперва рассмотрим вариант создания CMP.
- В меню Extras (Пакеты), заходим в компонент MIGX, на первую вкладку, которая так и называется MIGX.
- Добавляем элемент, аналогично созданию обычного TV MIGX. На вкладке Settings заполняем
- Name: elements
- unique MIGX ID: elements
- Package: elements
- Classname: elementsItem
- Далее надо выбрать выводить элементы через ресурс или через меню.
- При выводе через ресурс — создаёте TV и привязываете к нему только что созданные настройки, указав в типе ввода migxdb, а в поле конфигурации название вашей конфигурации, в моём случае — elements.
- При выводе через меню — заходите в настройки (шестеренка) — Menus (Меню) и создаёте меню:
- Ключ словаря — elements
- Параметры — &configs=elements
- Пространство имён — migx
- Продолжаем настраивать вывод таблицы, теперь надо указать поля, которые необходимо вывести в админ панели. Во вкладке contextmenus отмечаем update, duplicate, remove.
- Указываем созданные поля во вкладках columns и formtabs используя кнопку «выбрать db-поля». Во вкладке columns заполняем header и field аналогично названиям столбцов в таблице. На вкладке Formtabs добавляем новый элемент в поле fields где также указываем все необходимые данные для полей. При создании колонок надо также создать поле id, для того чтобы иметь возможность редактировать данные.
- В зависимости от выбора, по указанному адресу уже можно увидеть привязанную таблицу.
Выводить данные из собственных таблиц можно используя разные методы. Один из них — встроенный в MIGX сниппет migxLoopCollection, но он не работает с тегами fenom.
[[!migxLoopCollection?
&classname=`elements`
&packageName=`elements`
&where=`['resource_id' => 3]`
&sortConfig=`["sortby" => "id","sortdir" => "DESC"]`
&tpl=`@CODE: [[+id]]`
]]
При необходимости использовать Fenom можно использовать pdoResources с параметрами loadModels и class:
{'pdoResources' | snippet : [
'loadModels' => 'elements',
'class' => 'elements',
'limit'=>0,
'tpl' => '@CODE: $title,',
]}
Можно написать собственный сниппет, не забыв добавить в список загрузки свой пакет:
<?php
//Добавляем пакет
if(!$modx->addPackage('elements', MODX_CORE_PATH . 'components/elements/model/')){
return 'false';
}
// Создаем запись
$table = $modx->newObject('elementsItem');
$array = [
'title' => 'Заголовок',
'description' => 'Описание'
];
$table->fromArray($array);
$table->save();
//Делаем выборку
$response = $modx->getIterator('elementsItem');
foreach($response as $res){
print_r($res->toArray());
}
Дополнительные настройки
Текстовый поиск по db таблице
Для того чтобы иметь возможность поиска нужной записи в созданной таблице, используйте вкладку Db-Filters. В поле Filters добавляете элемент:
-
filter Name — любое название поля (необходимо чтобы указать его в поле getlist-where), в примере — search;
-
Filter Type — выбираете тип поля из списка (для обычного поиска нужен textbox):
-
date — поле указания даты;
-
resetall — кнопка сброса указанных значений;
-
textbox — обычный текстовый инпут;
-
listbox-multiple — выбор из списка;
-
combobox — совмещенное поле с возможностью выбрать из списка либо написать текстом;
-
treecombo.
-
-
getlist-where — строка
{"title:LIKE":"%[[+search]]%"}
где title — название столбца по которому будет происходить поиск, а search — название из поля «filter Name». Сама запись — обычный SQL запрос в JSON формате.