Загружаем модель для своих таблиц
Динамическое создание модели
В новой версии добавлена функция load_model()
для работы с кастомными таблицами. MODX не умеет работать с таблицами базы данных пока вы не познакомите его с ними. Для этого нужно создать модель таблицы и загрузить её. После этого вам будут доступны методы MODX для работы с ней. Для разработчиков компонентов пока этот вариант не подойдёт. Может в будущем что придумается. А вот для расширения своего сайта поможет самое оно.
Последовательность такая.
Шаг 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();
Улучшения работы с почтой
А также добавлен класс modHelperMailer для функции email(). Позволяет использовать цепочки методов. Его можно использовать и отдельно от функции.
email() ->to('user1@mail.ru') ->toUser(5) ->cc('user2@mail.ru') ->subject('Тема письма') ->content('тело сообщения') ->from('Администратор') ->replyTo('admin@gmail.com') ->attach('/path/to/file1.jpg') ->attach('/path/to/file2.png') ->send();
Вроде ничего не забыл. В ближайшее время обновлю документацию.
Комментарии ()
Вы должны авторизоваться, чтобы оставлять комментарии.
Скажите пожалуйста, а у вас не планируется написание статьи о пошаговом создании дополнения под MODx? Уж больно доходчиво вы умеете объяснять.
Есть хороший курс на эту тему, по которому многие их нас учились.
В планах, для модыксеров, желающих попробовать Laravel, подготовить серию статей. Пару я уже написал.