MODX создание и управление своими mysql-таблицами через объекты

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

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

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

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

Package Name: packagename
Database Name Name: пусто
Tables: modx_packagename
Prefix: modx_
Build Schema: Да
Build Package: Да

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

Нажимаем сохранить

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

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

$modx->addExtensionPackage('packagename', $modx->getOption('core_path') . 'components/packagename/model/');

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

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

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

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

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

global $modx;
$pdoTools = $modx->getService('pdoTools');

$request = $modx->newQuery('Packagename');
$request->leftJoin('modUserProfile','modUserProfile', 'Packagename.id_user = modUserProfile.internalKey');
$request->select('modUserProfile.fullname,Packagename.info');
$request->where([ 'Packagename.id_user'=> $modx->user->id ]);
$request->prepare();
// $sql = $request->toSQL(); // служит для проверки правильности запроса в бд
$request->stmt->execute();
$outRequest = $request->stmt->fetchAll(PDO::FETCH_ASSOC);

return $outRequest;

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

$tpl = $modx->getOption('tpl', $scriptProperties, '@FILE chunks/myTpl.tpl');
foreach($outRequest as $item){
    $res .= $pdoTools->getChunk($tpl, $item);
}
return $res;

Содержимое myTpl:

<div>{$_pls['fullname']} - {$_pls['info']}</div>

Всё готово.