[modHelpers] Загрузка моделей для кастомных таблиц
Ночами не сплю, думаю как бы ещё облегчить жизнь разработчикам. :) И вот надумалось упростить загрузку моделей для своих таблиц. Это нужно когда вы создаёте таблицу и хотите использовать методы MODX для доступа к ней. Для разработчиков компонентов пока этот вариант не подойдёт. Может в будущем что придумается. А вот для расширения своего сайта поможет новая функция load_model(), которая загружает модель.

Обычно разработчики пользуются компонентом CMPGenerator. Он генерирует необходимые файлы. Для использования модели в коде нужно загрузить её через addPackage(). В моём варианте модель загружается при загрузке страницы. Поэтому она доступа сразу.
Последовательность такая.
Шаг 1. Как обычно создаём таблицу для объектов (для примера modx_objects) через phpMyAdmin.
Шаг 2. Создаём файл для загрузки модели. Например, файл объектов и разместим его в папке core/models/objects.php.
Шаг 3. В плагине загружаем файл.
Теперь можно спокойно пользоваться xPDO.
Можно добавлять индексы, связи aggregate и composite, rule для валидации. Всего несколько строчек и дверь xPDO открыта.
В целях оптимизации модель кэшируется. Так что, если вы поменяли модель в файле, нужно удалить файл с кэшированной версией в core/cache/default/название_модели_map.php.
Ещё в этой версии библиотеки добавлены несколько методов в класс коллекции
leaveGroup — для ресурсов и пользователей. whereIn whereNotIn whereLike whereNotLike whereIsNull whereIsNotNull А также добавлен класс modHelperMailer для функции email(). Позволяет использовать цепочки методов. Его можно использовать и отдельно от функции.
Вроде ничего не забыл. В ближайшее время обновлю документацию.

Обычно разработчики пользуются компонентом CMPGenerator. Он генерирует необходимые файлы. Для использования модели в коде нужно загрузить её через addPackage(). В моём варианте модель загружается при загрузке страницы. Поэтому она доступа сразу.
Последовательность такая.
Шаг 1. Как обычно создаём таблицу для объектов (для примера modx_objects) через phpMyAdmin.
Шаг 2. Создаём файл для загрузки модели. Например, файл объектов и разместим его в папке core/models/objects.php.
<?php
// Класс у нашей модели будет называться 'Object'
if (!class_exists('Object')) {
class Object extends xPDOObject{}
class Object_mysql extends Object{}
// Указываем класс и имя таблицы без префикса
load_model('Object', 'objects', function ($model) {
/** @var modHelperModelBuilder $model */
$model->id('id')->pk(); // тип поля unsigned integer и указываем, что это первичный ключ.
$model->varchar('name', 100)->setDefault('string')->rulePregMatch('invalid','/^[a-zA-Z\s]+$/','Нельзя использовать цифры в названии!');
$model->text('description')->null()->alias('desc');
$model->arr('properties')->null(); // array phptype
$model->int('rid',true)->aggregate('Resource',array('class'=>'modResource','foreign'=>'id','cardinality'=>'one', 'owner'=>'foreign'))->index();
$model->int('createdby')->unsigned()->aggOneForeign('CreateUser','modUser','id')->index();
$model->int('createdby', true)->aggOneForeign('EditUser','modUser','id')->index();
$model->datetime('createdon'); // Если дата храниться в БД с типом datetime
$model->bigint('editedon',true)->phpType('datetime');// Если дата храниться в базе в UNIX формате.
});
}В этом же файле можно расширить и базовые классы, например, ресурсов и пользователей.Шаг 3. В плагине загружаем файл.
switch ($modx->event->name) {
case 'OnMODXInit':
include_once MODX_CORE_PATH . 'models/objects.php';
break;
}Теперь можно спокойно пользоваться xPDO.
$object = $modx->getObject('Object', 1);
$Creater = $object->CreateUser->username;
// Валидация
$obj->set('name', 'Супер 777');
if (!$obj->validate()) {
$validator = $obj->getValidator();
return $validator->getMessages()[0]['message'];
}
$obj->save();Можно добавлять индексы, связи aggregate и composite, rule для валидации. Всего несколько строчек и дверь xPDO открыта.
В целях оптимизации модель кэшируется. Так что, если вы поменяли модель в файле, нужно удалить файл с кэшированной версией в core/cache/default/название_модели_map.php.
Ещё в этой версии библиотеки добавлены несколько методов в класс коллекции
- joinGroup — для ресурсов и пользователей.
// Добавим первых 10 пользователей в группу Manager
users()->whereIn('id',range(1,10))->joinGroup('Manager'); resources()->whereLike('pagetitle', '%продукт%')->get(); email()
->to('user1@mail.ru')
->toUser(5)
->cc('user2@mail.ru')
->subject('Тема письма')
->content('тело сообщения')
->from('Администратор')
->replyTo('admin@gmail.com')
->attach('file1.jpg')
->send();Вроде ничего не забыл. В ближайшее время обновлю документацию.
Комментарии: 12
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Fi1osofВ xPDO 3 уже вроде и от map файлов должны были избавиться, оставив одни классы объектов с картой в свойстве — но я еще не проверял, как оно работает.
Fi1osofЯ изначально предлагал подключиться разработчикам с предложениями упрощения рутинных задач разработки, так как у меня в этом опыта не много.
П.С. В новой версии добавил очередь к email, чтобы не нагружать сайт при загрузке страницы. Т.е. вместо отправки почты она сохраняется в очередь, а потом в cron скрипте можно отправить из очереди. Причем очередей можно создать сколько угодно. Например, одна для админа с уведомлением о новом пользователе, другая для подписчиков новостей и т.д.