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

на главную - закладки

Жанры

Разрботка расширений для CMS Joomla
Шрифт:

Перейдите в файл myquestions.html.phpи добавьте в класс HTML_questions метод showForm:

function showForm($option, $name) { ?> <form action="index.php" method="post"> <table> <tr> <td width="100"> <?php echo JText::_('COM_MYQUESTIONS_AUTHOR');?>: </td> <td> <input class="text_area" type="text" name="name" id="name" size="50" maxlength="255" value="<?php echo $name;?>"/> </td> </tr> <tr> <td width="100"> <?php echo JText::_('COM_MYQUESTIONS_CITY');?>: </td> <td> <input class="text_area" type="text" name="city" id="city" size="50" maxlength="50"/> </td> </tr> <tr> <td width="100"> <?php echo JText::_('COM_MYQUESTIONS_EMAIL');?>: </td> <td> <input class="text_area" type="text" name="email" id="email" size="50" maxlength="50"/> </td> </tr> <tr> <td width="100"> <?php echo JText::_('COM_MYQUESTIONS_QUESTION');?>: </td> <td> <textarea name='question' id='question' class='inputbox' rows='15' cols='38'></textarea> </td> </tr> <tr> <td width="100"> <?php echo JText::_('COM_MYQUESTIONS_PUBLISHED');?>: </td> <td> <input type="hidden" name="published" value="0"/> <input type="checkbox" name="published" id="published" value="1"/> </td> </tr> </table> <input type="hidden" name="task" value="addquestion"/> <input type="hidden" name="option" value="<?php echo $option;?>"/> <input type="submit" class="button" id="button" value="<?php echo JText::_('COM_MYQUESTIONS_SENDBUTTON');?>"/> </form> <?php }

Листинг .

Как видите, в данной форме сразу два элемента с именем published. Дело в том, что, когда флажок установлен в выбранное состояние, то сценарию-обработчику формы в числе других параметров приходит пара "имя_флажка=значение". Однако когда флажок не установлен, эта пара не посылается. Поэтому используется следующий прием: перед флажком в форме помещается одноименное скрытое поле со значением, равным нулю. Тогда если флажок не установлен, то сценарий получит пару published=0. Если же он установлен, то сценарий тоже получит эту пару, но сразу же последует пара published=1, которая перекроет значение скрытого поля.

Так как мы поместили на форму скрытый элемент task со значением addquestion, то она будет обработана при обработке задачи addquestion. Поэтому добавьте в конструкцию switch в файле myquestions.phpследующий код:

case 'addquestion': addQuestion($option); break;

Добавьте в этот же файл функцию addQuestion:

function addQuestion($option) { $row =& JTable::getInstance('question', 'Table'); if (!$row->bind(JRequest::get('post'))) { echo "<script> alert('".$row->getError."'); window.history.go(-1); </script>\n"; exit; } $row->question = nl2br(htmlspecialchars(JRequest::getVar('question', '', 'post', 'string',JREQUEST_ALLOWRAW), ENT_QUOTES)); $row->IP = getenv('REMOTE_ADDR'); $row->date = &JFactory::getDate->toFormat; $row->id_cat = 1; if (!$row->store) { echo "<script> alert('".$row->getError."'); window.history.go(-1); </script>\n"; exit; } $mailer =& JFactory::getMailer; $mailer->setSender('[email protected]'); $mailer->addRecipient('[email protected]'); $mailer->setSubject(JText::_('COM_MYQUESTIONS_ADMIN_LETTER_SUBJECT')); $mailer->setBody(JText::sprintf('COM_MYQUESTIONS_ADMIN_LETTER_NEW_QUESTION',$row->question)); $mailer->IsHTML(true); if ($mailer->Send !== true) { echo "<script> alert('".JText::_('COM_MYQUESTIONS_ADMIN_LETTER_ERROR')."'); window.history.go(-1); </script>\n"; exit; } global $app; $app-> redirect(JRoute::_('index.php?option='.$option.'&task=view&view=all'), JText::sprintf('COM_MYQUESTIONS_QUESTION_SENT',$row->name)); }

Текст вопроса, введенный пользователем, пропускается через функцию htmlspecialchars, преобразующую специальные символы в HTML-сущности. Таким путем предотвращается ввод нежелательных HTML-тегов. Затем результат пропускается через функцию nl2br, вставляющую код разрыва строки <br/> перед каждым переводом строки, чтобы текст вопроса при выводе на веб-странице не слился в одну строку.

IP-адрес пользователя определяется с помощью функции getenv, которая возвращает значение переменной окружения, в данном случае - REMOTE_ADDR.

По умолчанию вопросу присваивается категория с 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).

Поделиться:
Популярные книги

Сердце Дракона. Том 20. Часть 1

Клеванский Кирилл Сергеевич
20. Сердце дракона
Фантастика:
фэнтези
боевая фантастика
городское фэнтези
5.00
рейтинг книги
Сердце Дракона. Том 20. Часть 1

Холодный ветер перемен

Иванов Дмитрий
7. Девяностые
Фантастика:
попаданцы
альтернативная история
6.80
рейтинг книги
Холодный ветер перемен

Последнее желание

Сапковский Анджей
1. Ведьмак
Фантастика:
фэнтези
9.43
рейтинг книги
Последнее желание

Отмороженный 7.0

Гарцевич Евгений Александрович
7. Отмороженный
Фантастика:
рпг
аниме
5.00
рейтинг книги
Отмороженный 7.0

Наследник

Кулаков Алексей Иванович
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
8.69
рейтинг книги
Наследник

Магия чистых душ 2

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.56
рейтинг книги
Магия чистых душ 2

Наследие Маозари 5

Панежин Евгений
5. Наследие Маозари
Фантастика:
фэнтези
юмористическое фэнтези
5.00
рейтинг книги
Наследие Маозари 5

Локки 4 Потомок бога

Решетов Евгений Валерьевич
4. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Локки 4 Потомок бога

Граф

Ланцов Михаил Алексеевич
6. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Граф

Миф об идеальном мужчине

Устинова Татьяна Витальевна
Детективы:
прочие детективы
9.23
рейтинг книги
Миф об идеальном мужчине

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Здравствуй, 1984-й

Иванов Дмитрий
1. Девяностые
Фантастика:
альтернативная история
6.42
рейтинг книги
Здравствуй, 1984-й

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Барон не играет по правилам

Ренгач Евгений
1. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон не играет по правилам