Разрботка расширений для CMS Joomla
Шрифт:
По умолчанию вопросу присваивается категория с id, равным 1, то есть "Без категории".
Добавьте в файл language/ru-RU/ru-RU.com_myquestions.iniкод:
COM_MYQUESTIONS_ADD_QUESTION="Задать вопрос" COM_MYQUESTIONS_AUTHOR="Автор" COM_MYQUESTIONS_DATE="Дата вопроса" COM_MYQUESTIONS_QUESTION="Текст вопроса" COM_MYQUESTIONS_CITY="Город" COM_MYQUESTIONS_EMAIL="e-mail" COM_MYQUESTIONS_CATEGORY="Категория" COM_MYQUESTIONS_PUBLISHED="Отображать ли вопрос на сайте" COM_MYQUESTIONS_SENDBUTTON="Отправить вопрос" COM_MYQUESTIONS_QUESTION_SENT="Спасибо, %s! Ваш вопрос отправлен. Он будет опубликован на сайте после получения ответа" COM_MYQUESTIONS_ADMIN_LETTER_SUBJECT="Новый
Осталось добавить ссылку для написания вопроса. Измените начало функции showCategories так:
function showCategories($rows, $option) { ?> <a href='index.php?option=<?=$option?>&task=showlist'><?=JText::_('COM_MYQUESTIONS_ALL_QUESTIONS') ?></a> <a href='index.php?option=<?=$option?>&task=showform'><?=JText::_('COM_MYQUESTIONS_ADD_QUESTION') ?></a>
Теперь на главной странице компонента во фронтенде появилась ссылка " Задать вопрос" (рис. 5.1).
(есть увеличенное изображение)
Рис. 5.1. Ссылка "Задать вопрос"
При переходе по этой ссылке появляется форма для написания вопроса (рис. 5.2). Обратите внимание, что в поле " Автор" подставилось имя текущего пользователя, если он залогинен.
(есть увеличенное изображение)
Рис. 5.2. Форма для написания вопроса
После написания вопроса и нажатия кнопки " Отправить вопрос" происходит перенаправление на главную страницу компонента с сообщением об успешной отправке вопроса (рис. 5.3).
(есть увеличенное изображение)
Рис. 5.3. Сообщение об отправке вопроса
Зайдите в папку <путь к Денверу>/tmp/!sendmailи найдите в ней файл *.eml, содержащий письмо-уведомление администратора о новом вопросе.
SEF
Включите SEF в бэкенде. Для этого перейдите в меню " Сайт" - " Общие настройки" и убедитесь, что переключатель " Включить SEF (ЧПУ)" установлен в " Да". Если вы используете в качестве веб-сервера Apache со включенным mod_rewrite, то вы можете также установить переключатель " Перенаправление URL" в " Да"; тогда из ваших ссылок исчезнет строка " index.php". Вид раздела " Настройки SEO" при включенном mod_rewriteпоказан на рис. 5.4.
Рис. 5.4. Раздел панели управления "Настройки SEO"
Если ваша конфигурация не позволяет использовать mod_rewrite, SEF-ссылки все равно могут быть построены, но они будут включать строку " index.php", например: ссылка: http://www.mysite.ru/index.php/one/two/three.
Нажмите кнопку " Сохранить и закрыть"
для сохранения конфигурации. Если вы используете mod_rewrite, убедитесь, что вы переименовали находящийся в корневой папке Joomla файл htaccess.txtв .htaccess(если переименовать файл в проводнике Windows не удается, воспользуйтесь интерфейсом командной строки или каким-либо файловым менеджером, например, Total Commander).Если вы получили сообщение о том, что ваша конфигурация не может быть перезаписана, задайте те же два значения вручную. Для этого откройте файл configuration.phpв корневой папке Joomla, найдите строки:
public $sef = '0'; public $sef_rewrite = '0';
и измените оба значения на " 1" вместо "0".
Генерация SEF-ссылок
Напишем функцию для генерации SEF-ссылок. Создайте файл /components/com_myquestions/router.php:
<?php defined('_JEXEC') or die ('Restricted access'); function MyQuestionsBuildRoute(&$query) { $segments = array; if (isset($query['task'])) { $segments[] = $query['task']; unset($query['task' ]) ; } if(isset($query['id' ])) { $segments[] = $query['id']; unset($query['id']); } return $segments; } ?>
Мы создаем пустой массив $segments. Затем проверяем, есть ли в массиве запроса элемент "task", и в этом случае добавляем значение задачи в массив $segments в качестве первого элемента и затем удаляем task из запроса. Далее мы повторяем тот же процесс для id. Наконец, возвращаем массив $segments, чтобы JRoute::_ могла закончить построение URL.
Исправим функции вывода нашего компонента так, чтобы они выводили SEF-ссылки вместо обычных. Откройте файл /components/com_myquestions/myquestions.html.phpи измените код функции showCategories класса HTML_questions следующим образом:
function showCategories($rows, $option) { ?> <a href='<?=JRoute::_('index.php?option='.$option.'&task=showlist')?>'> <?=JText::_('COM_MYQUESTIONS_ALL_QUESTIONS')?></a> <a href='<?=JRoute::_('index.php?option='.$option.'&task=showform')?>'> <?=JText::_('COM_MYQUESTIONS_ADD_QUESTION')?></a> <table> <?php foreach($rows as $row) { $link = JRoute::_('index.php?option='.$option.'&id='.$row->id.'&task=showlist'); echo '<tr><td><a href="#">'.$row->name. '</a></td><td>'.$row->desc.'</td></tr>'; } ?> </table> <?php }
Измените выделенный код в функции HTML_questions::showQuestions:
foreach($rows as $row) { $link = JRoute::_('index.php?option='.$option.'&id='.$row->id.'&task=showquestion'); $link_cat = JRoute::_('index.php?option='.$option.'&id_cat='.$row->id_cat.'&task=showlist'); ?>
Измените также выделенный код в функции HTML_questions::showQuestion:
function showQuestion($row, $option, $row_cat) { $link_cat = JRoute::_('index.php?option='.$option.'&id_cat='.$row->id_cat.'&task=showlist');
Теперь компонент будет генерировать SEF-ссылки по шаблону, установленному в функции MyQuestionsBuildRoute.
Декодирование SEF-ссылок
Если вы сейчас попытаетесь щелкнуть на одной из SEF-ссылок, то получите сообщение:
"Fatal error: Call to undefined function myquestionsParseRoute in Y:\home\localhost\www\joomla\includes\router.php on line …".
Напишем функцию для декодирования SEF-ссылок.
Откройте файл /components/com_myquestions/router.phpи добавьте следующую функцию: