Выбрать главу

Пример:

echo $editor->display('question', $row->question,'100%', '250', '40', '10');

Если по умолчанию задан редактор TinyMCE, то этот код выведет на экран следующее (рис. 4.3).

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

Рис. 4.3.  Отображение WYSIWYG-редактора

URI (класс JURI)

Чтобы создать новый объект класса JURI или получить ссылку на глобальный объект, используется метод

JURI &getInstance(string $uri='SERVER')

где $uri - URI страницы. При $uri='SERVER' метод вернет ссылку на глобальный объект, который представляет URI текущей страницы. В противном случае будет создан новый объект.

Например, так можно получить URI текущей страницы:

$u =& JURI::getInstance(); echo $u->toString();

Методы класса JURI

Методы класса JURI хорошо документированы (ссылка: http://docs.joomla.org/JURI), поэтому здесь мы только перечислим некоторые из них.

Получение базового URI сайта:

string base(bool $pathonly)

где $pathonly - возвращать только путь или также вернуть хост и порт.

Построение запроса (т.е. компонента URI):

string buildQuery(array $params)

где $params - ассоциативный массив пар " имя-значение".

Получение текущего URI без запроса и фрагмента:

string current()

Получение отдельных компонентов URI:

фрагмента - string getFragment(); хоста - string getHost(); пароля - string getPass(); пути - string getPath(); порта - string getPort(); запроса - string getQuery(bool $toArray), где $toArray задает, возвращать ли элементы запроса в виде ассоциативного массива или в виде строки; схемы - string getScheme(); имени пользователя - string getUser().

Получение заданной переменной из запроса:

string getVar(string $name, string $default)

где

$name - имя переменной; $default - значение по умолчанию.

Заполнение полей класса значениями, полученными из заданного URI ($uri):

boolean parse(string $uri)

Получение корневого URI сайта:

string root(bool $pathonly, string $path)

где $path - задает новый путь.

Ошибки (класс JError)

Методы raiseError(), raiseNotice() и raiseWarning() класса JError вызываются при возникновении каких-либо ошибок. Все они возвращают объект JException, содержащий сведения об ошибке, например, в каких файлах она возникла. raiseError() добавляет заданное сообщение в очередь сообщений и останавливает выполнение расширения, а остальные два метода только добавляют сообщение в очередь, но работа расширения продолжается.

JException raiseError(string $code, string $msg, mixed $info = null) JException raiseWarning(string $code, string $msg, mixed $info = null) JException raiseNotice(string $code, string $msg, mixed $info = null)

где

$code - внутренний код ошибки, задается по усмотрению программиста; $msg - сообщение об ошибке для пользователя; $info - дополнительная информация об ошибке для программиста.

Пример:

if ($this->published == 0) JError::raiseError (404, "Нет такой страницы");

Перечисленные методы создавались в то время, когда 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.