Выбрать главу

class TOOLBAR_myquestions_categories { function _NEW() { JToolBarHelper::title(JText::_('COM_MYQUESTIONS_TOOLBAR_TITLE_CATEGORIES'), 'generic.png'); JToolBarHelper::save('savecat'); JToolBarHelper::apply('applycat'); JToolBarHelper::cancel('showcat'); } function _DEFAULT() { JToolBarHelper::title(JText::_('COM_MYQUESTIONS_TOOLBAR_TITLE_CATEGORIES'), 'generic.png'); JToolBarHelper::addNew('addcat'); JToolBarHelper::editList('editcat'); JToolBarHelper::deleteList(JText::_('COM_MYQUESTIONS_TOOLBAR_REMOVE_CONFIRMATION'), 'removecat'); } }

Запишем в файле toolbar.myquestions.php, что при обработке задач addcat и editcat должна отображаться панель инструментов _NEW. Измените код этого файла так:

<?php defined('_JEXEC') or die('Restricted access'); require_once(JApplicationHelper::getPath('toolbar_html')); switch($task) { case 'reply': TOOLBAR_myquestions::_REPLY(); break; default: TOOLBAR_myquestions::_DEFAULT(); break; case 'showcat': TOOLBAR_myquestions_categories::_DEFAULT(); break; case 'addcat': case 'editcat': TOOLBAR_myquestions_categories::_NEW(); break; } ?>

Теперь добавим обработку всех перечисленных в файле toolbar.myquestions.html.phpзадач. Откройте файл admin.myquestions.phpи добавьте в переключатель switch код:

case 'addcat': case 'editcat': editCategory($option); break; case 'savecat': case 'applycat': saveCategory($option, $task); break; case 'removecat': removeCategories($option); break;

Добавьте перечисленные функции в файл admin.myquestions.php:

function editCategory($option) { $row =& JTable::getInstance('Category','Table'); $cid = JRequest::getVar('cid', array(0), '', 'array'); $id = $cid[0]; $row->load($id); HTML_questions::editCategory($row, $option); } function saveCategory($option, $task) { $row =& JTable::getInstance('category', 'Table'); if (!$row->bind(JRequest::get('post'))) { echo "<script> alert('".$row->getError()."'); window.history.go(-1); </script>\n"; exit(); } $row->desc = JRequest::getVar('desc', '', 'post', 'string', JREQUEST_ALLOWRAW); if (!$row->store()) { echo "<script> alert('".$row->getError()."'); window.history.go(-1); </script>\n"; exit(); } global $app; if ($task == 'savecat') $app->redirect('index.php?option='.$option.'&task=showcat', JText::_('COM_MYQUESTIONS_CATEGORY_SAVED')); else if ($task == 'applycat') $app- >redirect('index.php?option='.$option.'&task=editcat&cid[]='.$row- >id, JText::_('COM_MYQUESTIONS_CATEGORY_SAVED')); } function removeCategories($option) { global $app; $cid = JRequest::getVar('cid', array(), '', 'array'); $db =& JFactory::getDbo(); if(count($cid)) { $cids = implode(',', $cid); $query = "DELETE FROM #__myquestions_categories WHERE id IN ($cids)"; $db->setQuery($query); if (!$db->query()) { echo "<script> alert('".$db->getErrorMsg()."'); window.history.go(-1); </script>\n"; } } $app->redirect('index.php?option=' . $option . '&task=showcat', JText::_('COM_MYQUESTIONS_CATEGORY_DELETED')); } Листинг .

Добавьте в файл admin.myquestions.html.phpв класс HTML_questions метод editCategory() для отображения формы редактирования категории:

function editCategory ($row, $option) { $editor =& JFactory::getEditor(); ?> <form action = "index.php" method="post" name="adminForm" id="adminForm"> <fieldset class="adminform"> <table class="admintable" width=100%> <tr> <td width="100" class="key"> <?php echo JText::_('COM_MYQUESTIONS_CATEGORY_NAME');?>: </td> <td> <input class="text_area" type="text" name="name" id="name" size="50" maxlength="255" value="<?php echo $row->name;?>"/> </td> </tr> <tr> <td width="100" class="key"> <?php echo JText::_('COM_MYQUESTIONS_CATEGORY_DESC');?>: </td> <td> <?php echo $editor->display('desc', $row->desc,'100%', '250', '40', '10');?> </td> </tr> </table> </fieldset> <input type="hidden" name="id" value="<?php echo $row->id;?>"/> <input type="hidden" name="option" value="<?php echo $option;?>"/> <input type="hidden" name="task" value=""/> </form> <?php }

Наконец, добавьте в файл /administrator/language/ru-RU/ru-RU.com_myquestions.iniкод:

COM_MYQUESTIONS_CATEGORY_SAVED="Категория сохранена" COM_MYQUESTIONS_CATEGORY_DELETED="Категории успешно удалены"

Убедитесь, что все кнопки обеих панелей инструментов работают корректно.

Присвоение вопросу какой-либо категории

Добавим в форму ответа на вопрос выпадающий список для выбора категории.

Откройте файл admin.myquestions.phpи измените код функции replyToQuestion() следующим образом:

function replyToQuestion($option) { $row =& JTable::getInstance('Question','Table'); $cid = JRequest::getVar('cid', array(0), '', 'array'); $id = $cid[0]; $row->load($id); $db = &JFactory::getDBO(); $query = 'SELECT name AS text, id AS value FROM #__myquestions_categories'; $db->setQuery($query); $categories = $db->loadObjectList(); $list_cat = JHTML::_('select.genericlist', $categories, 'id_cat', ' class="inputbox" ', 'value', 'text', $row->id_cat); HTML_questions::replyToQuestion($row, $option, $list_cat); }

В файле admin.myquestions.html.phpизмените прототип функции HTML_questions::replyToQuestion() так:

function replyToQuestion ($row, $option, $list_cat)

Наконец, в коде этой функции измените фрагмент, в котором раньше выводилось текстовое поле с id категории, так:

<tr> <td width="100" class="key"> <?php echo JText::_('COM_MYQUESTIONS_CATEGORY');?>: </td> <td> <?=$list_cat?> </td> </tr>

Перейдите к странице ответа на вопрос и убедитесь, что отображается выпадающий список для выбора категории (рис. 3.13).

Рис. 3.13.  Выбор категории вопроса в бэкенде

Ключевые термины

JHTML - класс для вывода элементов XHTML. JHTMLBehavior - поддерживающий класс, который позволяет вывести календарь, дерево элементов, файловый загрузчик и некоторые другие элементы управления. JHTMLEmail - поддерживающий класс, содержащий метод для скрытия адреса электронной почты в целях его защиты от спам-ботов. JHTMLForm - поддерживающий класс, содержащий метод, который возвращает код скрытого поля формы для уменьшения риска CSRF-атак. JHTMLGrid - поддерживающий класс, позволяющий вывести в таблице в панели управления такие элементы, как чекбокс, пиктограмма для переключения состояния "опубликовано"/"не опубликовано", отобразить заголовок столбца как ссылки для сортировки по этому столбцу и др. JHTMLImage - поддерживающий класс, содержащий методы для поиска изображения в фронтенде и бэкенде. JHTMLList - поддерживающий класс для создания списков некоторых конкретных значений. JHTMLSelect - поддерживающий класс для генерации кода списков. Основной метод класса JHTML - метод JHTML::_(), который вызывает метод, определяющийся его первым параметром, и передает ему свои остальные параметры. Поддерживающие классы - классы для вывода элементов XHTML и поведений Javascript.

Краткие итоги

Joomla содержит методы для генерации и отображения элементов XHTML и поведений JavaScript. Эти методы вызываются с помощью метода JHTML::_(). По первому параметру данный метод определяет, какой метод необходимо вызвать, а остальные параметры передаются в этот метод. Таким образом могут быть вызваны как методы самого класса JHTML, так и методы поддерживающих классов.

Методы класса JHTML позволяют вывести следующие элементы: календарь, форматированную дату, элементы <iframe>, <img>, <a>, <script>, <link> и всплывающую подсказку.

Поддерживающие классы используются следующим образом:

JHTMLBehavior позволяет вывести календарь, дерево элементов, файловый загрузчик и некоторые другие элементы управления.

JHTMLEmail содержит метод для скрытия адреса электронной почты в целях его защиты от спам-ботов.

JHTMLForm содержит метод, который возвращает код скрытого поля формы для уменьшения риска CSRF-атак.

JHTMLGrid позволяет вывести в таблице в панели управления такие элементы, как чекбокс, пиктограмма для переключения состояния "опубликовано"/"не опубликовано", отобразить заголовок столбца как ссылки для сортировки по этому столбцу и др.

JHTMLImage содержит два метода для поиска изображения в фронтенде и бэкенде соответственно.

JHTMLList используется для создания списков некоторых конкретных значений.