我在 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; ?>
请帮助任何人。提前致谢
发布模型时,每个模型都会单独验证,是否需要编写一个自定义验证来检查同一模型的所有发布数据。像这样的东西:
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;
}
}
}
}
这必须在模型之外完成。我建议您将其添加到控制器或作为辅助组件。
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
}
}
我终于在控制器中编写了自己的验证。
$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');
}