Чтение онлайн

ЖАНРЫ

Разрботка расширений для CMS Joomla
Шрифт:

$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 }

Листинг .

Как видите, в данной форме сразу два элемента с именем published. Дело в том, что, когда флажок установлен в выбранное состояние, то сценарию-обработчику формы в числе других параметров приходит пара "имя_флажка=значение". Однако когда флажок не установлен, эта пара не посылается. Поэтому используется следующий прием: перед флажком в форме помещается одноименное скрытое поле со значением, равным нулю. Тогда если флажок не установлен, то сценарий получит пару published=0. Если же он установлен, то сценарий тоже получит эту пару, но сразу же последует пара published=1, которая перекроет значение скрытого поля.

Так как мы поместили на форму скрытый элемент task со значением addquestion, то она будет обработана при обработке задачи addquestion. Поэтому добавьте в конструкцию switch в файле myquestions.phpследующий код:

case 'addquestion': addQuestion($option); break;

Добавьте в этот же файл функцию addQuestion:

function addQuestion($option) { $row =& JTable::getInstance('question', 'Table'); if (!$row->bind(JRequest::get('post'))) { echo "<script> alert('".$row->getError."'); window.history.go(-1); </script>\n"; exit; } $row->question = nl2br(htmlspecialchars(JRequest::getVar('question', '', 'post', 'string',JREQUEST_ALLOWRAW), ENT_QUOTES)); $row->IP = getenv('REMOTE_ADDR'); $row->date = &JFactory::getDate->toFormat; $row->id_cat = 1; if (!$row->store) { echo "<script> alert('".$row->getError."'); window.history.go(-1); </script>\n"; exit; } $mailer =& JFactory::getMailer; $mailer->setSender('test@mysite.ru'); $mailer->addRecipient('admin@mysite.ru'); $mailer->setSubject(JText::_('COM_MYQUESTIONS_ADMIN_LETTER_SUBJECT')); $mailer->setBody(JText::sprintf('COM_MYQUESTIONS_ADMIN_LETTER_NEW_QUESTION',$row->question)); $mailer->IsHTML(true); if ($mailer->Send !== true) { echo "<script> alert('".JText::_('COM_MYQUESTIONS_ADMIN_LETTER_ERROR')."'); window.history.go(-1); </script>\n"; exit; } global $app; $app-> redirect(JRoute::_('index.php?option='.$option.'&task=view&view=all'), JText::sprintf('COM_MYQUESTIONS_QUESTION_SENT',$row->name)); }

Текст вопроса, введенный пользователем, пропускается через функцию htmlspecialchars, преобразующую специальные символы в HTML-сущности. Таким путем предотвращается ввод нежелательных HTML-тегов. Затем результат пропускается через функцию nl2br, вставляющую код разрыва строки <br/> перед каждым переводом строки, чтобы текст вопроса при выводе на веб-странице не слился в одну строку.

IP-адрес пользователя определяется с помощью функции getenv, которая возвращает значение переменной окружения, в данном случае - REMOTE_ADDR.

Поделиться с друзьями: