Разрботка расширений для CMS Joomla
Шрифт:
Обновление нового узла:
UPDATE jos_menu SET lft=$right_key, rgt=$right_key+1, level=$level+1 WHERE title='com_myquestions_menu'
Пусть теперь $right_key и $level - соответственно правый ключ и уровень этого только что обновленного нами узла, а $parent_id - его id. Создадим два подпункта этого пункта меню (не забудьте заменить 10006 на id вашего компонента из таблицы #__extensions).
Подпункт для управления списком вопросов:
UPDATE jos_menu SET lft=lft+2, rgt=rgt+2 WHERE lft>$right_key; UPDATE jos_menu SET rgt=rgt+2 WHERE rgt>=$right_key AND lft<$right_key; INSERT INTO `jos_menu` (`menutype`, `title`, `alias`, `path`, `link`, `type`, `parent_id`, `level`, `component_id`, `access`, `img`, `params`, `lft`, `rgt`, `client_id`) VALUES ('menu', 'com_myquestions_menu_questions', 'Questions', 'My Questions/Questions', 'index.php?option=com_myquestions', 'component', $parent_id, $level+1, 10006, 1, 'class:component', '', $right_key, $right_key+1, 1);
Обратите
Посмотрите в таблице #__menu новое значение $right_key главного пункта меню для нашего компонента - оно должно было увеличиться на 2. Теперь создадим подпункт для управления списком категорий:
UPDATE jos_menu SET lft=lft+2, rgt=rgt+2 WHERE lft>$right_key; UPDATE jos_menu SET rgt=rgt+2 WHERE rgt>=$right_key AND lft<$right_key; INSERT INTO `jos_menu` (`menutype`, `title`, `alias`, `path`, `link`, `type`, `parent_id`, `level`, `component_id`, `access`, `img`, `params`, `lft`, `rgt`, `client_id`) VALUES ('menu', 'com_myquestions_menu_categories', 'Categories', 'My Questions/Categories', 'index.php?option=com_myquestions&task=showcat', 'component', $parent_id, $level+1, 10006, 1, 'class:component', '', $right_key, $right_key+1, 1);
Наконец, добавьте в файл /administrator/language/ru-RU/ru-RU.com_myquestions.sys.iniкод:
COM_MYQUESTIONS_MENU_QUESTIONS="Управление вопросами" COM_MYQUESTIONS_MENU_CATEGORIES="Управление категориями"
Обновите любую страницу в бэкенде и убедитесь, что появились два новых подпункта меню " Моя система "вопрос - ответ"" (рис. 4.8).
(есть увеличенное изображение)
Рис. 4.8. Подпункты меню в бэкенде
Разработка фронтенда
Для удобства дальнейшего тестирования добавим еще несколько вопросов в различные категории:
INSERT INTO `jos_myquestions` (`id`, `name`, `date`, `question`, `city`, `email`, `IP`, `id_cat`) VALUES (NULL, 'Аноним', '2012-01-02 09:01:00', 'Быть или не быть?', 'Москва', 'somebody@mail.ru', '12.345.67.890', '1'); INSERT INTO `jos_myquestions` (`id`, `name`, `date`, `question`, `city`, `email`, `IP`, `id_cat`) VALUES (NULL, 'Аноним', '2012-01-01 09:02:00', 'А судьи кто?', 'Москва', 'somebody@mail.ru', '12.345.67.890', '2'); INSERT INTO `jos_myquestions` (`id`, `name`, `date`, `question`, `city`, `email`, `IP`, `id_cat`) VALUES (NULL, 'Аноним', '2012-01-01 09:03:00', ' А был ли мальчик?', 'Москва', 'somebody@mail.ru', '12.345.67.890', '2');
Для наглядности выключите SEF в настройках сайта: в бэкенде зайдите в меню " Сайт" - " Общие настройки" и установите переключатель " Включить SEF (ЧПУ)" в значение " Нет".
Вывод списка категорий
Замените содержимое файла /components/com_myquestions/myquestions.php(обратите внимание, что мы больше не работаем с папкой /administrator) на следующий код:
<?php defined('_JEXEC') or die('Restricted access'); jimport('joomla.application.helper'); require_once(JApplicationHelper::getPath('html')); JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'. DS.$option.DS.'tables'); switch($task) { default: showCategories($option); break; } function showCategories($option) { $db =& JFactory::getDbo; $query = "SELECT c.id, c.name, c.desc ". "FROM #__myquestions_categories c"; $db->setQuery($query); $rows = $db->loadObjectlist; if ($db->getErrorNum) { echo $db->stderr; return false; } HTML_questions::showCategories($rows, $option); } ?>
Мы
Переключатель switch обрабатывает пока только значение задачи по умолчанию, вызывая функцию для получения списка категорий.
Теперь добавим класс HTML_questions для фронтенда. Создайте файл /components/com_myquestions/myquestions.html.php:
<?php class HTML_questions { function showCategories($rows, $option) { ?> <a href='index.php?option=<?=$option?>&task=showlist'><?= JText::_('COM_MYQUESTIONS_ALL_QUESTIONS')?></a> <table> <?php foreach($rows as $row) { $link = 'index.php?option='.$option.'&id_cat='.$row->id.'&task=showlist'; echo '<tr><td><a href="#">'.$row->name .'</a></td><td>'.$row->desc.'</td></tr>'; } ?> </table> <?php } } ?>
Класс HTML_questions будет содержать все функции вывода во фронтенде. Функция showCategories принимает в качестве параметров массив записей таблицы базы данных и название текущего компонента. В цикле осуществляется обход этого массива и каждая запись выводится на экран.
Создайте файл /language/ru-RU/ru-RU.com_myquestions.iniи скопируйте в него строку:
COM_MYQUESTIONS_ALL_QUESTIONS="Все вопросы"
Теперь на странице компонента myquestions во фронтенде по умолчанию отображается список категорий (рис. 4.9).
(есть увеличенное изображение)
Рис. 4.9. Вывод списка категорий во фронтенде
Просмотр списка вопросов
Измените код конструкции switch в файле myquestions.php, добавив обработку задачи showlist:
case 'showlist': showQuestions($option); break;
Добавьте в этот же файл функцию showQuestions:
function showQuestions($option) { $db =& JFactory::getDbo; $query = "SELECT q.id,q.name,q.date,q.question,q.city,q.email,q.answer,q.id_cat,c.name AS cname ". "FROM #__myquestions q, #__myquestions_categories c ". "WHERE q.id_cat=c.id AND q.answer <> '' AND (q.published = 1 OR (q.expiration_date <> '0000-00-00 00:00:00' AND q.expiration_date > NOW))"; $id_cat = JRequest::getVar('id_cat', '0'); if ($id_cat != 0) $query .= " AND q.id_cat = $id_cat"; $db->setQuery($query); $rows = $db->loadObjectlist; if ($db->getErrorNum) { echo $db->stderr; return false; } if ($id_cat != 0) { $query = "SELECT name FROM #__myquestions_categories WHERE id=$id_cat"; $db->setQuery($query); if ($db->getErrorNum) { echo $db->stderr; return false; } $name_cat = $db->loadResult; } else $name_cat = ''; HTML_questions::showQuestions($rows, $option, $name_cat); }