$with - id пользователя, с которым нужно сравнить значение поля checked_out. Если запись заблокирована как раз этим пользователем, то функция вернет false, как и в том случае, если она не заблокирована вообще. В обоих этих случаях текущий пользователь имеет право работать с ней; $against - id пользователя, использующийся, если функция вызвана как статическая.
Для блокировки записей используется метод
bool checkOut(int $userId, mixed $pk=null)
где:
$userId - id пользователя, блокирующего запись; $pk - первичный ключ записи, которую необходимо заблокировать. Если он не задан, используется значения соответствующего поля класса.
При этом в поле checked_out_time будет записано текущее время.
Для разблокировки записей используется метод bool checkIn(mixed $pk=null)
Рассмотрим пример использования этих методов:
$table->load($id); $user =& JFactory::getUser(); if ($table->isCheckedOut($user->get('id'))) die('Запись уже заблокирована другим пользователем'); echo 'Запись не заблокирована'; if (!$table->checkout($user->get('id'))) die('Не удалось заблокировать запись с id текущего пользователя'); echo 'Заблокировали запись'; // работа с записью... if (!$table->checkin($user->get('id'))) die('Не удалось разблокировать запись'); echo 'Разблокировали запись';
published
Значение поля published показывает, опубликована ли запись. Чтобы изменить значение этого поля для одной или нескольких записей, используется метод
bool publish(mixed $pks=null, int $state=1, int $userId=0)
где:
$pks - массив ключей записей, к которым необходимо применить операцию; $state - новое значение поля published (0 или 1); $userId - используется только когда в таблице существует также поле checked_out. При наличии в таблице этого поля метод publish() может быть применен только к тем записям, для которых checked_out равно 0 или заданному $userId.
Метод вернет true и в том случае, если какие-либо из записей были заблокированы и для них не удалось изменить значение published.
Пример использования этого метода:
$id_list = array($id); $user =& JFactory::getUser(); if (!$table->publish($id_list, 1, $user->get('id'))) die($table->getError());
hits
В поле hits хранится количество просмотров записи. Для увеличения этого значения на 1 используется метод
bool hit(mixed $pk=null)
где $pk - первичный ключ записи.
Например:
$table->hit();
Практика
Создание таблицы базы данных
Создайте таблицу для хранения вопросов, выполнив следующий SQL-запрос:
CREATE TABLE `jos_myquestions` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) NOT NULL, `date` DATETIME NOT NULL, `question` TEXT NOT NULL, `city` VARCHAR(50) NULL, `email` VARCHAR(50) NOT NULL, `IP` VARCHAR(15) NOT NULL, `id_cat` INT NOT NULL, `published` TINYINT(1) NULL DEFAULT '1', `expiration_date` DATETIME NULL DEFAULT '0000-00-00 00:00:00', `senttoexpert` TINYINT(1) NULL DEFAULT '0', `answer` TEXT NULL DEFAULT '', `senttoauthor` TINYINT(1) NULL DEFAULT '0' );
По умолчанию дата снятия вопроса с публикации имеет значение '0000-00-00 00:00:00'. Будем считать, что такая дата означает, что вопрос опубликован навсегда.
Для тестирования системы добавьте запись в таблицу, выполнив SQL-запрос:
INSERT INTO `jos_myquestions`(`id`, `name`, `date`, `question`, `city`, `email`, `IP`, `id_cat`) VALUES(NULL, 'Аноним', '2012-01-01 09:00:00', 'Есть ли жизнь на Марсе', 'Москва', '[email protected]', '12.345.67.890', '1')
Создание класса таблицы
Создайте в папке /administrator/components/com_myquestionsпапку tables. В этой папке создайте файл question.php:
Как видите, класс TableQuestion расширяет класс JTable. Каждому полю таблицы #__myquestions соответствует поле этого класса. Также перегружен конструктор __construct(), принимающий в качестве параметра объект-представитель базы данных и вызывающий родительский конструктор, используя название таблицы базы данных, первичный ключ и объект-представитель базы данных.
Создание формы для ответа на вопрос
Как и ранее, отделим HTML-вывод от логики обработки. PHP-код, необходимый для загрузки значений элементов формы, будет храниться в файле admin.myquestions.php, а код формы - в файле admin.myquestions.html.php. Откройте admin.myquestions.phpи замените его содержимое следующим кодом:
load($id); HTML_questions::replyToQuestion($row, $option); } ?>
Проверив, что код вызван из Joomla, мы используем выражение require_once(JApplicationHelper::getPath('admin_html')) для подключения файла admin.myquestions.html.php.
Затем с помощью JTable::addIncludePath() папка tables добавляется к списку директорий, в которых следует искать классы таблиц.
Переключатель switch() вызывает функцию, соответствующую значению переменной $task.