С точки зрения безопасности писать прямые запросы к бд чревато большими проблемами, для того чтобы этого избежать в 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: Да

Нажимаем сохранить
Теперь переходим в Приложения -> 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>
Всё готово.
