Опубликован: 02.10.2012 | Доступ: свободный | Студентов: 1915 / 85 | Длительность: 11:48:00
Теги: joomla, mvc, php, xhtml, xml
Лекция 4:

Иерархия пунктов меню. Отправка писем. Классы ядра JEditor, JURI, JError, JDate

< Лекция 3 || Лекция 4: 123 || Лекция 5 >
Аннотация: Рассмотрен принцип хранения иерархии пунктов меню, использующийся в Joomla. Рассмотрены классы для отправки электронной почты, отображения кода визуального редактора, работы с URI, ошибками и датами.

Цель лекции: Ознакомиться со способом программного добавления пунктов меню в Joomla, а также с некоторыми методами классов JMail, JEditor, JURI, JError, JDate.

Организация иерархии пунктов меню в Joomla

Для хранения иерархии пунктов меню в Joomla используются вложенные множества (http://en.wikipedia.org/wiki/Nested_set_model). Например, на рис. 4.1 представлена эта иерархия для случая, если бы в ней было всего восемь пунктов: корневой пункт меню Menu_Item_Root, com_banners с подпунктами com_banners, com_banners_categories, com_banners_clients и com_messages с подпунктами com_messages_add, com_messages_read:

Пример использования вложенных множеств для организации иерархии пунктов меню

увеличить изображение
Рис. 4.1. Пример использования вложенных множеств для организации иерархии пунктов меню

Каждому элементу иерархии соответствуют два числа - левый и правый ключи.

Для каждого пункта в таблице #__menu хранится id родителя parent_id, уровень level и левый и правый ключи lft и rgt. На рис. 4.2 оранжевым цветом показаны id, синим - уровни, красным - левые и правые ключи.

Данные, хранящиеся для каждого пункта меню как элемента иерархии

увеличить изображение
Рис. 4.2. Данные, хранящиеся для каждого пункта меню как элемента иерархии

Отправка писем (класс JMail)

Класс JMail предназначен для создания и отправки электронных писем. JMail поддерживает три механизма отправки почты: функцию PHP mail(), Sendmail и SMTP.

Доступ к глобальному объекту JMail можно получить через метод getMailer() класса JFactory:

$mailer =& JFactory::getMailer();
    

Отправитель письма

Для задания отправителя письма используется метод

JMail setSender(mixed $from)
        

где $from - либо строка, содержащая e-mail отправителя, либо массив, который содержит e-mail и имя отправителя.

Примеры:

// Первый вариант
$mailer =& JFactory::getMailer();
$mailer->setSender('vasya@mysite.ru');

// Второй вариант
$sender = array('vasya@mysite.ru', 'Вася')
$mailer->setSender($sender);
        

Правильнее будет не задавать эти значения вручную, а получать их из настроек отправки почты, заданных в панели управления ("Сайт" - "Общие настройки" - "Сервер"):

$config =& JFactory::getConfig();
$sender = array(
    $config->getValue('config.mailfrom'),
    $config->getValue('config.fromname'));
$mailer->setSender($sender);
        

Адреса для ответа

Адреса для ответа задаются методом

JMail addReplyTo(array $replyto)
        

где $replyto - пара e-mail-имя или массив таких пар.

Например:

// Первый вариант
$reply = array('vasya@mysite.ru', 'Вася');
$mailer->addReplyTo($reply);

// Второй вариант
$reply0 = array('vasya@mysite.ru', 'Вася');
$reply1 = array('vanya@mysite.ru', 'Ваня');
$replies = array($reply0, $reply1);
$mailer->addReplyTo($replies);
        

Получатель

Для задания получателя, получателя копии (Carbon Copy) и получателя скрытой копии (Blind Carbon Copy), используются методы

JMail addRecipient(mixed $recipient, mixed name = '')
JMail addCC(mixed $cc, mixed name = '')
JMail addBCC(mixed $bcc, mixed name = '')
        

где

$recipient, $cc, $bcc - e-mail или массив, состоящий из e-mail;
$name - имя получателя или массив, состоящий из имен.

Для примера зададим в качестве адреса получателя адрес текущего пользователя:

$user =& JFactory::getUser();
$mailer->addRecipient($user->email);
        

Задание нескольких получателей:

$recipient = array('vasya@mysite.ru', 'vanya@mysite.ru');
$mailer->addRecipient($recipient);
        

Тема, текст, вложения

Тема, текст и вложения письма задаются методами

JMail setSubject(string $subject)
JMail setBody(string $content)
JMail addAttachment(mixed $attachment, mixed $name = '', mixed $encoding = 'base64', mixed $type = 'application/octet-stream')
        

где

$subject - строка, содержащая тему письма;
$content - строка, содержащая текст письма;
$attachment - строка, содержащая путь к файлу, или массив таких строк;
$name - строка, содержащая имя файла, или массив таких строк;
$encoding - кодировка сообщения: 8bit, 7bit, binary, base64, quoted-printable;
$type - MIME-тип файла.

Например:

$mailer->setSubject('Тема письма');
$mailer->setBody("Текст письма");
$mailer->addAttachment(JPATH_COMPONENT.DS.'files'.DS.'document.pdf');
        

По умолчанию содержимое письма имеет формат plain text. Если вам нужно отправить письмо в формате HTML, используйте метод IsHTML(), задающий MIME-тип содержимого письма как text/html:

$mailer->IsHTML(true);
$mailer->setBody("Текст письма, содержащий <b>HTML-теги</b>");
        

В этом случае желательно указать кодировку письма - base64, чтобы в нем не появились нежелательные символы:

$mailer->Encoding = 'base64';
        

Отправка

Наконец, для отправки письма используется метод Send(), возвращающий true при успешной отправке или объект JError в случае ошибки:

if ($mailer->Send() !== true)
    die('Ошибка отправки письма');
        

Проверка корректности e-mail

Помимо класса JMail, существует статический класс JMailHelper. Большинство его методов предназначены для очистки данных перед добавлением к электронному письму и используются классом JMail. Интерес для разработчика представляет метод isEmailAddress(), который проверяет, является ли заданная строка корректным адресом электронной почты:

if (!JMailHelper::isEmailAddress($str))
    die('Недопустимый формат e-mail');
        

Перед использованием класса JMailHelper необходимо подключить библиотеку JMail:

jimport('joomla.utilities.mail');
        

WYSIWYG-редактор (класс JEditor)

Класс JEditor используется для работы с WYSIWYG-редактором.

Получить ссылку на глобальный объект JEditor можно так:

$editor =& JFactory::getEditor();
    

Отображение редактора

Для отображения выбранного администратором сайта редактора используется метод display(). Если не выбран ни один редактор, то будет отображено поле <textarea>.

string display(string $name, string $html, string $width, string $height, int $col, int $row, bool $buttons = true, 
string $id = null, string $asset = null, object $author = null, array $params = array())
        

где

$name - имя элемента управления формы;
$html - содержимое поля;
$width - ширина текстового поля в процентах или пикселях;
$height - высота текстового поля;
$col - количество столбцов в поле <textarea> (применяется, если администратор выбрал не использовать HTML-редактор);
$row - количество строк в <textarea>;
$buttons - отображать ли кнопки редактора ("Материал", "Изображение", "Разрыв страницы", "Подробнее…");
$id - id элемента управления формы;
$asset и $author - используются для подтверждения прав доступа пользователя к некоторым функциям плагина редактора. Более подробная информация об этих параметрах в справочной документации отсутствует;
$params - ассоциативный массив параметров редактора.

Пример:

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

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

Отображение WYSIWYG-редактора

увеличить изображение
Рис. 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 - задает новый путь.

< Лекция 3 || Лекция 4: 123 || Лекция 5 >
Кирилл Гусаров
Кирилл Гусаров

В разделе "Первые папки и файлы. Добавление пунктов меню"

предлагается создать две файла:

- myquestions.php;

- admin.myquestions.php

с соответствуюшими адресами:

/components/com_myquestions/myquestions.php;

- /administrator/components/com_myquestions/admin.myquestions.php;

Так вот, при создании файла "admin.myquestions.php" В админке выдает ошибку - "Компонент не найден", а при переименовании его на  "myquestions.php" в последующем шаге, в админке не выводятся кнопки редактирования. 
Проверил кодировку, проверил правильность пути к файлам, пересохранил указанный код. Скажите что я делаю не так или в чем может быть причина?