【问题标题】:laravel 4 - Input old for arrayed checkboxlaravel 4 - 输入旧的阵列复选框
【发布时间】:2014-08-13 09:20:34
【问题描述】:

我有一个带有多个属性的复选框循环。一个内容可能有多个属性,因此用户可以检查多个属性。

如果此表单中出现某些验证错误,我需要预先获取已检查的属性。

@foreach($attributes as $entry)



    <div class="check-line">

        <input type="checkbox" id="cat4" class='icheck-me' 
          name="attribute[<?php echo $entry->id; ?>]" 
            data-skin="square" 
            data-color="blue" 
            value="{{$entry->id}}" 
            <?php 
                if(Input::old('attribute['.$entry->id.']')== $entry->id) { 
                    echo 'checked="checked"'; 
                }
            ?>
        />

        <label class='inline' for="cat4">
            <strong>{{$entry->name}}</strong>
        </label>

    </div>
@endforeach

我在上面试过但没有运气..有什么想法吗?

【问题讨论】:

  • 在我看来您需要在数组中搜索:&lt;input type="checkbox" name="attribute[&lt;?php echo $ii; ?&gt;]" value="&lt;?php echo $entry-&gt;id; ?&gt;" &lt;?php if (in_array($entry-&gt;id, Input::old('attribute'))) echo 'checked'; ?&gt;&gt; 对吗?

标签: php validation checkbox laravel laravel-4


【解决方案1】:

对此的更全面的答案是进行数组搜索,而不仅仅是检查当前索引。因此,我看到代码如下所示:

@foreach($attributes as $entry)
    <div class="check-line">
        <input type="checkbox" id="cat4_{{{ $entry->id }}}" class="icheck-me"
               name="attribute[]"
               data-skin="square"
               data-color="blue"
               value="{{{ $entry->id }}}"
               @if (in_array($entry->id, Input::old('attribute')))
                   checked
               @endif
            />

        <label class="inline" for="cat4_{{{ $entry->id }}}">
            <strong>{{{ $entry->name }}}</strong>
        </label>
    </div>
@endforeach

所以首先我让代码更符合 Blade 标准:

  • 任何回声现在都是{{{}}},而不是之前的&lt;?php echo ___; ?&gt;{{/}} 的组合(我选择{{{ 而不是{{,因为它不是HTML 被回显并且最好更安全)
  • &lt;?php if () { 现在是 Blade @if ()

name 属性现在只是一个标准数组(不包括索引,因为它不需要),但是id 属性以前为所有复选框提供了相同的 ID。虽然浏览器会允许您这样做,但从技术上讲,这是非法的 HTML,因此我已将条目 ID 附加到每个复选框。

最后,if 条件不再检查具有当前索引的输入的值是否与当前条目的 ID 匹配,而是在返回的数组中搜索当前条目的 ID 是否为 anywhere .这可以防止您的条目以与之前在页面上的顺序不同的顺序返回。

我们现在不依赖 $ii 变量,因此也可以删除它。


注意事项:

在此过程中,我使代码变得更好,但代码不再相同。在不确切知道为什么使用 $ii 变量来为 attribute 数组提供密钥的情况下,我不能说使用我的代码可以正常工作。但是,假设它只是用来帮助处理这个旧的输入问题,那就没问题了。

另外,我将{{ 更改为{{{ 可能会产生我不知道的后果。我本来以为$entry-&gt;id 的东西会很好,但也许&lt;label&gt; 中的$entry-&gt;name 出于某种原因需要转义HTML。随意改回来。

【讨论】:

  • 我知道为什么我很少使用 {{{ ... }}}。我更喜欢在存储数据的那一刻过滤/转义数据。它一直对我有用。如果我需要获得未转义的版本,我会同时存储转义和未转义的内容。否则我会非常头疼地弄清楚内容是否可信,我是否已经逃脱/过滤了它等等。
  • 啊,很公平。我曾经是一个输入转义的人,但它最终使其他形式的输出(比如纯文本电子邮件、CSV 文件等)变得非常尴尬,因为你现在必须取消转义。我知道这是半打一,因为在输出上转义可以避免头痛,但随后您会获得“现在我要再次逃脱什么?”头痛。另外,三重支撑这些回声非常容易,然后你就会受到可能的攻击。
  • (以上更正:很容易忘记三重括号!)
【解决方案2】:

来自Requests 上的 Laravel 文档:

"在处理带有“数组”输入的表单时,您可以使用点符号来访问数组:"

$input = Input::get('products.0.name');

所以你应该也可以这样做 fpr Input::old()

<?php 
    if(Input::old('attribute.' . $ii) == $entry->id) { 
        echo 'checked="checked"'; 
    }
?>

【讨论】:

  • 非常感谢......这些天人们忘记在 stackoverflow 上投票了......我希望你能得到 10 票
  • 从技术上讲,我认为这不像我的评论那样准确 - 它假定复选框和值始终处于相同的顺序。它们可能会,但如果您更改订购$attributes 的方式,您可能会遇到奇怪的问题,即只记住一些的检查。
  • @alexrussell 我认为你是对的。也许添加另一个答案并让 timus2001 将您的标记为已接受?你的方式更可靠。
  • 嗯,实际上由于作者使用name="attribute[&lt;?php echo $ii; ?&gt;]",所以我的回答应该可以正常工作。但是,是的,我仍然同意你的方式。
  • @Unnawut this 怎么样?我有一种感觉,因为你的已经被接受并且需要更少的工作来理解和实施任何东西都不会改变,但如果可以的话,我愿意提供细节和改进建议。哦,好吧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 2013-10-13
  • 1970-01-01
  • 2019-12-07
  • 2015-03-19
  • 2015-06-22
  • 1970-01-01
相关资源
最近更新 更多