Добавить в цитаты Настройки чтения

Страница 19 из 38

Тип содержимого письма задается как text/html, так как оно содержит html-теги.

Если письмо успешно отправлено, то в соответствующей вопросу записи в базе данных значение senttoexpert или senttoauthor устанавливается равным 1.

В конце функции происходит перенаправление на текущую страницу с выводом сообщения либо об успешной отправке письма, либо об ошибке.

Добавьте в файл /administrator/language/ru-RU/ru-RU.com_myquestions.iniследующий код:

COM_MYQUESTIONS_EMAIL_SUCCESS="e-mail отправлен" COM_MYQUESTIONS_EMAIL_ERROR="Не удалось отправить e-mail" COM_MYQUESTIONS_NEW_QUESTION="Новый вопрос" COM_MYQUESTIONS_EMAIL_EXPERT_BODY="<p>Добрый день!</p><p>На сайте появился новый вопрос: </p><p><i>%s</i></p>" COM_MYQUESTIONS_NEW_ANSWER="Ответ на ваш вопрос" COM_MYQUESTIONS_EMAIL_USER_BODY="<p>Добрый день!</p><p>На сайте появился ответ на ваш вопрос: </p><p><i>%s</i></p><p>Ответ был таким:</p><p><i>%s</i></p>"

Как видите, строки COM_MYQUESTIONS_EMAIL_EXPERT_BODY и COM_MYQUESTIONS_EMAIL_USER_BODY содержат параметры. Так как их тип - строковый (тексты вопроса, ответа), то используется описатель типа %s.

Теперь перейдите в бэкенде на страницу ответа на вопрос и нажмите кнопку " Отправить эксперту". Вы должны увидеть сообщение о том, что письмо отправлено (рис. 4.5).

(есть увеличенное изображение)

Рис. 4.5.  Сообщение об отправке уведомления по электронной почте

Если вы используете локальный сервер, то ваше письмо, скорее всего, на самом деле не отправилось. В Денвере срабатывает почтовая заглушка sendmail: все письма просто помещаются в папку <путь к Денверу>/tmp/!sendmailв виде файлов с расширением .eml. Если в вашем случае так и есть, то откройте эту папку и найдите в ней только что "отправленное" письмо (можно ориентироваться по названию файла - это дата и время "отправки"). Откройте файл в почтовой программе и убедитесь, что его содержимое соответствует заданным нами значениям (рис. 4.6).

Рис. 4.6.  Результат отправки уведомления на локальном сервере - файл .eml, открытый в почтовой программе

Перейдите к списку вопросов и убедитесь, что значение в столбце " Отправлен ли вопрос эксперту" поменялось с " Нет" на " Да" (рис. 4.7).

(есть увеличенное изображение)

Рис. 4.7.  Новое значение в столбце "Отправлен ли вопрос эксперту"

Аналогично проверьте, как работает кнопка " Отправить ответ".

Добавление пункта меню

Добавим пункт меню для управления категориями.

Создавая первый пункт меню для нашего компонента, мы не указали значения левого и правого ключей. Определим их сейчас. Уровень данного пункта равен 1 (его предком является корень дерева с уровнем 0, а потомки могут иметь уровень 2 и более). Родительский узел - это самая первая строка в таблице #__menu, посмотрите значение его правого ключа в поле rgt.

Пусть $right_key - правый ключ родительского узла, $level - уровень родительского узла. Тогда для задания правильных значений левого и правого ключей выполним следующие запросы (не забудьте заменить $right_key и $level на значения из вашей таблицы):

Обновление ключей узлов, стоящих за родительским узлом:

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

Обновление нового узла:

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);

Обратите внимание, что значения alias и path соответствуют иерархии узлов.

Посмотрите в таблице #__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', 'Быть или не быть?', 'Москва', '[email protected] /* */', '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', 'А судьи кто?', 'Москва', '[email protected] /* */', '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', ' А был ли мальчик?', 'Москва', '[email protected] /* */', '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); } ?>