В этой статье хочу рассмотреть работу с классом JTable который реализует шаблон проектирование Active Record, и является популярным способом доступа к базе данных в ООП стиле!
Каждый такой класс представляет таблицу в нашей базе данных, каждый объект такого класса является строкой в этой таблице

Например используя такой код мы можем вставить в таблицу #__content данные:

 

$table = $this->getTable('content'); 
$table->title = 'Моя запись';
$table->introtext = 'Вступительный текст';
$table->fulltext = 'Полный текст';
$table->store();

 

Создавать такие таблицы мы можем для компонентов, и использовать его можем в любой модели нашего компонента.
Размещать файл с классом нужно по адресу:
administrator/components/ваш_компонент/tables/

Класс с табличкой должен иметь имя Tableимя_файла и наследоваться от класса JTable
То есть допустим если мы создадим файл content.php то класс должен иметь такой вид:

 

defined( '_JEXEC' ) or die;
jimport( 'joomla.database.table' );
class TableContent extends JTable{
...
}

 

Внимание! в Joomla 3+ не нужно использовать директиву jimport( 'joomla.database.table' );

Далее мы должны в классе описать конструктор класса в котором будет указано с какой табличкой мы работаем и уникальное поле с атрибутом auto_increment (обычно это id)

 

 

defined( '_JEXEC' ) or die;
jimport( 'joomla.database.table' );
class TableContent extends JTable
{
 function __construct( & $db )
 {
 //первый параметр имя таблицы
 //второй параметр имя уникального поля с атрибутом auto_increment
 parent::__construct( '#__content', 'id', $db );
 }
}

 

 

Что бы получить экземпляр класса TableContent в любом месте y нашей модели написать достаточно написать:

 

$table = $this->getTable('content');

 

Какие методы мы можем использовать для работы с объектом базы данных?

Во первых мы в объект $table можем загрузить строку с любым идентификатором который есть в таблице #__content:

 

$table = $this->getTable('content'); // получаем объект класса TableContent
$table->load(10); //Загружаем строку с id = 10
echo $table->title; //выводим содержимое поля title в строке c id = 10

 

Для того что бы создать какую то запись мы должны вызвать такой код:

 

$table = $this->getTable('content'); // получаем объект класса TableContent
$table->title = 'Моя запись'; //вносим какие то данные в поле title
$table->introtext = 'Вступительный текст'; //вносим какие то данные в поле introtext
$table->fulltext = 'Полный текст'; //вносим какие то данные в поле fulltext
$table->store(); //выполняем вставку данных в таблицу

 

Метод store возвращает true если сохранение в табличку записи успешно! и false при ошибке сохранения!

После вставки данных в табличку в поле id нашего объекта запишется id текущей строки в таблице. Это удобно если вы хотите вставить какие то данные в другую табличку и вам нужно в каком то поле второй табличке указать идентификатор первой таблицы!

Притом если мы хотим не создать новое поле, а обновить уже созданное поле то нам достаточно указать идентификатор строки в табличке в котором производить обновление:

 

$table = $this->getTable( 'content' ); // получаем объект класса TableContent
$table->id = 10; //выбираем строку для обновления
$table->title = 'Моя запись'; //вносим какие то данные в поле title
$table->introtext = 'Вступительный текст'; //вносим какие то данные в поле introtext
$table->fulltext = 'Полный текст'; //вносим какие то данные в поле fulltext
$table->store(); //выполняем вставку данных в таблицу

 

Для удаления какой то строки из таблички вы можете использовать такой код:

 

$table = $this->getTable( 'content' ); // получаем объект класса TableContent
$table->remove(10); //удаляем строку с id=10

 

Так же в этом классе есть метод для автоматической расстановки элементов по полям нашей таблицы:

 

$data = array( 'title' => 'Моя запись',
 'introtext' => 'Вступительный текст',
 'fulltext' => 'Полный текст' );
$table = $this->getTable( 'content' ); // получаем объект класса TableContent
$table->bind( $data ); //устанавливаем данные в поля
$table->store(); //сохраняем данные
 
//мы также можем использовать данные полученные из $_REQUEST
//Притом что будут установлены только те поля которые присутствуют в таблице
//то есть если в $_REQUEST есть элемент name, а в таблице его нет то он не будет использоваться
$table = $this->getTable( 'content' ); // получаем объект класса TableContent
$table->bind( $_REQUEST ); //устанавливаем данные в поля
$table->store(); //сохраняем данные

 

Внимание! Использование $_REQUEST не желательно в ваших проектах из-за возможности внести данные которые могут осуществить ту или иную уязвимость! Для того что бы обезопасить пользовательской ввод используйте класс JInput

В классе нашей таблички вы можете переопределить метод bind что бы установить свои условия вноса данных, например если у вас не указанна дата в записи, то можем автоматически указать что бы записывалась дата создания записи:

 

defined( '_JEXEC' ) or die;
jimport( 'joomla.database.table' );
class TableContent extends JTable
{
 function __construct( & $db )
 {
 parent::__construct( '#__content', 'id', $db );
 }
 public function bind( $array, $ignore = '' )
 {
 if ( empty( $array['created'] ) ) {
 $array['created'] = date( 'Y-m-d H:i:s' );
 }
 return parent::bind( $array, $ignore );
 }
}

 

 

Дополнительные методы класса JTable:
echo $table->getTableName() - вернет название текущей таблицы
echo $table->getKeyName() - вернет название ключевого поля
$table->hit(10); - выполнит увеличение значения в поле hit записи c id=10 на один
$table->publish(10, 1); - выполняет запись в поле published записи с id=10! Этот метод служит для удобной реализации публикации и снятия с публикации записей через панель управления админ частью сайта!