【问题标题】:Dropdown-Menu with optgroup带有 optgroup 的下拉菜单
【发布时间】:2011-08-08 21:20:31
【问题描述】:

我正在尝试创建一个动态下拉菜单,它在脚本启动时从 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',''])])]));

效果很好。

当我尝试将 popup_menu 的 -values-parameter 放入标量变量时,问题就开始了。 应该以某种方式类似于那个:

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

或用单引号。

目标是通过连接 xml 文件的语法更正元素来构建该字符串。那是因为我不知道有多少 optgroup 或 optgroup 中的列表元素将存在。 有什么想法吗?

提前谢谢

乔辰

【问题讨论】:

    标签: perl cgi drop-down-menu optgroup


    【解决方案1】:

    那么您有一个用于生成该字符串的 XML 文件?为什么不直接生成popup_menu 调用所需的数据结构呢?它只是一个数组(您可以在“分析”XML 文件时调用optgroup

    如果您真的想使用字符串解决方案,那么您可以使用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>
    

    【讨论】:

    • 您的第一个解决方案听起来很有趣,但我是如何意识到这一点的?已经打开文件句柄并将这些行泵入一个数组。下一步是操作字符串以匹配optgroup 命令所需的语法。还是我最好使用xml::simple-Package?
    • 我认为像 XML::Simple 这样的 XML 解析器更适合这项任务,因为它简化了对所需数据的访问。我还添加了一个示例说明我将如何做到这一点(我创建了一些简单的 XML 格式,您的可能会有所不同,因此可能需要其他路径来访问数据)
    猜你喜欢
    • 2018-06-19
    • 2015-04-03
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    相关资源
    最近更新 更多