2016-08-01 3 views
0

Я использую динамическую форму в yii2. Мои данные регистраци массив как этотПроверка массива в 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. Но я использую сравнить проверки это проверить каждый percentage.But я хочу общий процент. Моя форма как этот

<?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; ?> 

Пожалуйста, помогите любым one.Thanks заранее

+0

Вы хотите проверить сумму процентных атрибутов во всех записях? Таким образом, для предоставленного примера допустимое значение будет 60%? – oakymax

+0

поблагодарить u для ответа. Да, я хочу проверить сумму процента во всех records.yes при условии, что пример подтвержденного значения будет 60 –

ответ

-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'); 
      }  
+3

И вы будете в каждом действии, который должен содержать это правило, вставить этот блок кода? Если правило проверки применяется к атрибуту модели, то, на мой взгляд, оно должно быть написано в этой модели, как это было показано в других ответах. Но это твой код;) –

0

Когда вы размещаете модели, каждый из которых проверяются отдельно, вам нужно написать пользовательскую проверку, которая проверяет все почтовые данные той же модели. Что-то вроде этого:

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

поблагодарить u за ответ .i проверить его и сообщить u, как он работает –

+0

это не работает для меня –

+0

Я просто сделал быструю проверку здесь и si работал нормально. Вы заметили мой комментарий? Значения процента - это просто цифры или вы отправляете как '" 30% "' (строка с '"% "')? Если это так, вам просто нужно несколько настроек для обработки строки. – Clyff

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 
    } 
} 
+0

thank u for reply Когда я вызываю validatePercentage(), он входит в функцию, но валидация не работает. Form отправлен –

Смежные вопросы