Динамическое изменение интерфейса
Материал из 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
Пояснения
Как и в предыдущем примере мы воспользовались возможностью запустить свой скрипт во время выполнения тех или иных функций панели управления. Однако теперь мы используем способ передачи данных 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, верните тот документ, который был получен на входе.
Смотрите также дополнительный пример
