Динамическое изменение интерфейса

Материал из ISPWiki

Перейти к: навигация, поиск

Рассмотрим пример изменения интерфейса в зависимости от определенных условий.

Постановка задачи

  • Имеем панель управления ISPmanager
  • Пользователь с именем john в качестве интерфейса веб-почты предпочитает не стандартный Squremail, а Roundcube
  • Roundcube на нашем сервере доступен по ссылке /roundcube

Действия

1) Создаем файл описания плагина /usr/local/ispmgr/etc/ispmgr_mod_choosewebmail.xml со следующим содержимым

<?xml version="1.0" encoding="UTF-8"?>
  <mgrdata>
    <handler name="choosewebmail.pl" type="xml">
      <event after="yes">desktop</event>
    </handler>
  </mgrdata>

2) Создаем файл обработчик /usr/local/ispmgr/addon/choosewebmail.pl со следующим содержимым

#!/usr/bin/perl
use XML::LibXML;
my $d = XML::LibXML->new->parse_string(join "", <STDIN>);
 
if ($ENV{"REMOTE_USER"} == "john") {
  @webnodes = ($d->findnodes("//node[@name='webmail']"));
  if ($#webnodes != -1) {
    $webnodes[0]->setAttribute("function","/roundcude");
  }
}
 
print $d->toString;

3) Устанавливаем права на файл обработчик

chmod 750 /usr/local/ispmgr/addon/choosewebmail.pl
chown 0:0 /usr/local/ispmgr/addon/choosewebmail.pl

4) Перезапускаем ISPmanager

Пояснения

Как и в предыдущем примере мы воспользовались возможностью запустить свой скрипт во время выполнения тех или иных функций панели управления. Однако теперь мы используем способ передачи данных xml

<handler name="choosewebmail.pl" type="xml">

Данный способ позволяет влиять на данные уже сформированные панелью управления, т.е. мы имеем возможность что угодно добавить/изменить/удалить.

Обработчик в данном примере получает в стандартный ввод сформированный панелью управления XML-документ, содержащий описания интерфейса, текстовые надписи в необходимой локализации и данные. Для удобства работы с XML документом мы используем библиотеку XML::LibXML и преобразуем данные из стандартного ввода в XML объект

use XML::LibXML;
my $d = XML::LibXML->new->parse_string(join "", <STDIN>);

Далее мы выполняем проверку того, что пользователь, делающий запрос, имеет имя john

if ($ENV{"REMOTE_USER"} == "john") {

В реальных плагинах, конечно, условие будет сложнее, лучше сделать настройку пользователю "Предпочитаемый вебмайл" и определять, какой вебмайл ему отображать. Но задача выходит за рамки примера, и мы просто проверяем, что пользователь имеет имя john.

Теперь нам нужно найти элемент, описывающий ссылку на вебмайл, это тэг с именем node, имеющий атрибут "name" равный "webmail"

@webnodes = ($d->findnodes("//node[@name='webmail']"));

Проверяем, что такой пункт в меню существует и если есть, то меняем в нем атрибут "function", описывающий ссылку

 if ($#webnodes != -1) {
   $webnodes[0]->setAttribute("function","/roundcude");
 }

В конце обработчик должен вернуть XML-документ, которым будет заменен уже сформированный панелью управления.

print $d->toString;

Даже если ваш обработчик ничего не меняет в документе, но имеет тип xml, верните тот документ, который был получен на входе.


Смотрите также дополнительный пример

Была ли эта информация полезной? Да | Нет
Личные инструменты