Теперь добавим обработку всех перечисленных в файле 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).
![Разрботка расширений для CMS Joomla _28.jpg](https://litlife.club/books/145279/read/images/_28.jpg)
Рис. 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 содержит два метода для поиска изображения в фронтенде и бэкенде соответственно.