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