Структура базы данных Joomla оставалась относительно постоянной, с тех пор как Joomla 1.0 была запущена в 2005. И вот после шести лет пришло время реорганизовать структуру, устранить мночисленные проблемы сдерживающие развитие Joomla, и подготовить основу на следующие пять или шесть лет разработки.

joomla-database-180x160

Использование нового JDatabaseQuery класса в Joomla 1.6

Для лучшей в будущем поддержки других баз данных, таких как MongoDB, MSSQL, и др., Joomla 1.6 предоставляет новый класс конструктора запросов. Этот класс позволяет Вам создавать запросы в порядке, которые имеют смысл для  разработчиков, а не в строгом формате SQL. Ниже пример того, на что похож запрос в Joomla 1.5 и как это преобразовывается в Joomla 1.6.  Используя класс запроса,  Вы можете встроить много условных элементов в запросы программно аккуратным способом.

Построение SQL запроса в Joomla 1.5

$db = JFactory::getDbo();
$db->setQuery(
 'SELECT *'.
 ' FROM #__articles'.
 ' WHERE state = '.(int) $published.
 '  AND catid = '.(int) $categoryId.
 ' ORDER BY created DESC'
);

Альтернативный способ построения запроса в Joomla 1.6
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
 ->from('#__articles')
 ->where('state = '.(int) $published)
 ->where('catid = '.(int) $categoryId)
 ->order('created DESC');
$db->setQuery($query);

Изменения в структуре базы данных Joomla 1.6 для установленных расширений

Одной из вещей, которая преследовала разработчиков Joomla в прошлом, является то, что метаинформация о расширениях была сохранена во множестве таблиц. Хотя большинство разработчиков знало о неудобной jos_components таблице, которая служила основным списком компонентов. Но для шаблонов и модулей, не было никакого основного списка установленных расширений, поэтому разработчикам раз за разом приходилось обращаться к сканированиям папок . Joomla 1.6 решает эту проблему, представляя jos_extensions таблицу. Эта таблица объединяет jos_components и jos_plugins таблицы, и добавляет метаинформацию обо всех других установленных типах расширений: модулях, шаблонах и плагинах.

Следующие примеры запросов Вы можете использовать на практике. Отметьте, что запросы используют новый класс JDatabaseQuery.

Получаем информацию о компонентах

Список всех компонентов Joomla 1.6

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
 ->from('#__extensions')
 ->where('type = '.$db->quote('components'))
 ->order('ordering');

Получаем информацию об одном компоненте
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
 ->from('#__extensions')
 ->where('type = '.$db->quote('components'))
 ->where('element = '.$db->quote('com_content'))
 ->order('ordering');

Получаем информацию об языках

Список всех установленных языков в  Joomla 1.6

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
 ->from('#__extensions')
 ->where('type = '.$db->quote('language'))
// Use client_id = 1 for backend packs
 ->where('client_id = 0')
 ->order('ordering');

Получаем информацию об одном установленном языке:
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
 ->from('#__extensions')
 ->where('type = '.$db->quote('language'))
 ->where('element = '.$db->quote('en-GB'))
// Use client_id = 1 for backend packs
 ->where('client_id = 0)
 ->order('
ordering');

Получаем информацию о библиотеках

Список всех библиотек Joomla 1.6

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
 ->from('#__extensions')
 ->where('type = '.$db->quote('library'))
 ->order('ordering');

Получаем информацию об одной библиотеке:
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
 ->from('#__extensions')
 ->where('type = '.$db->quote('library'))
 ->where('element = '.$db->quote('simplepie'))
 ->order('ordering');

Получаем информацию о модулях

Список всех frontend модулей Joomla 1.6

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
 ->from('#__extensions')
 ->where('type = '.$db->quote('modules'))
// Use client_id = 1 for backend modules.
 ->where('client_id = 0')
 ->order('ordering');

Получаем информацию об одном модуле:
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
 ->from('#__extensions')
 ->where('type = '.$db->quote('module'))
 ->where('element = '.$db->quote('mod_menu'))
// Use client_id = 1 for backend modules.
 ->where('client_id = 0');
 ->order('ordering');

Получаем информацию о плагинах

Список всех плагинов в группе в Joomla 1.6

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
 ->from('#__extensions')
 ->where('type = '.$db->quote('plugin'))
 ->where('folder = '.$db->quote('system'))
 ->order('ordering');

Получаем информацию об одном плагине:
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
 ->from('#__extensions')
 ->where('type = '.$db->quote('plugin'))
 ->where('folder = '.$db->quote('system'))
 ->where('element = '.$db->quote('redirect'))
 ->order('ordering');

Получаем информацию о темах

Список всех frontend шаблонов Joomla 1.6

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
 ->from('#__extensions')
 ->where('type = '.$db->quote('template'))
// Use client_id = 1 for backend templates.
 ->where('client_id = 0')
 ->order('ordering');

Получаем информацию об одном шаблоне:
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
 ->from('#__extensions')
 ->where('type = '.$db->quote('template'))
 ->where('element = '.$db->quote('com_content'))
// Use client_id = 1 for backend templates.
 ->where('client_id = 0')
 ->order('ordering');

Изменения в структуре базы данных для пользователей и групп

В Joomla 1.6 предоставляются действительно новые средства управления доступом, это функция номер один, которую требовало сообщество Joomla для этой версии, из-за этого много изменений в схеме базы данных было произведено.

Были добавлены новые таблицы, которые управляют новой системой управления доступом, это - jos_assets, jos_users, jos_usergroups, jos_usergroup_map, jos_viewlevels.

Важное изменение в таблице jos_users, в отличии от Joomla 1.5, было удалено поле 'gid', потому как теперь пользователь может состоять более чем в одной группе.

Получаем группу пользователя в Joomla 1.5

$db = JFactory::getDbo();
$db->setQuery(
 'SELECT g.value AS group_name'.
 ' FROM #__core_acl_groups AS g'.
 ' LEFT JOIN jos_core_acl_groups_aro_map AS grpMap ON grpMap.group_id = g.id'.
 ' LEFT JOIN jos_core_acl_aro AS aro ON aro.id = grpMap.aro_id'.
 ' WHERE aro.value = '.(int) $userId
);

Получаем группу пользователя в Joomla 1.6
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('g.title AS group_name')
 ->from('#__usergroups AS g')
 ->leftJoin('jos_user_usergroup_map AS map ON map.group_id = g.id')
 ->where('map.user_id = '.(int) $userId)
$db->setQuery($query);

Источник (англ. яз.)


Если у Вас возникли вопросы, то для скорейшего получения ответа рекомендуем воспользоваться нашим форумом

    You have no rights to post comments