【问题标题】:Perl Mason get value of a checkboxPerl Mason 获取复选框的值
【发布时间】:2012-05-25 16:44:42
【问题描述】:

如何获取复选框的值并将其放入变量中以插入 DB?

$request->param(cb) 没有获得价值
复选框位于 mason2 组件(.mc)中,复选框的值将传递给另一个组件。所以我必须找到一种在提交时获取价值的方法
这是code

<input type="checkbox" name="cb" value="" onclick="$(this).attr('value', this.checked ? 1 : 0)">  

【问题讨论】:

  • 这和 Perl 有什么关系?看起来你的 onclick 函数是用 jQuery 编写的。
  • 复选框位于 mason2 组件(.mc)中,复选框的值将传递给另一个组件。所以我必须想办法在提交时获取价值。
  • 这需要更具体的细节才能回答
  • 我很确定 DVK 意味着看到两行代码是不够的,因此您必须提供更多代码,例如有关该组件的更多信息(例如至少一个指向它的链接或其他内容),还有php代码。可能是一些截图。否则太难理解了:)
  • @Andrius Naruševičius:Mason2 与 php 无关。一段简单的 perl/Mason 代码需要什么屏幕截图?

标签: perl mason


【解决方案1】:

简化代码:

<input type="checkbox" name="cb" value="1">  

根据定义,当复选框被选中时,浏览器将发送值,如果未选中复选框,则不会发送任何内容。您希望将“nothingconvert 转换为“0”,因此只需在 Mason2 组件中执行以下操作:

has 'cb';

#... and where you need the 0/1 checkbox value simply use the $.cb
my $cb01 = $.cb ? 1 : 0;

所以,当复选框被点击时,将得到 1,否则为 0。

添加一个完整的例子:

Mason2 组件:cbf.mc#checkbox 表单

<form action="cbs">
    <input type="checkbox" name="cb" value="1">
    <input type="submit">
</form>

Mason2 组件:cbs.mc #checkbox 显示

 <%class>
 has 'cb';
 </%class>

 The checkbox value is: <% $.cb ? 1 : 0 %>

制作以上两个组件,并将浏览器指向:

 http://url/path/to/cbf

你会得到一个简单的表格。现在不要选中或选中复选框(如您所愿)并按提交。组件cbs.mc 将显示该值。勾选后你会得到“1”而不是“0”。

真的很简单。

或者,你试试下面的cbs.mc

<%class>
has 'cb' => (default => 0);
</%class>

The chebox value is: <% $.cb %>

更清晰并使用默认值。这两个示例都是可行的解决方案。

【讨论】:

  • 有没有办法使用 jquery (onclick="$(this).attr('value', this.checked ? 1 : 0)") 并从中获取价值?跨度>
  • 为什么要为一件非常简单的事情提供复杂的解决方案?查看完整的工作示例 - 我在答案中添加的内容。
【解决方案2】:

我有一个类似的问题,并在尝试解决它时偶然发现了这个线程。在我的场景中,我有几个具有相同值的复选框(想想数据库中的每行“是/否”)。我想出了一个简单易懂的解决方案。

假设我们的值是“Y”(选中)或“N”(未选中)。

为每个订单项添加一个“N”隐藏字段。这可确保您收到每一行的值。然后,同名的复选框字段将告诉我们事物是否为“Y”。你最终会得到什么,假设第二个和最后一个检查的 4 个元素是一个 qw(N N Y N N Y) 的数组。只需转换为字符串,将 'NY' 值交换为 'Y' 并转换回来。你会得到正确的 qw(N Y N Y)。

#HTML
%foreach ... {
<input type=hidden name=shouldwe value='N'><input type=checkbox name=shouldwe value='Y'>
%}

#Processing
$list = join('', @shouldwe);
$list =~ s/NY/Y/g;
@shouldwe = split(//, $list);

【讨论】:

    【解决方案3】:

    对于这样的任务,WWW::Mechanize 和 HTML::TokeParser 的组合是您的朋友。前者通过单击按钮、链接等帮助您导航,而后者对 HTML 进行切片和切块。

    在这种情况下,您只需导航到页面,扫描数据以查找“输入”标签(即“复选框”是“输入”的一种),然后测试每个输入以查看“名称”属性是否匹配你追求的那个。找到正确的“输入”标签后,您只需获取“已检查”属性的值,然后您就可以使用您喜欢的标签了。

    例如:

    use WWW::Mechanize;
    use HTML::TokeParser;
    
    my $checkbox_name = "cb";
    my $url = 'http://some_url/';
    
    my $page = WWW::Mechanize->new(autocheck =>1);
    $page->get($url);
    my $pagedata = HTML::TokeParser->new(\$page->{content});
    
    while (my $token = $pagedata->get_tag("input")) {
        my @tokenarray = @$token;
        my $attr_ref = $tokenarray[1];
        my %attr = %$attr_ref;
    
        # dump the contents of the hash
        foreach my $k (keys %attr) {
            print "$k: $attr{$k}\n";
        }
        print "\n";
    
        if ($attr{name} eq $checkbox_name) {
            print "found it!\n";
            print "status = ", $attr{checked}, "\n";
            last;
        }
    }
    

    在这个例子中,“导航”部分是微不足道的,如果没有 WWW::Mechanize,你可能也能过关。但是,在某些情况下,您需要提交输入、单击按钮、使用链接等,因此它通常会派上用场。

    【讨论】:

    • 感谢您的回答。由于某种原因,当我转储 $pagedata cb 时没有列出。
    • 我更新了示例以在每次找到“输入”标签时转储散列的内容。如果有一个名称属性 = 'cb' 的输入,那么它应该被打印出来。另外,不要忘记更新代码中的 $url 以指向正确的页面。
    • 公认的解决方案与问题有什么关系?这是从给定 URL 解析获取的 html 源的解决方案,而不是在 Mason 组件内部。所以,@mamesaye 如果你接受这个答案,你应该重新提出你的问题。
    猜你喜欢
    • 2016-02-25
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多