yii2 中的数组验证?

问题描述 投票:0回答:3

我在 yii2 中使用动态表单。我的发布数据是这样的数组

[ModelAddress] => Array
    (
        [0] => Array
            (
                [fullname] => xxxx
                [lastname] => xxxx
                [date] => 15 Apr 1985
                [DOB] => 09 Jan 1985
                [percentage] => 20 %
            )

        [1] => Array
            (
                [fullname] => xxx
                [lastname] => xxxx
                [date] => 15 Apr 1985
                [DOB] => 09 Jan 1985
                [percentage] => 20 %
            )

        [2] => Array
            (
                [fullname] =>xxxx
                [lastname] => xxx
                [date] => 15 Apr 1985
                [DOB] => 09 Jan 1985
                [percentage] => 20 %
            )

我想检查总百分比必须为 100。但我正在使用比较验证,它验证每个百分比。但我想要总百分比。 我的表格是这样的

 <?php foreach ($modelsAddress as $i => $modelAddress): ?>
            <div class="item panel">


                    <div class="pull-right">
                        <button type="button" class="remove-item btn btn-danger btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
                    </div>
                    <div class="clearfix"></div>

                <div class="panel-body">
                         <div class="row">
                            <div class="col-sm-2">
                            <?= $form->field($modelAddress, "[{$i}]fullname")->textInput(['maxlength' => true])->label(false) ?>
                            </div>
                            <div class="col-sm-2">
                            <?= $form->field($modelAddress, "[{$i}]lastname")->textInput(['maxlength' => true])->label(false) ?>
                            </div>
                            <div class="col-sm-2">
                            <?= $form->field($modelAddress, "[{$i}]date")->textInput(['maxlength' => true])->label(false) ?>
                            </div>
                            <div class="col-sm-2">
                            <?= $form->field($modelAddress, "[{$i}]DOB")->textInput(['maxlength' => true])->label(false) ?>
                             </div>
                            <div class="col-sm-2">
                            <?= $form->field($modelAddress, "[{$i}]percentage")->textInput(['maxlength' => true])->label(false) ?>
                           </div>
                       </div>

                </div>
            </div>
        <?php endforeach; ?>

请帮助任何人。提前致谢

php arrays validation yii2 yii2-advanced-app
3个回答
1
投票

发布模型时,每个模型都会单独验证,是否需要编写一个自定义验证来检查同一模型的所有发布数据。像这样的东西:

public function rules()
{
    return [
        ...
        [['percentage'], 'validatePost']
    ];
}

public function validatePost($attribute)
{
    $posts = Yii::$app->request->post($this::formName());
    $total = 0;

    if (is_array($posts)) {
        foreach ($posts as $post) {
            $total += $post[$attribute]; // I'm assuming values are numbers

            if ($total > 100) {
                $this->addError($attribute, 'It\'s over 100%.');
                break;
            }
        }
    }
}

0
投票

这必须在模型之外完成。我建议您将其添加到控制器或作为辅助组件。

private function validatePercentage($models) {
    if (array_sum(ArrayHelper::toArray($models, "percentage")) != 100) {
        array_walk($models, function($model) {
            $model->addError("percentage", "All percentages must add up to 100%");
        });
    }
}

public function actionAdd() {
    // instantiate your models and do initial validation
    if ($this->validatePercentage($models)) {
        //Do saving or whatever
    }
}

-1
投票

我终于在控制器中编写了自己的验证。

 $postvalue = Yii::$app->request->post();                         
          foreach ($postvalue['ModelAddress'] as $value) {
                $total = $total +$value['percentage'];
          } 


          if($total != 100)
          {
            Yii::$app->session->setFlash('error', 'Percentage Must be 100');
          }else{
            return $this->redirect('/Home');
          }    
© www.soinside.com 2019 - 2024. All rights reserved.