Как сделать таблицу в modx

Обновлено: 05.07.2024

В новой версии добавлена функция load_model() для работы с кастомными таблицами. MODX не умеет работать с таблицами базы данных пока вы не познакомите его с ними. Для этого нужно создать модель таблицы и загрузить её. После этого вам будут доступны методы MODX для работы с ней. Для разработчиков компонентов пока этот вариант не подойдёт. Может в будущем что придумается. А вот для расширения своего сайта поможет самое оно.

Шаг 1. Как обычно создаём таблицу для объектов (для примера modx_objects) через phpMyAdmin.

Шаг 2. Создаём файл для загрузки модели. Например, файл объектов и разместим его в папке core/models/objects.php.

В этом же файле можно расширить и базовые классы, например, ресурсов и пользователей.

Шаг 3. В плагине загружаем файл.

Теперь можно спокойно пользоваться xPDO.

Можно добавлять индексы, связи aggregate и composite, rule для валидации. Всего несколько строчек и дверь xPDO открыта.

В целях оптимизации модель кэшируется. Так что, если вы поменяли модель в файле, нужно удалить файл с кэшированной версией в core/cache/default/название_модели_map.php.

Класс коллекции

Ещё в этой версии библиотеки добавлены несколько методов в класс коллекции

  • joinGroup — добавление в группу. Для ресурсов и пользователей.
  • leaveGroup — удаление из группы. Для ресурсов и пользователей.
  • whereIn — для условия WHERE field IN (value1,value2. ).
  • whereNotIn — для условия WHERE field NOT IN (value1,value2. ).
  • whereLike — для условия WHERE field LIKE 'value%'.
  • whereNotLike — для условия WHERE field NOT LIKE 'value%'.
  • whereIsNull — для условия WHERE field IS NULL.
  • whereIsNotNull — для условия WHERE field IS NOT NULL.

Улучшения работы с почтой

А также добавлен класс modHelperMailer для функции email(). Позволяет использовать цепочки методов. Его можно использовать и отдельно от функции.

Вроде ничего не забыл. В ближайшее время обновлю документацию.

24 января 2017 0 4165

Комментарии ( )

Нахожу ваш сайт полезным ресурсом по modx. Как же я раньше мог упустить его из виду.

Скажите пожалуйста, а у вас не планируется написание статьи о пошаговом создании дополнения под MODx? Уж больно доходчиво вы умеете объяснять.

С точки зрения безопасности писать прямые запросы к бд чревато большими проблемами, для того чтобы этого избежать в cms Modx существуют запросы к таблицам бд с помощью объектов. В этой статье мы разберемся как сделать запрос к пользовательской таблице в Modx.

Создание объектов для управления собственной таблицей

Для создания обращения к содержимым собственных таблиц, как с объектами pdo , необходимы несколько дополнений, это Console и CMPGenerator. Итак, создадим свою таблицу packagename в базе данных mysql .

Затем переходим в Приложения -> CMP Generator -> Create Package .

создание объекта в CMP Generator

Теперь переходим в Приложения -> Console .

И вводим следующую команду:

Обратите внимание! Не забудьте изменить packagename на ваше название таблицы.

Нажимаем выполнить. Открываем файл /core/components/packagename/model/packagename/packagename.mysql.schema.xml Если видим название столбцов такие же как в бд mysql , то всё получилось =).

Создание запроса к таблице базы данных через объекты.

После того как создали объекты для связи с таблицей бд мы можем выполнить запрос для вывода содержимого. Если ваши сниппеты расположены в локальных файлах, рекомендую в самом начале подключить $modx и $pdoTools (первые две строки кода).

Допустим что в нашей таблице есть поле id_user - содержащее id пользователя и поле info - содержащее информацию о пользователе. Выведем сводную информацию из двух таблиц (имя пользователя и информацию из нашей таблице о нем). Для этого выполним следующий код

Всё, данный запрос вернёт нам массив вида $outRequest['fullname'] и $outRequest['info'] с которыми затем уже можем совершать различные действия, например вывести с помощью чанка:

В MODX есть удобная возможность создавать свои классы, ассоциировать их с таблицами в базе данных и хранить там коллекции данных оперируя ими как объектами в ООП.
К тому-же ими можно удобно управлять контент менеджерам сайта с помощью MIGX DB через странички админки, которые можно довольно быстро создать:



Для этого в MODX нужно создать свой пакет(package), добавить туда схему модели в xml файле, спарсить эту схему, создать таблицу в БД и подключить этот пакет для работы. На самом деле в ручную все это делать довольно долго и есть возможность допустить кучу ошибок, поэтому лучше воспользоваться менеджером пакетов MIGX:


Первым делом создаем новый пакет(package), после создания мы сможем его увидеть в списке папок внутри core->components. После создания пакета нужно написать свою XML схему(или взять мой пример), которая представляет из себя один класс( ) или набор классов внутри модели( ) с полями( ). Именно с этими полями мы сможем потом работать в сниппете или плагине примерно таким образом:

$student = $modx->getObject('myStudent',array('id'=>2));
$name = $student->get('name');



В схеме прописываем:
model package - имя пакета, то-же самое что написали в "Package Name" наверху;
object class - имя класса нашего объекта;
object table - имя таблички в БД, где будут храниться наши объекты;
field key - имя поля нашего объекта;
field dbtype - тип поля(int, varchar, text, datetime и т.д.);
field default - значение по умолчанию для поля;
aggregate alias - имя связи(например University), которую мы сможем использовать подобным образом:
$university = $student->getOne('University');
aggregate class - класс объекта связи;
aggregate local - имя локального id поля для связи с объектом;
aggregate foreign - имя id объекта связи(в большинстве случаев то поле, которое хранит id-шник нашего объекта для связи);
aggregate cardinality - вид связи(one, many);
aggregate owner - указание объекту: кто тут главный(в случае связи Университет - Студенты: главный университет);

Я рекомендую не писать заново схему, а скопировать уже существующую(например из моего примера) и изменить на свой лад.
Кстати благодаря object extends="xPDOSimpleObject", а не xPDOObject в объект автоматически добавляется поле id. Вообще наследовать объект можно от любого класса, благодаря чему в объект попадут все поля от наследуемого класса.

Когда сохраняем XML схему, да и когда проводим другие операции над нашим пакетом в менеджере MIGX нужно следить за тем, чтобы в поле "Package Name" было написано имя именно того пакета, над которым мы проводим операции.
Следующим шагом будет parse Schema на соответствующей вкладке:



Теперь можно заглянуть в PHPMyAdmin и проверить наличие наших табличек в БД:


Вот и все, необходимый минимум выполнен, теперь мы из кода можем добавить в любую из табличек объект, сохранить его там, а после, в нужный момент получить с помощью подобного кода:

$modx->addPackage('mypackage', MODX_BASE_PATH . 'core/components/mypackage/model/', 'modx_');

$university = $modx->newObject('myUniversity');
$university->set('name', 'Тихоокеанский Государтсвенный университет');
$university->set('abb', 'ТОГУ');


$petrov = $modx->newObject('myStudent');
$petrov->set('fullname', 'Иванов Иван');
$petrov->set('university', $university->get('id'));


$ivanov = $modx->newObject('myStudent');
$ivanov->set('fullname', 'Петров Петр');
$ivanov->set('university', $university->get('id'));


Вы наверно заметили ту некрасивую строчку($modx->addPackage) в начале нашего кода, она нужна для подключения нашего пакета со всеми его классами. Можно организовать автоматическое подключение пакета, если в настройках системы прописать для extension_packages:
[<. здесь уже что-то есть. >,>]
Более подробнее тут.
После этого строчка $modx->addPackage будет не нужна и мы будет использовать наши новык классы как родные MODX-овские (типа modResource или modUser) без лишних манипуляций.

Теперь, когда мы проверили что все работает как надо, можно создать страницы для работы с этими табличками в админке MODX. Для этого заходим в Меню:


Примечание: в старой версии MODX пункт "Меню" назывался "Действия".

На странице "Меню" выбираем родителя, куда мы добавим новый пункт меню - "Верхнее меню" и добавляем пункт students-and-universities, прописывая указанные параметры:



После сохранения в MIGX в верхней меню появляется новый пункт students-and-universities (позже можно зайти в управление словарями и присвоить этому ключу в пространстве migx и языке ru подходящее значение для вывода):



Пункт меню будет направлять нас на страничку по адресу, оканчивающемуся на &configs=students||universities (потому-что именно это мы и прописали при создании), по нему очевидно что на странице должно что-то отображаться с помощью каких-то конфигов. Все встает на свои места когда мы заходим в MIGX(или Приложения->MIGX) на вкладку MIGX:

Именно здесь должны располагаться наши конфиги, которые наша страница для работы с БД будет использовать для отображения и вообще работы в целом. Я описывал в своей прошлой статье по MIGX создание этих конфигов и использование их как TV в ресурсах, но конфиги для MIGX DB будут отличаться дополнительными настройками для связи с БД и дополнительным описанием.
Здесь подготовлен конфиг по модели Студента, если экспортируете его и зайдете посмотрите через GUI менеджер то увидете на вкладке Migxdb-Settings настройки для подключения к нашему классу myStudent:




Так-же в колонках(Columns) нужно добавлять id,deleted и published для корректной работы редактирования, удаления в корзину и публикации.
Конфигурацию для университетов попробуйте создать сами, можно на основе конфигурации Студентов заменив класс и надписи в настройках и убрав лишние поля оставив только name.
Так-же при создании конфигураций стоит прописывать им unique MIGX ID: поле которого находится в первой вкладке Settings, и который должен быть уникален у каждой конфигураций(я прописываю таким-же как и имя у конфигурации).
Теперь когда мы создали наши конфигурации, присовили им имена, unique MIGX ID и настроили MIGX DB у каждой из них, можно зайти на страничку students-and-universities и посмотреть список наших студентов:


Вывод имени университета обеспечивается с помощью настроек Joins на вкладке Migxdb-Settings в менеджере MIGX:


И колонки с Field: University_name, где University - это alias связи в xml схеме нашей модели, а name - это поле внутри object myUniversity.


Если вы попробуйте зайти в редактирование студента, то увидите что выбор университета так-же работает:



Для сравнения я добавил так-же поле mod_user, которое берет inputTV: select-user(вам следует его создать как новый TV у себя в MODX если хотите протестировать), который так-же обеспечивает выбор из обьектов БД по принципу, который я описывал в этой статье.

В отличие от выбора университета, выбор пользователя работает со строкой поиска что часто очень полезно при работе с БД. К сожалению я не смог найти как добиться такой-же функции у input TV type: listbox.

Теперь когда объекты лежат в Базе Данных и ждут своего часа мы можем выводить их на страницах нашего сайта с помощью migxLoopCollection , который уже находится в пакете MIGX. Примеры использования можно посмотреть здесь и здесь.
Или самостоятельно получать через сниппеты с помощью $collection = $modx->getCollection('myUniversity', array('deleted'=>0));

Внимание, этот компонент требует версию PHP 5.3 или выше! Если ваш сайт использует PHP ниже требуемого, установка этого дополнения может его сломать.


TVTable — это ТВ-параметр в виде таблицы, в которой можно менять количество не только строк, но и столбцов.

UPD:
Теперь таблица выглядит так:
И поддерживает лексиконы!
Можно использовать чанки

Так же, можно появились 2 параметра — getX и getY, которые позволяют получить значение из ячейки таблицы

Важные изменения

  • Редизайн компонента
  • Из компонента выпилен jQuery
  • Теперь нет привязки к количеству колонок и строк таблицы, т.е. теперь можно создать даже одну ячейку
  • Есть обратная совместимость
  • Появилась возможность удалять определенные столбцы
  • Появилось несколько параметров

    Максимальное количество столбцов

Сниппет

  • В параметр tv теперь можно указывать не только ID, но и название TV
  • Теперь выводится thead, параметр head (По умолчанию: включен)
  • Добавлены свойства bodyClass и headClass для добавления CSS-классов в tbody и thead соответственно
  • Параметр classname переименован в tableClass (но classname всё равно будет работать)
  • Изменено поведение сниппета при указанных getX и getY
    • Если указать только getX, то на выходе получим таблицу с указанной строкой
    • Если указать только getY, то на выходе получим таблицу с указанным столбцом
    • Если указать и getX и getY, то на выходе получим содержимое указанной ячейки по координатам
    • Также в них кроме индекса можно указывать first и last
    Несколько примеров для наглядности:

    Важно! При обновлении будьте внимательны, из чанка теперь убран

    Баги и прочее

    • Исправлен баг когда в БД записовался пустой массив в случае если таблица была пустая, теперь если все поля таблицы пустые, то в БД ничего не записывается
    • Исправлен баг с кнопкой удаления столбца, теперь она будет появлятся и исчезать
    • Добавлена кнопка для очистки таблицы, системная настройка tvtable_clear_button (По умочанию: выключена)

    Видео с демонстрацией кейсов

    Автор основной версии — Яна Вострякова.
    Автор последних правок — Баха Волков.

    Читайте также: