• Блог
  • Модель для своих таблиц

Динамическое создание модели

В новой версии добавлена функция 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');
    
  • leaveGroup — удаление из группы. Для ресурсов и пользователей.
  • whereIn — для условия WHERE field IN (value1,value2,...).
  • whereNotIn — для условия WHERE field NOT IN (value1,value2,...).
  • whereLike — для условия WHERE field LIKE 'value%'.
  • resources()->whereLike('pagetitle', '%продукт%')->get();
    
  • whereNotLike — для условия WHERE field NOT LIKE 'value%'.
  • whereIsNull — для условия WHERE field IS NULL.
  • whereIsNotNull — для условия WHERE field IS NOT NULL.

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

А также добавлен класс 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();

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

0   5252

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

  1. Павел Устюгофф 09 февраля 2017 # 0
    Нахожу ваш сайт полезным ресурсом по modx. Как же я раньше мог упустить его из виду.

    Скажите пожалуйста, а у вас не планируется написание статьи о пошаговом создании дополнения под MODx? Уж больно доходчиво вы умеете объяснять.
    1. Сергей Шлоков 09 февраля 2017 # 0
      Спасибо!
      Есть хороший курс на эту тему, по которому многие их нас учились.
      1. Павел Устюгофф 09 февраля 2017 # 0
        проходил его. Хочется еще. Свежих мыслей, примеров! от мастера по созданию дополнений.
        1. Сергей Шлоков 09 февраля 2017 # +1
          Добавить к нему мне нечего. Кроме того, я всё своё свободное время трачу на изучение Laravel. Это следующая ступень развития разработчика. Позволяет держаться в тренде современных технологий. MODX сильно отстает в этом направлении.
          В планах, для модыксеров, желающих попробовать Laravel, подготовить серию статей. Пару я уже написал.
    2. igos 30 июня 2021 # 0
      :v

      Вы должны авторизоваться, чтобы оставлять комментарии.

      Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.