Створення Model-View-Controller компонента частина 3 – Використання бази даних

Введення
У перших двох частинах ми показали, як можна зробити простий компонент на основі схеми MVC. У нас був просте уявлення, яке отримувало дані з моделі (вона була створена у другій частині). У цій частині ми будемо працювати тільки з моделлю. Замість даних жорстко прописаних в моделі, ми будемо отримувати їх з таблиці бази даних з допомогою класу JDatabase.
Отримання даних
Зараз у нашій моделі є тільки один метод: getGreeting(). Це дуже простий приклад – все що він робить це повертає жорстко прописаний код.
Щоб зробити наш приклад більш цікавим, ми будемо завантажувати привітання з бази даних. Пізніше ми покажемо, як створити SQL файл і додати код в xml файл, щоб при установці компонента була створена і заповнена потрібна таблиця. Поки ми просто змінимо функцію, яка повертає привітання так щоб вона отримувала його з бази даних.
Спочатку треба отримати посилання на базі. Починаючи з Joomla, використання бази даних є звичайною процедурою. З’єднання з базою вже існує, тому немає необхідності створювати своє. Посилання на існуючу базу може бути отримана наступним чином:
$db =& JFactory::getDBO();
Jfactory – це статичний клас, який використовується для отримання посилань на багато об’єкт системи. Більш детальну інформацію про цьому класі можна отримати тут. Назва методу (getDBO) походить від get Object DataBase щоб його було легко запам’ятати. Щоб отримати запис з бази даних нам треба зробити два кроки:
1. зберегти наш запит в об’єкті бази даних;
2. завантажити результат
Наша нова функція getGreeting() буде виглядати так:
function getGreeting()
{
$db =& JFactory::getDBO();
$query = ‘SELECT greeting FROM #__hello’;
$db->setQuery( $query );
$greeting = $db->loadResult();
return $greeting;
}
hello це ім’я таблиці, яку ми створимо пізніше. greeting це назва поля, що зберігає наші вітання. Якщо ви не знайомі з SQL, то буде корисно почитати якісь керівництва або уроки по цій темі.
Метод $db->loadResult() збереже запит і поверне з бази даних першу колонку, і рядок в ній. Для отримання додаткової інформації по об’єкту JDatabase зверніться до цієї статті.
Створення інсталяційного SQL файлу
Joomla має вбудовану підтримку виконання запитів під час установки компонента. Ці запити зберігаються в звичайному текстовому файлі.
У наш інсталяційному файлі буде три запиту: спочатку ми знищимо таблицю, якщо вона існує, потім створимо нову таблицю, а потім вставимо в неї дані.
Ось наші запити:
DROP TABLE IF EXISTS `#__hello`;
CREATE TABLE `#__hello` (
`id` int(11) NOT NULL auto_increment,
`greeting` varchar(25) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
INSERT INTO `#__hello` (`greeting`) VALUES (‘Hello, World!’),
(‘Bonjour, Monde!’),
(‘Ciao, Mondo!’);
В імені таблиці ви можете знайти незвичайний префікс. Joomla замінить його на поточний префікс системи. За замовчуванням наша таблиця буде називатися jos_hello. Префікс дозволяє багаторазово встановлювати Joomla, використовуючи одну і ту ж базу даних і уникнути колізій, пов’язаних з використанням таблиць з однаковими іменами, тобто два додатки можуть використовувати одну і ту ж базу даних.
У наш таблиці є два поля. Перше це поле id, він є первинним ключем. Первинний ключ таблиці – це поле, яке використовується як унікальний ідентифікатор запису. Він також часто використовується для пошуку рядків у базі даних. Інше поле – greeting. У ньому зберігаються привітання, які буде повертати наш запит.
Тексти наших запитів будуть зберігатися в файл install.sql
Створення файлу uninstall.sql
І хоча ми сподіваємося на те, що люди ніколи не видалять наш компонент, але все ж якщо вони зроблять це, ми не повинні нічого залишати після себе. Joomla контролює видалення всіх створених папок і файлів, але нам треба вручну включити запити, які буду видаляти, створені нами таблиці з бази даних. На даний момент ми створили лише одну таблицю. Та нам потрібен лише один запит:
DROP TABLE IF EXISTS `#__hello`;
Оновлення інсталяційного файлу
Нам потрібно внести деякі зміни в інсталяційний файл. По-перше, треба додати два нових файлу в список. Файл install.sql повинен перейти в папку admin. По-друге, ми повинні вказати инсталлеру виконати запити в наших файлах при інсталяції та деінсталяції.
Оновлений код виглядає наступним чином:


Hello
2007-02-22
John Doe
john.doe@example.org

Copyright Info
License Info
3.01
Description of the component …


controller.php
hello.php
index.html
models/hello.php
models/index.html
views/index.html
views/hello/index.html
views/hello/view.html.php
views/hello/tmpl/default.php
views/hello/tmpl/index.html
install.sql

DROP TABLE IF EXISTS `#__hello`;
CREATE TABLE `#__hello` (
`id` int(11) NOT NULL auto_increment,
`greeting` varchar(25) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0;
INSERT INTO `#__hello` (`greeting`) VALUES (‘Hello, World!’),
(‘Bonjour, Monde!’),
(‘Ciao, Mondo!’);
uninstall.sql

DROP TABLE IF EXISTS `#__hello`;
Hello World!

hello.php
index.html
install.sql
uninstall.sql
Як ви могли помітити, у тега , який знаходитися в секціях є два атрибути: charset і driver. Charset це кодування файлу. Зазвичай використовується utf-8. Але якщо ви хочете створити інсталяційні файли в інший кодуванні (наприклад, для старих версій MySQl) ви повинні пропустити цей атрибут.
Атрибут driver вказує для якої бази даних написані запити. В даний час в якості бази даних може бути використана тільки MySql, але в майбутньому передбачається створити драйвера і для інших баз даних.
Висновок
Тепер наш компонент, може працювати не тільки з класами MVC framework, але і з класами JDatabase. Тепер ви можете створювати компоненти , які взаємодіють з базою даних і можете використовувати Joomla інсталятор для створення і заповнення таблиць бази даних.
Стаття тут і
тут