- JTableARO
- JTableAROGroup
- JTableAsset
- JTableCategory
- JTableComponent
- JTableContent
- JTableMenu
- JTableMenuTypes
- JTableModule
- JTableNested
- JTablePlugin
- JTableSection
- JTableSession
- JTableTree
- JTableUser
По названиям классов видно, что классы полезные, но нам нужно сначала разобраться с JTable. Интересную статейку надыбал на joomlapedia.ru
Примечание: Источником является материал How to use the JTable class.
Содержание[убрать] |
Создание собственного JTable подкласса
Класс
Jtable используется в Joomla! для работы с записями таблицы базы данных. Он позволяет нам выполнять все основные функции по работе с таблицей - CRUD (Create Read Update Delete).Для использования
JTable необходимо расширить этот класс. В нашем примере мы используем таблицу рецептов:defined('_JEXEC') or die(); class TableRecipes extends JTable { var $id = null; var $ingredients = null; var $instructions = null; var $serves = null; var $difficulty = null; var $prep_time = null; var $cook_time = null; var $published = 0; function __construct(&$db) { parent::__construct( '#__recipes', 'id', $db ); } }
Название класса должно содержать слово 'Table', продолжением которого служит название таблицы (с большой буквы). Все свойства класса должны совпадать с полями таблицы. Значения по умолчанию должны совпадать со структурой таблицы. Например, если у нас есть колонки
NOT NULL, мы должны использовать значения по умолчанию отличные от 'null'.Далее необходимо определить конструктор, и вызвать в нем конструктор родительского класса. В качестве параметров мы передаем имя нашей таблицы, имя поля первичного ключа, и экземпляр объекта базы данных. В имени таблицы не забывайте использовать
#__ вместо jos_, для того чтобы администратор мог выбрать любой префикс таблицы во время установки Joomla!.Если бы мы использовали этот класс как составную часть компонента 'Recipes', то поместили бы этот код файл
/administrator/components/com_recipes/tables/recipes.php.Использование
Как только класс на месте, мы можем использовать его в расширениях Joomla!. Для включения файла, поместите следующую строчку в код Вашего расширения (используйте
com_названиевашегокомпонента вместо com_recipes):JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_recipes'.DS.'tables');
Теперь у нас есть возможность инстанцировать объект (создавать экземпляр нашего класса):
$row = &JTable::getInstance('recipes', 'Table');
Обратите внимание на то, что мы используем имя суффикса нашего класса маленькими буквами в качестве первого параметра, и префикс 'Table' в качестве второго. Также метод
getInstance() класса JTable/ возвращает объект по ссылке, а не по значению (для этого используем синтаксис =&).В классах модели (которые расширяют
JModel) Вы можете также использовать:$row = &$this->getTable('recipes');
Обратите внимание, что если Вы не использовали стандартное соглашение названий, Вы можете в качестве необязательного второго параметра передать префикс класса.
Создание/Обновление (Create/Update)
В обычной ситуации, у Вас есть HTML форма для отправки данных пользователем. Данные из формы приходят в виде ассоциативного массива. У класса
JRequest в Joomla! есть методы, которые помогают в получении этих данных в безопасном режиме. Используйте JRequest::get('post') для получения всех HTTP POST элементов в виде безопасного массива (sanitized array).Как только мы получили этот массив, мы можем передать его в
JTable метод bind(). Таким образом, мы сопоставляем элементы массива со свойствами класса. В следующем примере мы получаем массив из JRequest::get('post') и сразу же передаем в bind():if (!$row->bind(JRequest::get('post'))) { return JError::raiseWarning(500, $row->getError()); }
Если
bind() не исполнится, мы останавливаем приложение и получаем ошибку, перед тем как наше расширение попытается отправить данные. Метод raiseWarning() классаJError позволяет нам остановить Joomla!, в то время как метод getError() возвращает ошибку, которая хранится в объекте JTable.Если привязка (bind) прошла успешно и наш объект готов, вызываем метод
store(). И снова, если что-то пойдет не так, останавливаем приложение и поясняем почему:if (!$row->store()) { JError::raiseError(500, $row->getError()); }
Примечания:
- Если какое-то из свойств Вашего
JTableобъекта имеет значениеnullкогда вызывается методstore(), они игнорируются по умолчанию. Это позволяет Вам обновлять определенные колонки таблицы и оставлять другие нетронутыми. Если Вы хотите переопределить такое поведение и быть уверенными в том, что все колонки получат значения, то передайтеtrueв методstore(). - Методы
JTable::bind()иJRequest::get()не форсируют типы данных. Если Вы хотите, чтоб колонка имела конкретный тип данных (например, integer), то Вам необходимо добавить требуемую логику перед вызовом методаstore(). - Если
idу нас 0, то будет создана новая запись (INSERT), в противном случае существующая запись будет обновлена (UPDATE).
Если Вы захотите произвести проверку данных (перед сохранением в базе), то Вы можете это сделать переопределив метод
check():function check() { if(!$this->ingredients) { $this->setError(JText::_('Не указаны ингредиенты')); return false; } return true; }
Если метод вернул значение false, то используем метод
setError() для пояснения ошибки. Метод check() необходимо расположить в нашем JTable классе.Чтение (Read)
Для загрузки конкретной записи, просто передайте ключ в метод
load().$row->load($id);
Этот ключ соответствует тому, что Вы указали в качестве второго параметра в конструкторе
parent::__construct(), когда расширяли JTable.Удаление (Delete)
Метод
delete() позволяет Вам удалять конкретную запись в таблице, основываясь на ключе, который Вы передаете в метод:$row->delete($id);
Если Вы хотите удалить несколько записей одновременно, то Вам придется написать отдельный запрос вручную.
Писал свой набор классов, который основывался на похожем классе(на основе такого класса было всё, а не только ДБ). Так там клас Базы данных расширял его так, что не приходилось писать запросы вовсе (гибкие функции были), даже если была выборка по нескольким таблицам.. Ну может только очень сложные запросы приходилось писать. А здесь даже нету limit, т.е. мне в любом случае надо получать все записи из таблицы?? это очень плохо. Поэтому я не удовлетворен. Надеюсь найду информацию, как можно лучше использовать JTable. Хотя в расширяющем классе можно колдовать =)
Возможно пока этого хватит.. будет нужно больше - буду дополнять
просто копипаст ? а осветить метод check и другие не описанные подробно в статье источнике можно?
ОтветитьУдалитьPlay casino games for money at JV Casino UK - MJHub
ОтветитьУдалитьPlay casino 성남 출장마사지 games online at JV Casino UK with JV 고양 출장샵 Casino for Real Money. 광명 출장샵 Sign up for a 서귀포 출장마사지 free account and get latest bonus codes for online 사천 출장샵 casinos