MigxDB - Делаем безграничное хранилище "объектов" в ресурсах.

Всем привет! Наконец добрался до написания статьи по MigxDB!
Итак, предыстория: Была дана задача, реализовать управление квартирами в продаваемых строящихся домах. В каждом доме по 198 квартир, конечно же, обычный конфигуратор MIGX тут не подойдёт с его ограничением в 100 строк и отсутствием пагинации, поэтому, лучший вариант это — MigxDB.




И так! Давайте приступим к реализации!

1. Заходим Пакеты -> MIGX -> Вкладка «Package Manager»
1.1 Пишем в поле Package Name название нашего будущего «компонента», у меня это будет «FlatsTEST», и нажимаем ниже в первой вкладке Package кнопку Create Package
После этих действий, должна появиться папка с названием Вашего «компонента» по пути: core/components/*папка*



1.2. Теперь, переходим в последнюю вкладку Xml Schema и пишем разметку будущих полей в БД и название будущей таблицы… Для написания этой разметки, необходимо понимать какие поля мы собираемся использовать и под что. Ниже пример моей разметки, который можете взять за основу и «подбить» под свою задачу.

<?xml version="1.0" encoding="UTF-8"?>
<model package="FlatsTEST" baseClass="xPDOObject" platform="mysql" defaultEngine="InnoDB" version="1.1">
    <object class="FlatsTEST" table="flats_test" extends="xPDOSimpleObject">
        <field key="resource_id" dbtype="int" precision="10" phptype="integer" null="false" index="index" />
        <field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
        <field key="image" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
        <field key="fnumber" dbtype="int" precision="12" phptype="integer" null="false" default="0" />
        <field key="lsquare" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
        <field key="nbsquare" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
        <field key="square" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
        <field key="type" dbtype="text" phptype="string" null="true" />
        <field key="floor" dbtype="text" phptype="string" null="true" />
        <field key="rooms" dbtype="text" phptype="string" null="true" />
        <field key="sprice" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
        <field key="price" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
        <field key="busy" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
        <field key="sold" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
    </object>
</model>

Здесь, указываем у тега model в атрибуте package название нашего «компонента».
У тега object в атрибуте class, класс по которому мы потом будем вызывать объекты, в атрибуте table название таблицы где будут храниться объекты, у меня это flats_test

Обратите внимание на поле id, которое желательно использовать в объектах, которое будет индексируемым для более быстрой работы…

Так же, здесь есть обязательное поле resource_id которое связывает объекты в БД с ресурсами, в случае если Вы не собираетесь привязывать объекты к ресурсам, а использовать объекты отдельно от них, то поле указывать не надо.
В целом, нужно указывать в разметке поля «под текст», «под числа» или «под чекбокс» (1/0). И что бы разобраться, какое поле как оформить, погуглите «Типы данных в MySQL»…

Итак, разобравшись с разметкой или взяв мою и вставив в поле Schema, жмём кнопку Save Schema



1.3. Теперь переходим во вкладку create Tables и жмём единственную кнопку create Tables, таким образом, мы создадим новую таблицу в БД, результат можно увидеть в phpMyAdmin:



2. Теперь, переходим к созданию конфигурации MIGX.
2.1. Заходим Пакеты -> MIGX, жмём кнопку Добавить элемент.
В открывшемся всплывающем окне, в поле name указываем название конфигурации латинскими буквами, у меня будет flatstest, в поле Замена «Добавить элемент» можно указать свой вариант текста кнопки добавления объектов, у меня будет Добавить квартиру.



2.2. Открываем вкладку MIGXdb-Settings, в поля Package и Classname прописываем название «компонента» и класс объектов, что мы задавали в разметке, и в поле Load Grid ставим auto, что бы наши объекты подгружались автоматически при их вызове из БД.
В итоге, жмём Сохранить и закрыть, что бы создать конфигурацию и связь с нашим MigxDB «компонентом»



2.3. Снова открываем редактирование конфигурации и переходим во вкладку Formtabs жмём Добавить элемент, в открывшемся окне в поле Caption пишем название окна добавления объекта, у меня как всегда Добавить квартиру. Дальше жмём Выбрать db-поля, и уже в 3м открывшемся окне в единственном поле, добавляем все поля кроме тех, что будут чекбоксами (управление чекбоксами мы сделаем в таблице объектов дальше) после полей id и resource_id, они заполняются автоматически…



Добавив поля жмём Сохранить и закрыть, возвращаемся во 2е окно где эти поля отобразятся, теперь нужно у всех полей задать в Caption название по русски и в Input TV type тип полей.



2.4. Переходим ко вкладке Columns, здесь действуем по тому же принципу, как и в Formtabs, используем Выбрать db-поля. Поля в таблицу выводим по своему усмотрению и используем Renderer: this.renderImage для полей с изображениями.


ВАЖНО! Что бы изменения сохранялись и отображались, в Columns обязательно должно быть поле ID!

2.5. А вот поля-чекбоксы, оформим своеобразно.
У таких полей необходимо во вкладке Renderer в поле Renderer указать this.renderSwitchStatusOptions, в поле on Click выбрать switchOption. Далее в самом низу в Renderoptions добавить 3 опции, пример поля Забронировано где при добавлении объекта это поле изначально в положении выкл.

  • 1 опция
    Name: notcommerce
    Use as fallback for all undefined values: *checked*
    on Click: switchOption
    Image: assets/components/migx/style/images/cb_empty.png
  • 2 опция
    Name: yescommerce
    Use as fallback for all undefined values: не отмечаем
    on Click: switchOption
    Image: assets/components/migx/style/images/cb_ticked.png
  • 3 опция
    Name: notcommerce
    Use as fallback for all undefined values: не отмечаем
    on Click: switchOption
    Image: assets/components/migx/style/images/cb_empty.png
Пояснение: 1 опция используется как «fallback» т.к. при создании объекта мы не можем задать checked/not checked, а остальные 2 опции будут переключаться между собой после первой итерации пользователем, соответственно, если необходимо, что бы это поле при создании объекта было checked, меняем местами данные…



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

3. Осталось дело за малым… Создаём ТВ поле назвав как Вам угодно, указав во вкладке Параметры ввода
  • Тип вода: migxdb
  • Конфигурации: название конфигурации MIGX (у меня flatstest)
И привязав к нужным шаблонам…

На этом всё! Результат всех этих шагов Вы видели в первом скрине этой статьи…

Само собой у Вас возникнут вопросы по данной статье, задавайте их в комментариях, обязательно отвечу!
В целом, постарался «разжевать» всё максимально…

Пример вывода объектов на frontend:

[[!migxLoopCollection?
    &classname=`FlatsTEST`
    &packageName=`FlatsTEST`
    &where=`{"resource_id":"ID ресурса откуда выводить объекты"}`
    &sortConfig=`[{"sortby":"id","sortdir":"DESC"}]`
    &tpl=`flatsTableItem`
]]

P.S. Как принцип использования MIGX и MigxDB Вам станет понятен, Вы сможете организовывать более сложные структуры, главное разобраться, что за чем тянется!)

Поблагодарить автора, а также немного порадовать других активных участников сообщества можно,
отправив донат сообществу найдя реквизиты на странице О нас

Спасибо за внимание!
Денис Усманов
01 июля 2023, 19:46
modx.pro
11
1 605
+14

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

Николай Савин
01 июля 2023, 19:49
0
На удивление первый раз за всю карьеру вижу пример работы с migxDB (сам не пользуюсь, есть modExtra для этого)
    Денис Усманов
    01 июля 2023, 20:21
    +1
    А всё потому что, в поиске по MigxDB находятся всего несколько внятных статей но и те, уже не совсем актуальны… Да и кейс подвернулся подходящий)
    Баха Волков
    01 июля 2023, 22:42
    0
    Эхх… А когда-то я начинал с заметок по MIGX :|
      Денис Усманов
      01 июля 2023, 22:45
      0
      А про MigxDB забыл) Мало информации по нему на modx.pro (
        Денис Усманов
        01 июля 2023, 22:52
        +1
        Хм, твой комментарий наводит меня на мысли «А, что я буду делать через пару лет? Тоже работать над docs.modx.pro/modx.pro/modhost.pro?», я ведь уже не слабо так «прирос» к нашему сообществу, и останавливаться не собираюсь)
          Николай Савин
          02 июля 2023, 07:53
          +1
          Молодежь поджимает.
          Павел Андросов
          01 июля 2023, 23:51
          0
          Можно, кстати, и не создавать ТВ, а вывести сразу пункт меню. А там уже по фильтру получать квартиры и их модификации и т.д.
            Eugene Generalov
            02 июля 2023, 00:30
            +1
            Тогда привязку к ресурсам нужно будет руками указывать и теряется смысл поля resource_id
              Денис Усманов
              02 июля 2023, 00:40
              0
              Да, об этом я косвенно упомянул в blockquote, в пункте 1.2)) Если не привязываться к ресурсам, то действительно, можно в отдельный пункт меню вынести управление объектами, такой вариант подходит например к «хранилищу документов» сайта. В общем, к чему то, что может быть общим для всех ресурсов…
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              9