MODX. MIGX Package Manager или работа MIGX с БД (базами данных)

Компонент MIGX достаточно многофункционален, и одна из его мало раскрытых способностей — работа с собственными таблицами данных. 

Как же это можно сделать с помощью MIGX? Рассмотрим все этапы от начала и до конца.

В меню Extras (Пакеты) находим ссылку на компонент MIGX, заходим в него и видим две вкладки, по умолчанию открыта вкладка MIGX, а рядом Package Manager, которая нам и понадобиться в первую очередь. 

  1. Во вкладке Package Manager вводим название пакета (Package Name) в моём примере elements (во избежании дальнейшей путанницы лучше использовать только строчные буквы), и нажимаем кнопку Create Package. После нажатия этой кнопки в директории core/components/elements (сюда подставляется введенное в Package Name название) создаются необходимые файлы.
  2. Теперь необходимо написать схему будущей таблицы, в этом может помочь официальная документация или курсы Василия Наумкина. Для примера создадим простую таблицу, которую надо вписать во вкладку 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, через него определяется, у какого из ресурсов отображать строки из этой таблицы для просмотра и редактирования в админ-панели сайта.

  3. После сохранения схемы переходим на вкладку Package и нажимаем Create Package. После этого создастся новый пакет. 

  4. После этого переходим на вкладку Create Table и нажимаем Create Tables. После чего в базе данных появится таблица с указанными в схеме столбцами. В случае необходимости, можно добавить новые или удалить лишние столбцы, с помощью редактирования этой схемы и кнопок Add fields и Remove fields.

Когда база данных создана, её необходимо заполнить. Это можно сделать с помощью CMP  или с помощью собственного сниппета. Сперва рассмотрим вариант создания CMP.

  1. В меню Extras (Пакеты), заходим в компонент MIGX, на первую вкладку, которая так и называется MIGX.
  2. Добавляем элемент, аналогично созданию обычного TV MIGX. На вкладке Settings заполняем
    • Name: elements
    • unique MIGX ID: elements
    Затем открываем вкладку MIGXdb-Settings и заполняем строчки
    • Package: elements
    • Classname: elementsItem
    Сохраняем.
  3. Далее надо выбрать выводить элементы через ресурс или через меню.
    • При выводе через ресурс — создаёте TV и привязываете к нему только что созданные настройки, указав в типе ввода migxdb, а в поле конфигурации название вашей конфигурации, в моём случае — elements.
    • При выводе через меню — заходите в настройки (шестеренка) — Menus (Меню) и создаёте меню:
      • Ключ словаря — elements 
      • Параметры — &configs=elements
      • Пространство имён — migx
  4. Продолжаем настраивать вывод таблицы, теперь надо указать поля, которые необходимо вывести в админ панели. Во вкладке contextmenus отмечаем update, duplicate, remove. 
  5. Указываем созданные поля во вкладках columns и formtabs используя кнопку «выбрать db-поля». Во вкладке columns заполняем header и field аналогично названиям столбцов в таблице. На вкладке Formtabs добавляем новый элемент в поле fields где также указываем все необходимые данные для полей. При создании колонок надо также создать поле id, для того чтобы иметь возможность редактировать данные. 
  6. В зависимости от выбора, по указанному адресу уже можно увидеть привязанную таблицу.

Выводить данные из собственных таблиц можно используя разные методы. Один из них — встроенный в 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 формате.