Разрботка расширений для CMS Joomla - Страница 10
Функция HTML_questions::replyToQuestion() выводит на экран уже заполненную форму, значения элементов которой берутся из объекта $row. Форме присвоено название adminForm, чтобы к ней можно было обращаться из JavaScript.
Классы JHTML и JEditor будут рассмотрены позже. Сейчас поясним только те выражения, в которых используются методы этих классов:
echo JHTML::_('date', $row->date,JText::_('DATE_FORMAT_LC3')); выводит дату $row->date в формате DATE_FORMAT_LC3 (один из стандартных форматов, заданных в Joomla).
$editor =& JFactory::getEditor(); echo $editor->display('question', $row->question, '100%', '250', '40', '10'); отображает выбранный администратором HTML-редактор. Если не выбран ни один редактор, то будет отображено поле
echo JHTML::_('calendar', $row->expiration_date, 'expiration_date', 'expiration_date', '%Y-%m-%d'); выводит текстовое поле со значением $row->expiration_date и пиктограмму календаря, при нажатии на которую появляется календарь для выбора даты.
Перед закрывающим тегом выводятся три скрытые элемента. Первый из них хранит значение id записи, т.к. оно необходимо для дальнейшего сохранения отредактированного вопроса. Элемент option хранит название текущего компонента для правильного редиректа в дальнейшем. Третьему скрытому элементу, task, не присвоено значения, чтобы JavaScript-код панели инструментов мог изменять его до отправки формы.
Осталось добавить перевод ключей COM_MYQUESTIONS_AUTHOR, COM_MYQUESTIONS_DATE и др. Откройте файл /administrator/language/ru-RU/ru-RU.com_myquestions.iniи добавьте к его содержимому следующий код:
COM_MYQUESTIONS_AUTHOR="Автор" COM_MYQUESTIONS_DATE="Дата вопроса" COM_MYQUESTIONS_QUESTION="Текст вопроса" COM_MYQUESTIONS_CITY="Город" COM_MYQUESTIONS_EMAIL="e-mail" COM_MYQUESTIONS_IP="IP-адрес" COM_MYQUESTIONS_CATEGORY="Категория" COM_MYQUESTIONS_PUBLISHED="Отображать ли вопрос на сайте" COM_MYQUESTIONS_EXPIRATION_DATE="Дата снятия вопроса с публикации" COM_MYQUESTIONS_SENTTOEXPERT="Отправлен ли вопрос эксперту" COM_MYQUESTIONS_ANSWER="Ответ" COM_MYQUESTIONS_SENTTOAUTHOR="Отправлен ли ответ автору вопроса"
Обратите внимание, что мы не задали перевод для слов "Да" и "Нет", а использовали ключи JYES и JNO, т.к. подобные распространенные слова уже переведены в файле /administrator/language/ru-RU/ru-RU.ini.
Наберите в адресной строке браузера ссылку ссылка: http://localhost/joomla/administrator/index.php?option=com_myquestions&task=reply&cid[]=1. Должна появиться следующая страница (рис. 2.1).
(есть увеличенное изображение)
Рис. 2.1. Фрагмент формы для ответа на вопрос
Сохранение введенных данных
После того, как эксперт напечатал ответ на заданный вопрос и нажал кнопку " Сохранить", необходимо сохранить информацию в базе данных. Прежде всего, создайте две функции - save() и saveQuestion() - в файле admin.myquestions.php:
function save() { $row =& JTable::getInstance('question', 'Table'); if (!$row->bind(JRequest::get('post'))) { echo "n"; exit(); } $row->question = JRequest::getVar('question', '', 'post', 'string', JREQUEST_ALLOWRAW); $row->answer = JRequest::getVar('answer', '', 'post', 'string', JREQUEST_ALLOWRAW); if (!$row->store()) { echo "n"; exit(); } return $row; } function saveQuestion($option, $task) { $row = save(); global $app; if ($task == 'save') $app->redirect('index.php?option='.$option, JText::_('COM_MYQUESTIONS_REPLY_SAVED')); else if ($task == 'apply') $app->redirect('index.php?option='.$option.'&task= reply&cid[]='.$row->id, JText::_('COM_MYQUESTIONS_REPLY_SAVED')); }
Переменной $row присваивается значение экземпляра класса TableQuestion и вызывается функция bind() для связывания переменных, полученных из формы, с полями этого класса.
Для тех значений, которые вводились с помощью редактора Joomla, стандартный способ получения значений из массива JRequest::get('post') не подходит, т.к. функция bind() автоматически удаляет HTML-код, что приведет, в частности, к потере разрывов строк и тегов абзаца. Поэтому для получения значений question и answer в том виде, в котором они были введены в редакторе, используется функция getVar() класса JRequest. Данной функции передается имя переменной формы, значение по умолчанию, метод запроса, с помощью которого мы хотим получить данные (get/post), ожидаемый формат и флаг JREQUEST_ALLOWRAW, означающий, что данные не должны быть отфильтрованы.
Наконец, вызывается функция store() для сохранения вопроса в базе данных.
В функции saveQuestion() происходит вызов функции save(), а затем в зависимости от задачи, т.е. от того, какая кнопка была нажата, - " Сохранить" или " Сохранить и закрыть", - мы перенаправляем пользователя либо к той же странице редактирования вопроса, на которой он находится, но уже с сохраненными данными, либо к главной странице нашего компонента. В обоих случаях выводится сообщение о том, что данные были сохранены. Для перенаправления и вывода сообщения используется функция redirect() глобального объекта JApplication.
Добавьте задачу сохранения записи в переключатель switch() в файле admin.myquestions.php(выделенный код):
Добавьте перевод для ключа COM_MYQUESTIONS_REPLY_SAVED в файл /administrator/language/ru-RU/ru-RU.com_myquestions.ini:
COM_MYQUESTIONS_REPLY_SAVED="Данные сохранены"
Сохраните все ваши файлы и перейдите по ссылке ссылка: http://localhost/joomla/administrator/index.php?option=com_myquestions&task=reply&cid[]=1. Напишите что-нибудь в поле для ответа и нажмите кнопку " Сохранить и закрыть". Вы должны увидеть следующую страницу (рис. 2.2).
(есть увеличенное изображение)
Рис. 2.2. Результат сохранения ответа на вопрос
С помощью phpMyAdmin вы можете проверить, что данные были сохранены в таблице базы данных jos_myquestions (рис. 2.3).
(есть увеличенное изображение)
Рис. 2.3. Ответ на вопрос сохранен в базе данных
Вывод списка записей
Прежде всего, добавьте в файл admin.myquestions.phpследующую функцию:
function showQuestions($option) { $db =& JFactory::getDbo(); $query = "SELECT * FROM #__myquestions"; $db->setQuery($query); $rows = $db->loadObjectList(); if ($db->getErrorNum()) { echo $db->stderr(); return false; } HTML_questions::showQuestions($option, $rows); }
Эта функция загружает все записи из таблицы #__myquestions и передает их в виде массива $rows в следующую функцию, которую необходимо добавить в файл admin.myquestions.html.phpв класс HTML_questions:
function showQuestions($option, &$rows) { $maxlen = 100; ?>