Запрос к базе данных в Joomla 3
Приветствую всех как начинающих разработчиков, так и разработчиков со стажем в разделе "Блог" нашей веб студии.
В этой статье приведу пример работы с базой данных в CMS Joomla 3 с выборкой данных из таблицы и выводом их на экран в виде строки.
Оказывается, в удивительном мире мы живём. И зачастую приходится удивляться тем вещам, которым даже и не думал удивляться.
В данном случае моё удивление было вызвано тем, что для такой популярной CMS как Joomla, за сутки поиска в Интернете, мною не было найдено ни одной полной и толковой статьи о том как же правильно сделать запрос к базе данных в joomla и при этом вывести результат из нужной ячейки на странице в виде строки. Согласно найденной мною статистике, количество сайтов в интернете созданных на движке Joomla составляет более 30 млн. Условно предположим, что для их создания потребовалось около 0,5 млн. разработчиков. Если допустить, что из этого полумиллиона всего лишь одному проценту разработчиков пришлось писать запросы к базе данных - то мы получим 5000 разработчиков. И вот что удивительно: почему до сих пор, никто из этих 5000 специалистов, не написал ни одной доступной к пониманию статьи о том как же правильно осуществить выборку из базы данных Joomla!??
Однако давайте перейдём непосредственно к технической реализации процесса обработки данных базы данных Joomla.
Во первых, хотелось бы сказать, для чего это может потребоваться?
Представьте, что на Вашем сайте необходимо вывести данные из некоторых полей административной части, а стандартный набор компонентов и модулей не позволяет этого сделать. Вот тогда мы и прибегаем к написанию собственных запросов. В моём случае мне потребовалось отобразить данные из поля "Примечание" стандартного модуля вывода последних новостей, на странице фронтенда сайта.
Ниже представлен код соединения с базой данных Joomla, выборки данных из ячейки таблицы и вывода этих данных в виде строковой переменной. Данный код может быть применён для любого поля любых таблиц БД Joomla. Его можно прописать в основном файле шаблона - index.php, можно в файле шаблона модуля или компонента default.php, либо же в других файлах отвечающих за вывод содержимого на фронтенде сайта.
$db =&JFactory::getDBO(); $query = "SELECT id,note FROM #__modules WHERE id='".$module->id."'"; $db->setQuery($query); $result = $db->loadObjectList(); foreach($result as $row){ echo $row->note; }
Ещё раз хочу обратить внимание читателя, что представленный код в первую очередь, характеризует принцип работы с базой данных Joomla и является полностью работоспособным в третьей версии joomla. Вполне вероятно, что он будет работать и на joomla 2.5.
Для реализации же вывода содержимого из дополнительных полей, в том числе из поля "Примечание" модуля, есть и другие способы.
А теперь давайте построчно разберём наш код.
Первая строка:
$db =&JFactory::getDBO();
отвечает за безопасную для Joomla установку соединения с базой данных сайта.
Далее:
$query = "SELECT id,note FROM #__modules WHERE id='".$module->id."'";
идёт выборка данных из таблицы баз данных. В нашем случае, мы из таблицы #__modules выбираем значения полей id и note, где id равно значению переменной $module->id (переменная $module->id - номер модуля). Так же здесь стоит обратить внимание на то, каким образом мы указываем название таблицы. Вначале названия идёт знак # и два нижних подчёркивания. Знак # и первое нижнее подчёркивание заменяет нам префикс таблиц БД, т.е. нам нет необходимости прописывать здесь реальный префикс таблиц.
Каждый разработчик в данном случае составит свой запрос с указанием нужной ему таблицы и условий.
Затем строку:
$db->setQuery($query);
назовём служебным методом Joomla, который необходим, что бы запрос выше записался во внутреннюю переменную, и префикс таблиц БД заменился на тот, который указан в файле конфигурации.
Следующая строка:
$result = $db->loadObjectList();
заносит в переменную $result нашу выборку в виде ассоциативного массива. Если кому-либо интересно, то команда print_r($result) поможет увидеть этот массив на экране.
Метод loadObjectList() - как раз и отвечает за то, что наши данные будут получены в виде ассоциативного массива. Существуют и другие методы.
В строках 5-7 мы через цикл foreach выводим наши данные на экран следующим образом:
foreach($result as $row){ echo $row->note; }
Благодарю всех за внимание.
Если Вы знаете как по другому осуществляется реализация запросов к базе данных в Joomla - пожалуйста пишите в комментариях.
http://blago/internet-magazin/shen-puer
и здесь
http://blagocha.com.ua/internet-magazin/ulun/te-guan-in-mao-cha
Есть в БД такая запись
INSERT INTO `cms7_jshopping_products_reviews` (`review_id`, `product_id`, `user_id`, `user_name`, `user_email`, `time`, `review`, `mark`, `publish`, `ip`) VALUES
(2, 16, 0, 'Anton ', 'lyrik_amail.ru', '2017-08-03 07:04:03', 'Отличный чай для вечера. Вкус напомнил медовые нотки, с долгим послевкусием цветочной поляны. Воздействие успокаивающее, медитативное. ', 0, 1, '77.121.140.140'),
(4, 61, 214, 'Maksim', 'm.v.golubev1986gmail.com', '2017-09-27 17:35:47', 'Пока это лучший Шен который я пил))))', 0, 1, '46.133.154.121');
Очень надо, помоги, я даже не знаю к кому обратиться за помощью
2. Далее, Вам необходимо найти таблицу в БД, в которой содержится количество отзывов для товара. И уже относительно этой таблицы осуществить выборку согласно примера в статье.
Таблица 'cms7_jshopping_products_reviews' из Вашего примера не является таблицей хранящей количество отзывов о товаре.
Если же такой таблицы для joomShopping нет (сейчас точно не скажу как для этого компонента организованы БД), то Вам необходимо подумать как сосчитать количество записей в таблице с отзывами для конкретного товара и затем это количество вывести модернизировав запрос из статьи.
С ув. Анатолий.
Знак амперсанта перед JFactory уже не нужен
Интересное замечание.
Статья писалась с рабочего примера, поэтому по состоянию на 8 мая 2017 года всё корректно работало со знаком амперсанта.
Как Вы считаете если всё таки будет знак амперсанта, будет работать данный запрос?