Блог

Категории:  

Программирование → Работа с базами данных в модели компонента Joomla 1.5
09.06.2010

Поскольку Joomla 1.5 — полноценный фреймворк, в ней предусмотрен ряд функций, призванных облегчить работу пользователя с базой данных.

При создании MVC компонента для Joomla 1.5 в модели уже есть встроенные функции для работы с базой данных, поэтому не нужно, как раньше, объявлять объект базы данных: $db = & JFactory::getDBO();

Рассмотрим несколько примеров по работе с базой данных.

1
$result = $this->_getList($query, $limitstart, $limit); 

В эту функцию передаются три параметра — запрос, с какой строки начать выборку и сколько строк выбирать. То есть, вызов функции: $this->_getList($query, 10, 20); будет аналогом в SQL - LIMIT 10, 20 (собственно, такой код и подставляется к запросу). Данные будут получены в виде массива объектов, где полями объекта будут названия ячеек таблицы, а значением — значение ячейки текущей строки. Например, чтобы вывести в цикле все имена, можно написать так:

1
2
3
foreach ($result as $item){
echo $item->name;
}

функцией _getList() можно делать выборку по составленному вами запросу $query. Для того, чтобы в модели сделать запрос, например, на удаление, нужно использовать следующий способ:

1
2
$this->_db->setQuery($query);
$this->_db->query();

 

В Joomla 1.5 существует еще один способ работы с базой данных — это создание объектной модели таблицы. Работает этот способ только с единственной записью из базы данных, и он очень удобен для редактирования, удаления, отображения и обновления одной записи (например, отображения конкретной записи блога). Для того, чтобы создать такую модель таблицы, нужно в backend (административной) части сайта в вашем компоненте добавить папку tables, и в ней создать файл следующего содержания:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//проверка доступа 
defined( '_JEXEC' ) or die( 'Restricted access' );
//создаем свой класс таблицы TableItem который наследуется от класса JTable
//обратите внимание что класс должен называтся TableНазвание_файла_с_табличкой
//естественно файл мы должны назвать как item.php
class TableItem extends JTable{
//ключевое поле
var $id = null;
//некое поля
var $name = null;
//конструктор
function __construct( &$_db ){
//тут мы должны передать три параметра
//1. имя таблицы с префиксом #__item
//тоесть если у вас префикс jos_ то в БД таблица будет jos_item
//2. ключевое поле
//3. ссылка на базу данных
parent::__construct( '#__item', 'id', $_db );
}
//функция для проверки данных (если вам данные не нужно проверять можете её не писать)
//возвращает true в случае если все данные проверены
function check(){
if($this->name === ""){
return false;
}
return true;
}
}

 

Поля такого класса должны точно совпадать с названиями полей в таблице базы данных.

Итак, как же работать с такой таблицей в модели:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Получаем объект таблицы, в параметры указываем имя файла с таблицей
$table = $this->getTable("item");
//загрузить строку с $id таким то (например переданным вами по ссылке)
$table->load($id);
//установка данных из POST формы
$table->bind(JRequest::get('post'));
//удалить строку с с $id таким то (например переданным вами по ссылке)
$table->delete($id);
//проверяем или все данные установленны
if($table->check()){
//сохраняем данные в базу данных
if($table->store()){
 
}
}

Теперь рассмотрим все функции.

Функция load() — загружает в наш класс строку по $id, и теперь, обращаясь к полю $table->name, мы можем получить то, что записано в поле строки с выбранным $id. Мы можем изменить эту строку и сохранить в базе данных.

Для сохранения данных существует функция store() — эта функция булевого типа, она возвращает true, если зарос выполнен успешно.

Функция check() — это пользовательская функция, в ней мы можем создать условия для проверки данных.

Функция delete() выполняет удаление строки по заданному идентификатору.

Функция bind() выполняет установку данных по полям таблицы. То есть, если у нас пришла форма с id и name переменными, то функция bind() фактически выполнит:

1
2
$table->id 	= $_POST['id'];
$table->name = $_POST['name'];

Естественно, если полей много, ею удобно пользоваться. Важно знать, что если вам нужно запрограммировать логику установки какого-то определенного поля, то эту логику нужно писать после функции bind(). Например, вы передаете текстовое поле в админке, и при передаче есть HTML теги. Эти теги удалятся функцией bind, поэтому необходимо принять строку специальным способом, и занести в поле таблицы:

1
2
3
4
5
$table 		= $this->getTable("item");
$table->bind(JRequest::get('post'));
$text = JRequest::getVar( 'text', '', 'post', 'string', JREQUEST_ALLOWRAW );
$text = str_replace( '
'
, '
'
, $text );

$table->text = $text;

 


Автор: Денеж Александр
Теги: