Большая часть данных из Joomla хранится в базе данных. После установки Joomla создает 35 таблиц. Некоторые из этих таблиц принадлежат различных расширениям ядра Joomla.
Для начала получим доступ к базе данных Joomla с помощью глобального объекта JDatabase. JDatabase - это абстрактный класс, который позволяет работать с различными драйверами баз данных. На данный момент Joomla содержит только два драйвера - MySQL и MySQLi. Получим доступ к глобальному объекту JDatabase используя JFactory:
Префикс
Все таблицы в базе данных имеют префикс, по-умолчанию jos_, который помогает сохранять в одной базе данных несколько установок Joomla. Когда мы пишем SQL запросы, то мы используем символический префикс, который заменяется во время выполнения. По-умолчанию символический префикс - это #__, но мы можем использовать любые символы, если нам это нужно.
Схема соглашений
Когда мы создаем таблицы для своих расширений, мы должны придерживаться некоторых стандартов. Самое важное - это правильное именование таблиц. Все названия таблиц должны начинаться с префикса и содержать вначале имя расширения. Если таблиц у расширения несколько, то мы добавляем в имени таблицы после названия расширения символ подчеркивания "_" и пишем дополнительное произвольное название. Например таблица для компонента "My Еxtensions" может быть названа #__myextension_items.
Имена таблиц должны быть в нижнем регистре и только по необходимости разделяться символом подчеркивания.
Например, вы можете назвать поле хранящее адрес почты как email. Если вы имеете первичное и вторичное поле email (primary и secondary), то вы должны назвать поля email и email_secondary; неправильно будет называть первичное поле email_primary. Если у вас имеется ключевое поле ID, то оно обязательно должно быть типа integer, автоинкрементное и с не иметь пустого значения.
Общепринятые поля таблицы
Мы можем использовать несколько зарезервированных полей в нашей таблице. Используя эти поля, мы получаем над ними дополнительное управления с помощью фрэймворка Joomla. Как этим пользоваться будет написано ниже (с помощью класса JTable).
Итак, это поля:
Publishing - поле указывает, опубликован ли элемент, или нет. Имеет тип tinyint(1) и два значения 0 - неопубликован, 1 - опубликован.
Hits - отображает сколько обращений было к записи. Имеет тип integer и значение по-умолчанию 0.
Checking Out - на случай если запись могут редактировать несколько пользователей, мы можем блокировать ее с помощью этого поля. Для этого используется два поля checked_out и checked_out_time. checked_out имеет тип integer и содержит ID пользователя обратившегося к записи. checked_out_time имеет тип datetime и содержит дату и время обращения пользователя к записи. Если дата содержит значение null и id пользователя равен 0, то запись не заблокирована.
Ordering - нам часто будет нужно разрешить администратору указать по какому полю произвести сортировку. Поле ordering имеет тип integer, и может быть использовано для указания количества записей участвующих в сортировке и выводимых на экран. Это поле необязательно должно быть уникальным, и может быть использовано в запросе WHERE.
Parameter Fields - мы часто будем использовать поле параметров, по-умолчанию названное params и имеющее тип TEXT, для сохранения дополнительной информации о записях. Данные хранящиеся в этих полях закодированы как INI строки (которые мы обрабатываем в дальнейшем с помощью класса JParameter). Перед тем как использовать поле параметров, мы должны выбрать данные которые нужно хранить в нем. Данные должны соответствовать следующим критериям:
Пример схемы
Таблица нарисована для расширения названного 'My Extension' и записей названных обобщенно foobar. Имя таблицы будет #__myextension_foobars.
Поле |
Тип |
NOT NULL |
AUTO INC |
UNSIGNED |
По-умолчанию |
id |
INTEGER |
+ |
+ |
+ |
NULL |
content |
TEXT |
+ |
|
|
|
checked_out |
INTEGER |
+ |
|
+ |
0 |
checked_out_time |
DATETIME |
+ |
|
|
0000-00-00 00:00:00 |
params |
TEXT |
+ |
|
|
|
ordering |
INTEGER |
+ |
|
+ |
0 |
hits |
INTEGER |
+ |
|
+ |
0 |
published |
TINYINT(1) |
+ |
|
+ |
0 |
Эта таблица использует все зарезервированные поля и одно автоинкрементное ключевое поле ID.
SQL запрос который создаст таблицу описанную в схеме выше:
CREATE TABLE '#__myextension_foobars' (
'id' INTEGER UNSIGNED NOT NULL DEFAULT NULL AUTO_INCREMENT,
'content' TEXT NOT NULL DEFAULT '',
'checked_out' INTEGER UNSIGNED NOT NULL DEFAULT 0,
'checked_out_time' DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
'params' TEXT NOT NULL DEFAULT '',
'ordering' INTEGER UNSIGNED NOT NULL DEFAULT 0,
'hits' INTEGER UNSIGNED NOT NULL DEFAULT 0,
'published' INTEGER UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY('id')
)
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
Поля даты
Очень часто используется поле типа datetime, хранящее дату и время некоторого события. Когда мы используем это поле, очень важно знать про эффект временных зон. Все даты и время должны быть сохранены в нулевом поясе UTC+0 (GMT / Z).
А уже при выводе на экран используем класс JDate.
Многоязычные требования
В кодировке UTF-8 количество бит на символ от 8 и более. К сожалению в MySql версиях до 4.1.2, один символ всегда занимает один байт, что вызывает некоторые проблемы. Единственное решение - это создать различные файлы sql запросов для различных версий MySql-серверов, поддерживающих и не поддерживающих кодировку UTF-8
Для MySql не поддерживающих данную кодировку мы должны задать увеличенный размер полей. Например, для поля varchar(20) лучше задать размер varchar(60). Размер поля увеличен в три раза, потому что большинство символов в кодировке UTF-8 занимают максимум 3 байта.
Но например поле varchar(100) мы должны были бы увеличить в три раза и получить varchar(300). Но это невозможно, так как максимальный размер - varchar(255). Единственный выход - это задать тип TEXT.
Для примера, ядро Joomla содержит таблицу #__content, хранящее поле title. Для MySql поддерживающих UTF-8 поле определяется как
а для не поддерживающих
Компьютерная помощь
Ремонт компьютеров
Ремонт ноутбуков
Заправка картриджей