Как сделать таблицу в modx
В новой версии добавлена функция 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 .
Теперь переходим в Приложения -> 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 (По умочанию: выключена)
Видео с демонстрацией кейсов
Автор основной версии — Яна Вострякова.
Автор последних правок — Баха Волков.Читайте также: