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