Абстрактный класс JTable — продолжение
Начало здесь
Если в delete() не указать идентификатор, то ID назначается из буфера. Методу canDelete() присущ всего один параметр – двухмерный массив, и проверка этим методом производится в том случае, если наша созданная запись в БД имеет похожие записи с иными таблицами БД. Внутри этого массива (canDelete() находятся ключи joinfield, name, idfield и label. Имя первого ключа – idfield. Имя внешнего ключа таблицы – joinfield, имя таблицы – name, Если похожих записей не найдено, то выводится сообщение «ошибка» при помощи ключа label, который описывает отношения между таблицами.
На нижеприведенном примере можно проверить наличие зависимости между записями таблиц #__myextension_mydata и #__myextension_children. Таблица #__myextension_children имеет ключи childid (первичный) и primary (внешний)
1 2 3 4 5 6 7 8 9 10 11 12 13 | $join1 = array('idfield' => 'childid', 'name' => '#__myextension_children', 'joinfield' => 'parent', 'label' => 'Children'); $joins = array($join1); if ($table->canDelete($id, $joins)) { if (!$table->delete($id)) { // Ошибка } } |
Для определения еще нескольких межтабличных связей можно применить следующий прием:
1 2 3 4 5 6 7 8 9 | $join1 = array('idfield' => 'childid', 'name' => '#__myextension_children', 'joinfield' => 'parent', 'label' => 'Children'); $join2 = array('idfield' => 'ichildid', 'name' => '#__myextension_illegitimate_children', 'joinfield' => 'parent', 'label' => 'illegitimate Children'); $joins = array($join1, $join2); |
Как управлять зарезервированным полем
При помощи класса JTable можно управлять зарезервированными полями. Для осуществления или снятия публикации можно применить метод publish(). При наличии в таблице поля checked_ out запись сторонним пользователем не редактируется. Пример ниже:
1 2 3 4 5 6 | $publishIds = array($id); $user =& JFactory::getUser(); if (!$table->publish($publishIds, 1, $user->get('id'))) { // Ошибка } |
Hits
Сделать инкремент записи можно, применив метод hit(). Инкремент – это увеличение переменной на единицу. В качестве примера устанавливается идентификатор записи и выполняется инкремент
1 2 | $table->set('id', $id); $table->hit(); |
В параметре hit() можно указать тот идентификатор, который нам нужен
1 | $table->hit($id); |
Checking Out
Прежде, чем блокировать запись, нужно удостовериться, что она не блокирована прежде. Блокировка необходима для того, чтобы несколько пользователей одновременно не работали с одной и той же записью. Методом isCheckOut() можно проверить наличие блокировки:
1 2 3 4 5 6 | $table->load($id); $user =& JFactory::getUser(); if ($table->isCheckedOut($user->get('id'))) { // Действия выполняются в случае блокировки } |
Блокировка записи для пользователя:
1 2 3 4 5 6 | $table->load($id); $user =& JFactory::getUser(); if (!$table->checkout($user->get('id'))) { // Ошибка } |
Обработка записи:
1 2 3 4 5 6 | <p align="justify">Обработка записи:</p>$table->load($id); $user =& JFactory::getUser(); if (!$table->checkin($user->get('id'))) { // Ошибка } |
Все эти премы действуют только для зарегистрированных посетителей.
Ordering
Чтобы создать список элементов в назначенном порядке, можно пользоваться несколькими методами. Первый — reorder(). Он создает правильное расположение записей и исправляет ошибки.
1 | $table->reorder(); |
Если таблица более сложная в построении, то используется дополнительный параметр. Для примера представим поле group. В первой (1) группе упорядочиваем записи следующим методом:
1 2 3 | $db =& $table::getDBO(); $where = $db->nameQuote('group').' = 1'; $table->reorder($where) |
Второй метод — getNextOrder(). Результат работы этого метода – очередная запись в том порядке, который мы определили. Как и в предыдущем варианте, можно определять группы. Например:
1 2 3 | $db =& $table::getDBO(); $where = $db->nameQuote('group').' = 1'; $nextPosition = $table->getNextOrder($where); |
Третий, и последний метод — move(). Перемещает записи на одну позицию вниз или вверх. Пример перемещения вверх:
1 2 3 4 | $db =& $table::getDBO(); $where = $db->nameQuote('group').' = 1'; $table->load($id); $table->move(1, $where) |
Как видите, сохраняется возможность определения групп.
Поле параметров
Класс JParameter применим для обработки параметров INI. Так как в JTable специальных способов для управления параметрами не существует, то создаем объект JParameter и обработать его
1 | $params = new JParameter($table->params); |
После получения доступа к параметрам можно применять get() и set() для изменения параметров
1 2 | $value = $params->get('someValue'); $params->set('someValue', ++$value); |
Методом toString() можно получить INI строку
1 | $table->params = $params->toString(); |
Можно даже самостоятельно создать строку параметра, для этого указываются путь к файлу XML и непосредственно параметры
1 | $params = new JParameter('foo=bar', $pathToXML_File); |
Вывод на экран:
1 | echo $params->render('params'); |
Поле даты
Сохраняя дату, необходимо следить за ее форматом. Для БД дата сохраняется в таком виде: YYYY-MM-DD HH:MM:SS. Методом JDate это сделать проще всего. Чтобы привести дату к правильному выводу, применяется метод toMySQL().
1 2 3 4 5 6 7 8 9 | // import JDate class jimport('joomla.utilities.date'); // Текущая дата $myDate = gmdate(); // Новая дата JDate // Для joomla версии 1.5.0 - $jdate = new JDate($myDate); $jdate = & JFactory::getDate($myDate); // Создание запроса toMySQL() $query = 'SELECT * FROM #__example WHERE date < '.$jdate->toMySQL(); |
Где $ toMySQL() – дата в UNIX.
Оцените статью по 5-бальной шкале: