Обратите внимание, что массив $query должен быть передан в функцию <имя компонента>BuildRoute() по ссылке. По мере заполнения массива $segments обработанные элементы удаляются из массива $query с помощью unset(). Любые элементы, которые останутся в массиве $query после работы функции <имя компонента>BuildRoute(), останутся и в URL. Если мы передадим $query по значению, вызовы функции unset() будут действовать только на локальную копию этого массива и все элементы старого URL будут появляться после SEF-сегментов.
Документ (класс JDocument)
Документ- это буфер, использующийся для хранения содержимого веб-страницы, которая будет показана пользователю после выполнения запроса.
Получение ссылки на глобальный объект JDocument:
$document =& JFactory::getDocument();
Этот объект хранит название, описание, язык, направление текста, дату модификации, кодировку и некоторые другие значения. Класс JDocument содержит несколько методов для получения этих значений: getTitle(), getDescription(), getLanguage(), getDirection(), getModifiedDate(), getCharset() и др. Соответственно, методы для задания этих значений называются setTitle(), setDescription() и т.д. и принимают в качестве аргумента новое значение.
Получение значения мета-тега
string getMetaData(string $name, bool $http_equiv = false)
где
$name - название тега; $http_equiv - относится ли этот мета-тег к группе http-equiv (например, Content-Type, Refresh и др.).
Примеры:
echo $document->getMetaData('content-type', true); echo $document->getMetaData('keywords', false);
Изменение значения мета-тега
void setMetaData(string $name, string $content, bool $http_equiv = false, bool $sync = true)
где
$content - значение атрибута content; $sync - синхронизировать ли тег content-type с MIME-типом документа.
Пример:
$document->setMetaData('content-type','text/html',true,true);
Добавление скриптов и каскадных таблиц стилей
Перечисленные ниже методы добавляют в секцию <head> соответствующие теги.
Добавление ссылки на скрипт:
void addScript(string $url, string $type = "text/javascript", bool $defer = false, bool $async = false)
где
$url - URL скрипта; $type - тип скрипта (text/javascript, text/vbscript и т.д.); $defer - добавлять ли к тегу <script> атрибут defer="defer"; $async - добавлять ли к тегу <script> атрибут async="async".
Пример:
$document->addScript('/components/com_mycomponent/js/script.js');
Добавление непосредственно текста скрипта
void addScriptDeclaration(string $content, string $type = 'text/javascript')
где
$content - текст скрипта; $type - тип скрипта.
Пример:
$document->addScriptDeclaration('alert("Hello World")');
Добавление внешней таблицы стилей
void addStyleSheet(string $url, string $type = 'text/css', string $media = null, array $attribs = array())
где
$url - URL файла CSS; $type - MIME-тип файла; $media - значение атрибута media (screen, print, projection и др.); $attribs - массив других атрибутов тега <link>.
Пример:
$document->addStyleSheet('/components/com_mycomponent/css/style.css');
Добавление внутренней таблицы стилей
void addStyleDeclaration(string $content, string $type = 'text/css')
где
$content - код CSS; $type - значение атрибута type будущего тега <style>.
Пример:
$document->addStyleDeclaration('.myclass { color: red; }');
Пользователь (класс JUser)
Пользователь, просматривающий сайт, представлен объектом класса JUser, доступ к которому можно получить через метод getUser() класса JFactory:
$user =& JFactory::getUser();
Чтобы получить доступ к объекту, представляющему какого-либо другого пользователя, необходимо передать в метод getUser() id или логин этого пользователя:
$user =& JFactory::getUser(42); $user =& JFactory::getUser('admin');
Поля класса JUser
JUser имеет ряд полей, для которых определен уровень доступа public и к которым поэтому можно обращаться непосредственно. Наиболее важные из них перечислены ниже (таблица 5.1).
Таблица 5.1. Некоторые public-поля класса JUser Поле Описаниеblock Равно 1, если пользователь заблокирован email E-mail пользователя guest Равно 1, если пользователь является гостем, т.е. не залогинен id ID пользователя lastvisitDate Дата и время последнего входа пользователя в систему name Имя пользователя params Настройки пользователя registerDate Дата и время регистрации аккаунта пользователя sendEmail Равно 1, если пользователь согласен получать сообщения с сайта по электронной почте username Логин пользователя
Например, выведем приветствие для залогиненного пользователя:
if ($user->guest) echo "Пожалуйста, войдите в систему или зарегистрируйтесь"; else echo "Здравствуйте, {$user->name}! Последний раз вы были на сайте ".JHTML::_('date',$user->lastvisitDate);
Получение и изменение настроек пользователя
mixed getParam(string $key, mixed $default = null) mixed setParam(string $key, mixed $value)
где
$key - ключ параметра; $default - значение параметра по умолчанию; $value - устанавливаемое значение параметра. setParam() - возвращает предыдущее значение параметра.
Пример:
echo $user->getParam('language','ru-RU'); $user->setParam('language','en-GB');
Практика
Форма для написания вопроса
Измените код конструкции switch в файле myquestions.php, добавив обработку задачи showform:
case 'showform': showForm($option); break;
Добавьте в этот же файл функцию showForm():
function showForm($option) { $user =&JFactory::getUser(); if($user->name) $name = $user->name; else $name = ''; HTML_questions::showForm($option, $name); }
Перед вызовом функции вывода HTML-кода мы получаем имя залогиненного в настоящий момент пользователя, если таковой имеется. Код $user = &JFactory::getUser() присваивает переменной $user ссылку на объект-представитель залогиненного пользователя. Если удалось получить имя пользователя, то мы сохраняем это значение в переменной $name, а в противном случае этой переменной присваивается пустая строка. Таким образом поле " Автор" в форме для написания вопроса будет уже заполнено, так что залогиненным пользователям не придется его заполнять.
Перейдите в файл myquestions.html.phpи добавьте в класс HTML_questions метод showForm():
function showForm($option, $name) { ?> <form action="index.php" method="post"> <table> <tr> <td width="100"> <?php echo JText::_('COM_MYQUESTIONS_AUTHOR');?>: </td> <td> <input class="text_area" type="text" name="name" id="name" size="50" maxlength="255" value="<?php echo $name;?>"/> </td> </tr> <tr> <td width="100"> <?php echo JText::_('COM_MYQUESTIONS_CITY');?>: </td> <td> <input class="text_area" type="text" name="city" id="city" size="50" maxlength="50"/> </td> </tr> <tr> <td width="100"> <?php echo JText::_('COM_MYQUESTIONS_EMAIL');?>: </td> <td> <input class="text_area" type="text" name="email" id="email" size="50" maxlength="50"/> </td> </tr> <tr> <td width="100"> <?php echo JText::_('COM_MYQUESTIONS_QUESTION');?>: </td> <td> <textarea name='question' id='question' class='inputbox' rows='15' cols='38'></textarea> </td> </tr> <tr> <td width="100"> <?php echo JText::_('COM_MYQUESTIONS_PUBLISHED');?>: </td> <td> <input type="hidden" name="published" value="0"/> <input type="checkbox" name="published" id="published" value="1"/> </td> </tr> </table> <input type="hidden" name="task" value="addquestion"/> <input type="hidden" name="option" value="<?php echo $option;?>"/> <input type="submit" class="button" id="button" value="<?php echo JText::_('COM_MYQUESTIONS_SENDBUTTON');?>"/> </form> <?php } Листинг .