阵列验证中的Foreach表单

时间:2017-03-11 19:58:48

标签: php arrays forms

感谢您阅读:D

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

一小段代码,让你知道我的意思。

    $('#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。 这里有一个小片段如何使用这个类/函数让你知道结构。

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' => array('required' => TRUE, 'maxlength' => 14)。我使用foreach[]尝试了几种方法。 一切都没有用.. :(

1 个答案:

答案 0 :(得分:0)

我认为您需要扩展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)并将规则应用于该数组的每个成员(min,max,等)。

另外,我建议重构你的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