【问题标题】:Foreach form in array validation数组验证中的 Foreach 表单
【发布时间】:2017-03-11 19:58:47
【问题描述】:

感谢阅读:D

我正在创建一个在线订单系统。您将看到 3 个输入。 PartnumberQuantityPrice。您只需填写 Partnumber 和 Quantity。将通过我的数据库检查价格是否合适。我试图创建该功能,但仍然无法正常工作。但无论如何。我包含了一个 jQuery 函数,因此当您想要订购更多产品时,您可以在表单中添加额外的行。

一点点sn-p,这样你就知道我的意思了。

    $('#addpart').click(function(){
  var loop = $('#loop').val();
  var html;
  html = '<p>';
  html += '<input type="text" name="part[]" style="margin-left:20px;" class="text medium" id="part" placeholder="SP partnumber" />';
  html += '<input type="text" name="qty[]" style="margin-left:20px;" class="text small" placeholder="Qty" />';
  html += '<input type="text" style="margin-left:20px;" class="text small" id="price" placeholder="Price" tabindex="-1" readonly />';
  html += '</p>';
  for (i = 0; i < loop; i++) {
    $("#form").append(html);
}

});

因此,当您发布此表单时,我们不知道它将有多少个字段。有时是 5 个订单行,有时是 10 个。 所以我开始在我的输入字段中使用[]。 输入name 属性将是这样的:"part[]"

表单将使用Validation 类进行验证。 为了向我的班级展示这个页面会很长 ghehe。 这是一个小sn-p如何使用这个类/函数,以便您了解结构。

if(toxInput::exists()){
    if(toxtoken::check(toxInput::get('token'))){

        $toxValidate = new toxValidate();
        $toxValidation = $toxValidate->check($_POST, array(
            'name'  => array(
                'required'  => true,
                'min'               => 2,
                'max'       => 50
            )
        ));

        if($toxValidation->passed()){
    etcetcetc..

所以订单应该是这样的:

$toxValidate = new toxValidate();
    $toxValidation = $toxValidate->check('$_POST', array(
        'part1' => array('required' => TRUE, 'maxlength' => 14),
        'part2' => array('required' => TRUE, 'maxlength' => 14),
        'part3' => array('required' => TRUE, 'maxlength' => 14),
        'part4' => array('required' => TRUE, 'maxlength' => 14),
        'part5' => array('required' => TRUE, 'maxlength' => 14)
    ));

我如何为每个填写的行打印此行'part1' =&gt; array('required' =&gt; TRUE, 'maxlength' =&gt; 14)。我用foreach[] 尝试了几种方法。 一切都没有工作.. :(

【问题讨论】:

  • 发布Validation类文档的链接。
  • 这里我们开始:paste.ofcode.org/37W7WePcu57a8mf6QLk6vDX 但它只需要在Validation-&gt;check 函数中创建数组。从提交的表格中。 Check 需要检查每个inputpart[0]part[1]
  • 当您提交带有数组输入的表单时,例如part[],然后$_POST['part'] 将是一个数组。注意我说的是$_POST['part'] 而不是$_POST['part[]']。您的课程仅限于非数组输入,因为它正在寻找后者。您需要添加逻辑来处理数组输入。
  • 谢谢,但不能将 foreach part[] 转换为 part' =&gt; TRUE, 以便我的 validation 班级检查它吗?我的validation 类将检查数组中的items allready。我需要将part 数组与我在check 函数中使用的forms 数组结合起来。
  • 或者最好绕过validation类并以其他方式检查它,这样会更容易?

标签: php arrays forms


【解决方案1】:

我想您需要扩展您的 Validation 类,以便能够以最舒适的方式验证数组。

你可以尝试像这样处理数组变量(只是一个例子):

$toxValidate->check($_POST, [
    'name' => [
        'required' => TRUE,
        'min' => 2,
        'max' => 50,
    ],
    'qty' => [
        'required' => TRUE,
        'array' => TRUE,
        'min' => 2,
        'max' => 14,
    ],
]);

Validation 类的底层,只需循环遍历传递的 qty 数组的值(如果 is_array($toxValue)),并将您的规则应用于该数组的每个成员(最小值、最大值等)。

另外,我建议重构您的 Validation 类:使用回调或类成员函数来调用单独的验证规则(不是最好的 OOP 方式,但对于简单的情况是可行的)。像这样:

class Validation
{
    ...

    public function ruleMax($value)
    {
        ... // Validate value max
    }

    public function ruleMin($value)
    {
        ... // Validate value min
    }
}

如果您需要向类(或子类)添加更多验证规则,则无需完全重写 check 函数。

顺便说一句,我建议看看它是如何在 Laravel 等流行框架中制作的: https://laravel.com/docs/5.4/validation#validating-arrays

类本身是规则解耦的一个简单示例(当然不是最好的示例):https://github.com/laravel/framework/blob/5.1/src/Illuminate/Validation/Validator.php

【讨论】:

  • 感谢您的回答。仍然没有真正得到你建议的结构,但我会尝试一些。阵法不是我最强的技能。关于我的Validation 类在函数中使用验证规则,那部分我真的不明白。我现在不需要重写我的验证规则吗?当我需要一个新规则时,我只需添加一个新的switchcase。关于 Laravel。几个月前我试图查找,但仍然没有得到结构。我在过去学习了很多 PHP。 oldscool PHP,现在我尝试使用 OOP/PDO,但有时仍然像现在一样很难。
  • 由于multiple unknow forms,我想我会在系统的这一部分绕过这个validation类。尤其是它们实际上并不需要真正的验证规则。
  • > oldscool PHP 和现在我尝试使用 OOP/PDO 但有时仍然像现在一样非常困难 现在这很有意义。试试看这个函数:github.com/laravel/framework/blob/5.1/src/Illuminate/Validation/… 代码注释很好。查找 foreach 循环 - 您将看到 $this-&gt;validate() 调用。接下来看看$this-&gt;validate($attribute, $rule) - 它使用$method = "validate{$rule}"; 作为函数名。示例调用:$this-&gt;validate('name', 'min') 将导致$this-&gt;validateMin() 调用。这种结构将帮助您摆脱switch/case
  • 现在关于数组验证:在表单请求之后,您将在$_POST['qty'] 中获得一个数组。像这样:$arr = $_POST['qty']。接下来你需要检查变量是否是一个真正的数组,像这样:is_array($arr)。如果你有一个数组(函数返回true),你可以通过Validator 中这个数组的所有元素循环foreach,就像这样:pastebin.com/1D56X0he 那是一个伪代码。另外,如果你想刷新关于 PHP 数组的知识,请尝试使用官方文档:php.net/manual/en/language.types.array.php
  • 所以你的意思是我需要修改我的validation 类。因此,我可以像这样应用它,而不是应用像'part' =&gt; array('required' =&gt; TRUE) 这样的规则:`$Validate->('required', toxInput::get('po'));是这个意思吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 2021-11-17
  • 1970-01-01
  • 2018-07-08
  • 2020-05-05
  • 2016-08-28
相关资源
最近更新 更多