Вопросы
Опишите структуру фреймворка Joomla.
Что такое фронтенд и бэкенд?
Какие константы предопределены в Joomla?
Каким образом реализована поддержка мультиязыковых сайтов?
Для чего используется класс JFactory?
В чем преимущество использования методов класса JRequest?
Что такое очередь сообщений?
Для чего используется глобальный объект JApplication?
Каким образом создаются панели инструментов в бэкенде?
Упражнения
Адаптируйте код из раздела " Практика" для своего варианта (см. дополнительные материалы).
Работа с базой данных
Подробно рассмотрена работа с базой данных средствами Joomla. Рассмотрены понятия реального и символического префиксов, этапы выполнения запроса к базе данных и класс JTable.
Цель лекции:Изучить, как происходит работа с базой данных средствами Joomla.
Префикс таблиц базы данных
Префикс таблиц базы данных- это строка, которая присоединяется к названию каждой таблицы Joomla в базе данных. Префикс задается при установке Joomla. В старых версиях по умолчанию использовался префикс "jos_", однако это создавало потенциальную уязвимость сайта, т.к. хакеры знали название таблицы с паролями пользователей - "jos_users". Теперь префикс, предлагаемый при установке, генерируется случайным образом.
Использование префикса позволяет разместить в одной базе данных несколько установок Joomla.
Различают реальный и символический префиксы. Реальный префикс- это то конкретное сочетание символов, которое используется в названиях таблиц базы данных. Символический префикс- это сочетание "#__" (решетка и два знака подчеркивания), которое используется в запросах вместо реального префикса. При обработке запроса вместо символического префикса будет автоматически подставлен реальный. Например, при реальном префиксе "jos_" строка "#__mycomponent_mytable" превратится в "jos_mycomponent_mytable".
При разработке собственных расширений в SQL-запросах всегда указывается символический префикс, а не реальный, так как в других установках Joomla почти наверняка будут использоваться другие реальные префиксы.
Выполнение запроса к базе данных
Чтобы выполнить запрос к базе данных Joomla, необходимо осуществить пять операций:
Получение ссылки на объект JDatabase.
Формирование запроса.
Задание запроса.
Выполнение запроса.
При необходимости - загрузка результата.
Получение ссылки на объект JDatabase
JDatabase- абстрактный класс, предоставляющий доступ к соединению с базой данных. Это соединение создается при инициализации приложения Joomla, а в коде своего расширения мы можем получить ссылку на него с помощью метода getDbo() статического класса JFactory:
$db =& JFactory::getDbo();
Формирование SQL-запроса
В старых версиях Joomla запросы формулировались в виде строки:
$query = 'SELECT * FROM #__categories';
В Joomla 1.6 появился объект JDatabaseQuery, методы которого позволяют упростить создание сложных SQL-запросов. Названия этих методов практически совпадают с ключевыми словами языка SQL: select(), from(), where(), having(), join() и т.д. Использование объекта JDatabaseQuery иллюстрирует следующий пример:
$db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select('id, name'); $query->from('#__users'); $query->order('name'); $query->where('username LIKE \'a%\''); $db->setQuery($query); echo $query->__toString();
В данном примере мы получаем из таблицы #__users отсортированный по алфавиту список id и имен пользователей, чьи логины начинаются на букву "a". Данный код выведет на экран следующий SQL-запрос:
SELECT id, name FROM #__users WHERE username LIKE 'a%' ORDER BY name
Как известно, употребляющиеся в запросе названия полей и таблиц рекомендуется заключать в ограничители, чтобы избежать совпадений с зарезервированными словами. Кроме того, строковые значения в запросах также берутся в кавычки. Методы nameQuote() и Quote() заключают, соответственно, названия и значения в правильные ограничители. Для MySQL это обратные апострофы (``) для названий и обычные апострофы ('') для значений.
Рассмотрим пример использования этих методов:
$query = 'SELECT * FROM '.$db->nameQuote('#__users').' WHERE '.$db->nameQuote('username').'='.$db->Quote('admin');
Для базы данных MySQL с префиксом таблиц jos_ переменная $query примет следующее значение:
SELECT * FROM `jos_users` WHERE `username`='admin';
Задание запроса
Чтобы задать SQL-запрос для последующего выполнения, используется метод:
JDatabase setQuery(string $query, string $offset=0, string $limit=0)
где $query - это запрос, а $offset и $limit - соответственно смещение для начала выборки и количество выбираемых строк.
Например:
$db->setQuery($query, 0, 10);
Обратите внимание, что метод setQuery() не выполняет запрос, а только задает его.
Выполнение запроса
Без выборки данных
Для выполнения запроса, не требующего выборки данных (например, UPDATE или INSERT), используется метод mixed query().
При успешном выполнении запроса метод возвращает указатель на его результат, в противном случае - false. Например:
$db =& JFactory::getDBO(); $query = "UPDATE #__users SET block = 0 WHERE username LIKE 'a%'"; $db->setQuery($query); $result = $db->query();
С выборкой данных
В классе JDatabase существуют методы для получения форматированного результата. Их можно разделить на следующие группы:
Получение одного значения: loadResult().
Получение одной строки таблицы: loadRow(), loadAssoc(), loadObject().
Получение одного столбца таблицы: loadResultArray().
Получение нескольких строк и нескольких столбцов: loadRowList(), loadAssocList(), loadObjectList().
Рассмотрим каждый из этих методов на примере таблицы #__categories, использующейся Joomla (таблица 2.1).
Таблица 2.1. Таблица #__categories id asset_id parent_id lft rgt level path extension … language1 0 0 0 11 0 system … * 2 27 1 1 2 1 uncategorised com_content … * 3 28 1 3 4 1 uncategorised com_banners … * 4 29 1 5 6 1 uncategorised com_contact … * 5 30 1 7 8 1 uncategorised com_newsfeeds … * 6 31 1 9 10 1 uncategorised com_weblinks … *
mixed loadResult()
Метод загружает значение первого столбца первой строки результирующей выборки. Используется для получения из базы данных какого-либо одного значения. При ошибке выполнения запроса метод вернет null, как и все рассмотренные ниже методы выборки данных.
Например, получим значение поля name в записи под номером 2:
$db =& JFactory::getDbo(); $query = 'SELECT '.$db->nameQuote('extension'). ' FROM '.$db->nameQuote('#__categories'). ' WHERE '.$db->nameQuote('id').'='.$db->Quote('2'); $db->setQuery($query); echo $db->loadResult();
Результатом выполнения данного запроса будет значение "com_content".
array loadRow()
Загружает первую строку результирующей выборки в виде массива. Если запрос возвращает больше одной строки, то метод вернет первую из них.
$db =& JFactory::getDbo(); $query = 'SELECT * FROM '.$db->nameQuote('#__categories'); $db->setQuery($query); print_r($db->loadRow());
Результатом запроса будет следующий список (будем называть списком массив, индексами которого являются числа 0, 1, 2 и т.д.):
Array([0]=>1 [1]=>0 [2]=>0 [3]=>0 [4]=>11 [5]=>0 [6]=> [7]=>system [8]=>ROOT [9]=>root [10]=> [11]=> [12]=>1 [13]=>0 [14]=>0000-00-00 00:00:00 [15]=>1 [16]=>{} [17]=> [18]=> [19]=> [20]=>0 [21]=>2009-10-18 16:07:09 [22]=>0 [23]=>0000-00-00 00:00:00 [24]=>0 [25]=>*)