Чтение онлайн

ЖАНРЫ

Разрботка расширений для 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="Новый

вопрос на сайте" COM_MYQUESTIONS_ADMIN_LETTER_NEW_QUESTION="Добрый день!На сайте появился новый вопрос:<i>%s</i>" COM_MYQUESTIONS_ADMIN_LETTER_ERROR="Ошибка отправки письма"

Осталось добавить ссылку для написания вопроса. Измените начало функции 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и добавьте следующую функцию:

Поделиться с друзьями: