Выпадающее меню с оптгруппой - PullRequest
1 голос
/ 09 августа 2011

Я пытаюсь создать динамическое выпадающее меню, которое получает свои записи из xml-файла при запуске скрипта.Сначала я попробовал статическую версию, подобную этой:

Tr(td([popup_menu( -name=>'betreff', -values=>[optgroup(-name=>'Mädels', 
-values=>['Susi','Steffi',''], -labels=>{'Susi'=>'Petra','Steffi'=>'Paula'})
,optgroup(-name=>'Jungs', -values=>['moe', 'catch',''])])]));

, которая работала нормально.

Проблема начинается, когда я пытаюсь поместить параметр -values ​​для popup_menu в скалярную переменную.Должно быть как-то похоже на это:

$popup_values = "[optgroup(-name=>'Mädels', -values=>['Susi','Steffi',''], 
-labels=>{'Susi'=>'Petra','Steffi'=>'Paula'}),optgroup(-name=>'Jungs', 
-values=>['moe', 'catch',''])]" 

или с одинарными кавычками.

Цель состоит в том, чтобы создать эту строку путем объединения исправленных синтаксисом элементов xml-файла.Это потому, что я не знаю априори, сколько optgroups или элементов списка в optgroups будет существовать.Есть идеи?

Спасибо заранее

Йохен

1 Ответ

1 голос
/ 09 августа 2011

Итак, у вас есть файл XML, который вы используете для генерации этой строки?Почему бы напрямую не сгенерировать структуру данных, необходимую для вызова popup_menu?Это просто массив (вы можете вызвать optgroup во время «анализа» XML-файла)

Если вы действительно хотите использовать строковое решение, вы можете использовать eval для преобразования строкик структуре данных.Хотя это решение имеет определенные проблемы с безопасностью.

Чтение из XML-файла

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

use strict;
use warnings;
use XML::Simple;
use CGI qw/:standard/;
my $xmlString = join('', <DATA>);

my $xmlData = XMLin($xmlString);

my @popup_values;
foreach my $group (keys(%{$xmlData->{group}})) {
  my (@values, %labels);

  my $options = $xmlData->{group}->{$group}->{opt};
  foreach my $option (keys(%{$options})) {
    push @values, $option;
    if(exists($options->{$option}->{label}) &&
        '' ne $options->{$option}->{label}) {
      $labels{$option} = $options->{$option}->{label};
    }
  }

  push @popup_values, optgroup(-name => $group,
    -labels => \%labels,
    -values => \@values
  );
}


print popup_menu(-name=>'betreff', -values=> \@popup_values);

__DATA__
<?xml version="1.0" encoding="UTF-8" ?>
<dropdown>
  <group name="Mädels">
    <opt name="Susi" label="Petra"/>
    <opt name="Steffi" label="Paula"/>
    <opt name="" />
  </group>
  <group name="Jungs">
    <opt name="moe" />
    <opt name="catch" />
    <opt name="" />
  </group>
</dropdown>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...