В этой статье хочу рассмотреть работу с классом 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! Этот метод служит для удобной реализации публикации и снятия с публикации записей через панель управления админ частью сайта!