Шрифт:
Перечисленные методы создавались в то время, когда Joomla работала с PHP4, где отсутствовал механизм обработки исключений. Если на хостинге стоит PHP5, предпочтительнее использовать класс Exception.
Даты (класс JDate)
JDate - класс для работы с датами. Для создания объекта JDate используется метод getDate класса JFactory:
JDate JFactory::getDate(mixed $time = 'now', mixed $tzOffset = null)
где
$time - дата и время в формате, годном для функции PHP strtotime; $tzOffset - временная зона. Может задаваться числом от -12 до 14 (смещение относительно всемирного координированного времени - UTC) или строкой из числа временных зон, поддерживаемых PHP (их список можно найти на странице ссылка: http://www.php.net/manual/ru/timezones.php).
В отличие от многих других методов JFactory, getDate не возвращает глобальный объект, а создает новый. Поэтому перед вызовом этого метода не нужно ставить амперсанд:
$now = JFactory::getDate; // текущие дата и время $some_date = JFactory::getDate('2012-01-01 00:00:00','Europe/Moscow');
Получение даты в каком-либо формате
string format(string $format, bool $local = false, bool $translate = true)
где
$format - формат; $local - возвращать дату в локальной временной зоне или в GMT; $translate - переводить ли текст.
Чтобы не задавать формат даты вручную, можно использовать один из определенных в Joomla форматов: DATE_FORMAT_LC, DATE_FORMAT_LC1 и т.д. Их список находится в языковом файле language/<ln-LN>/<ln-LN>.ini, где <ln-LN>– код языка. Как и для всякого языкового ключа, значение такого формата можно получить с помощью функции JText::_. Например, выведем дату в формате DATE_FORMAT_LC3:
echo $some_date->format(JText::_('DATE_FORMAT_LC3'));
Получение даты в формате, пригодном для вставки в запрос SQL
string toMySQL(bool $local=false)
Например, для получения материалов, созданных ранее даты $some_date, можно выполнить запрос:
$query = "SELECT * FROM #__content WHERE created < '{$some_date->toMySQL}'";
Практика
Отправка уведомлений по электронной почте
Сейчас в форме для ответа на вопрос две кнопки на панели инструментов (рис. 4.4) - нерабочие.
Рис. 4.4. Кнопки для отправки уведомлений по электронной почте
Напишем код для их обработки.
Откройте файл admin.myquestions.phpи добавьте в переключатель switch обработку двух задач:
case 'sendToExpert': case 'sendAnswer': send($option,$task); break;
Добавьте также в этот же файл функцию send:
function send($option,$task) { $row_new = save; $q = $row_new->question; $a = $row_new->answer; $mailer =& JFactory::getMailer; $mailer->setSender('test@mysite.ru'); if ($task == 'sendToExpert') { $mailer->addRecipient('expert@mysite.ru'); $mailer->setSubject(JText::_('COM_MYQUESTIONS_NEW_QUESTION')); $mailer->setBody(JText::sprintf('COM_MYQUESTIONS_EMAIL_EXPERT_BODY',$q)); } else { $mailer->addRecipient($row_new->email); $mailer->setSubject(JText::_('COM_MYQUESTIONS_NEW_ANSWER')); $mailer->setBody(JText::sprintf('COM_MYQUESTIONS_EMAIL_USER_BODY',$q,$a)); } $mailer->IsHTML(true); if ($mailer->Send !== true) $message = 'COM_MYQUESTIONS_EMAIL_ERROR'; else { $message = 'COM_MYQUESTIONS_EMAIL_SUCCESS'; $db =& JFactory::getDbo; if ($task == 'sendToExpert') $query = "UPDATE #__myquestions SET senttoexpert=1 WHERE id={$row_new->id}"; else $query = "UPDATE #__myquestions SET senttoauthor=1 WHERE id={$row_new->id}"; $db->setQuery($query); $db->query; if ($db->getErrorNum) { echo $db->stderr; return false; } } global $app; $app->redirect('index.php?option='.$option.'&task=reply&cid[]='.$row_new->id, JText::_($message)); } Листинг .
В данной функции прежде всего происходит сохранение текущей записи и обновленная запись сохраняется в переменной row_new. Затем в зависимости от того, отправляется это уведомление эксперту или автору вопроса, задаются отправитель, получатель, тема и текст письма. Если уведомление отправляется пользователю, задавшему вопрос, то адрес электронной почты получателя берется из записи row_new.
При задании тела письма используется метод JText::sprintf, пропускающий заданную ему строку через PHP-функцию sprintf. В выражении JText::sprintf('COM_MYQUESTIONS_EMAIL_USER_BODY',$q,$a) 'COM_MYQUESTIONS_EMAIL_USER_BODY' - это строка формата, которую мы сейчас зададим в языковом файле, а $q и $a - это аргументы (соответственно текст вопроса и текст ответа).
Тип содержимого письма задается как 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="Добрый день!На сайте появился новый вопрос: <i>%s</i>" COM_MYQUESTIONS_NEW_ANSWER="Ответ на ваш вопрос" COM_MYQUESTIONS_EMAIL_USER_BODY="Добрый день!На сайте появился ответ на ваш вопрос: <i>%s</i>Ответ был таким:<i>%s</i>"
Как видите, строки COM_MYQUESTIONS_EMAIL_EXPERT_BODY и COM_MYQUESTIONS_EMAIL_USER_BODY содержат параметры. Так как их тип - строковый (тексты вопроса, ответа), то используется описатель типа %s.
Теперь перейдите в бэкенде на страницу ответа на вопрос и нажмите кнопку " Отправить эксперту". Вы должны увидеть сообщение о том, что письмо отправлено (рис. 4.5).
(есть увеличенное изображение)
Рис. 4.5. Сообщение об отправке уведомления по электронной почте