Пример:
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.