В разделе "Первые папки и файлы. Добавление пунктов меню" предлагается создать две файла: - myquestions.php; - admin.myquestions.php с соответствуюшими адресами: - /components/com_myquestions/myquestions.php; - /administrator/components/com_myquestions/admin.myquestions.php; Так вот, при создании файла "admin.myquestions.php" В админке выдает ошибку - "Компонент не найден", а при переименовании его на "myquestions.php" в последующем шаге, в админке не выводятся кнопки редактирования. |
Иерархия пунктов меню. Отправка писем. Классы ядра JEditor, JURI, JError, JDate
Цель лекции: Ознакомиться со способом программного добавления пунктов меню в 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, синим - уровни, красным - левые и правые ключи.
Отправка писем (класс 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).
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)
где
Заполнение полей класса значениями, полученными из заданного URI ($uri):
boolean parse(string $uri)
Получение корневого URI сайта:
string root(bool $pathonly, string $path)
где $path - задает новый путь.