Структура базы данных Joomla оставалась относительно постоянной, с тех пор как Joomla 1.0 была запущена в 2005. И вот после шести лет пришло время реорганизовать структуру, устранить мночисленные проблемы сдерживающие развитие Joomla, и подготовить основу на следующие пять или шесть лет разработки.
Использование нового JDatabaseQuery класса в Joomla 1.6
Для лучшей в будущем поддержки других баз данных, таких как MongoDB, MSSQL, и др., Joomla 1.6 предоставляет новый класс конструктора запросов. Этот класс позволяет Вам создавать запросы в порядке, которые имеют смысл для разработчиков, а не в строгом формате SQL. Ниже пример того, на что похож запрос в Joomla 1.5 и как это преобразовывается в Joomla 1.6. Используя класс запроса, Вы можете встроить много условных элементов в запросы программно аккуратным способом.Построение SQL запроса в Joomla 1.5
$db->setQuery(
'SELECT *'.
' FROM #__articles'.
' WHERE state = '.(int) $published.
' AND catid = '.(int) $categoryId.
' ORDER BY created DESC'
);
Альтернативный способ построения запроса в Joomla 1.6
$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
$query = $db->getQuery(true);
$query->select('*')
->from('#__extensions')
->where('type = '.$db->quote('components'))
->order('ordering');
Получаем информацию об одном компоненте
$query = $db->getQuery(true);
$query->select('*')
->from('#__extensions')
->where('type = '.$db->quote('components'))
->where('element = '.$db->quote('com_content'))
->order('ordering');
Получаем информацию об языках
Список всех установленных языков в Joomla 1.6
$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');
Получаем информацию об одном установленном языке:
$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
$query = $db->getQuery(true);
$query->select('*')
->from('#__extensions')
->where('type = '.$db->quote('library'))
->order('ordering');
Получаем информацию об одной библиотеке:
$query = $db->getQuery(true);
$query->select('*')
->from('#__extensions')
->where('type = '.$db->quote('library'))
->where('element = '.$db->quote('simplepie'))
->order('ordering');
Получаем информацию о модулях
Список всех frontend модулей Joomla 1.6
$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');
Получаем информацию об одном модуле:
$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
$query = $db->getQuery(true);
$query->select('*')
->from('#__extensions')
->where('type = '.$db->quote('plugin'))
->where('folder = '.$db->quote('system'))
->order('ordering');
Получаем информацию об одном плагине:
$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
$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');
Получаем информацию об одном шаблоне:
$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->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
$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);
Источник (англ. яз.)
Если у Вас возникли вопросы, то для скорейшего получения ответа рекомендуем воспользоваться нашим форумом
Подробнее...