2015-06-23 2 views
2

Я использовал dynamic form widget. Поля формы показаны на изображении ниже. Как вы видите, есть флажок с именем cancel. То, что я хочу, - если щелкнуть галочку cancel, ей будет нужен только номер чека, а остальное будет пустым. Без использования динамической формы я с легкостью реализую это с помощью валидаторов when и whenClient, так как я могу точно установить name этого флажка.YII2 Добавление whenClient в динамическую форму

Проблема здесь состоит в том, что динамическая форма порождает такого рода name серии для флажков ...

TblDvBub[0][is_cancelled][] 
TblDvBub[1][is_cancelled][] 
TblDvBub[2][is_cancelled][] 

enter image description here

ответ

2

Я думаю, что вы могли бы извлечь имя is_cancelled флажком с помощью атрибута». name 'from' whenClient '=>' function (attribute, value) {} '. console.log, что «атрибут» - должен существовать объект с свойством «name» - там вы можете получить число (используйте регулярное выражение) текущего TblDvBub. Кстати, почему вы используете несколько полей is_cancelled [] - разве это уже не относится к определенному Subarray TblDvBub?

+0

Да вы правильно. Я извлек имя, используя 'attribute.name'. Благодарю. – beginner

+0

Хороший ответ. Спасибо. –

-1

1) в форме, вы должны переопределить FieldClass

<?php $form = ActiveForm::begin([ 
    'fieldClass' => 'backend\widgets\ActiveField' 
]); ?> 

2) Для того, чтобы переопределить метод

<?php 
class ActiveField extends \yii\widgets\ActiveField 
{ 
    protected function getClientOptions() 
    { 
     $attribute = Html::getAttributeName($this->attribute); 
     if (!in_array($attribute, $this->model->activeAttributes(), true)) { 
      return []; 
     } 
     $enableClientValidation = $this->enableClientValidation || $this->enableClientValidation === null && $this->form->enableClientValidation; 
     $enableAjaxValidation = $this->enableAjaxValidation || $this->enableAjaxValidation === null && $this->form->enableAjaxValidation; 
     if ($enableClientValidation) { 
      $validators = []; 
      foreach ($this->model->getActiveValidators($attribute) as $validator) { 
       /* @var $validator \yii\validators\Validator */ 
       $js = $validator->clientValidateAttribute($this->model, $attribute, $this->form->getView()); 
       if ($validator->enableClientValidation && $js != '') { 
        if ($validator->whenClient !== null) { 
         $js = "if (({$validator->whenClient})(attribute, value, '{$this->form->id}')) { $js }"; 
        } 
        $validators[] = $js; 
       } 
      } 
     } 
     if (!$enableAjaxValidation && (!$enableClientValidation || empty($validators))) { 
      return []; 
     } 
     $options = []; 
     $inputID = $this->getInputId(); 
     $options['id'] = $inputID; 
     $options['name'] = $this->attribute; 
     $options['container'] = isset($this->selectors['container']) ? $this->selectors['container'] : ".field-$inputID"; 
     $options['input'] = isset($this->selectors['input']) ? $this->selectors['input'] : "#$inputID"; 
     if (isset($this->selectors['error'])) { 
      $options['error'] = $this->selectors['error']; 
     } elseif (isset($this->errorOptions['class'])) { 
      $options['error'] = '.' . implode('.', preg_split('/\s+/', $this->errorOptions['class'], -1, PREG_SPLIT_NO_EMPTY)); 
     } else { 
      $options['error'] = isset($this->errorOptions['tag']) ? $this->errorOptions['tag'] : 'span'; 
     } 
     $options['encodeError'] = !isset($this->errorOptions['encode']) || $this->errorOptions['encode']; 
     if ($enableAjaxValidation) { 
      $options['enableAjaxValidation'] = true; 
     } 
     foreach (['validateOnChange', 'validateOnBlur', 'validateOnType', 'validationDelay'] as $name) { 
      $options[$name] = $this->$name === null ? $this->form->$name : $this->$name; 
     } 
     if (!empty($validators)) { 
      $options['validate'] = new JsExpression("function (attribute, value, messages, deferred, \$form) {" . implode('', $validators) . '}'); 
     } 
     // only get the options that are different from the default ones (set in yii.activeForm.js) 
     return array_diff_assoc($options, [ 
      'validateOnChange' => true, 
      'validateOnBlur' => true, 
      'validateOnType' => false, 
      'validationDelay' => 500, 
      'encodeError' => true, 
      'error' => '.help-block', 
     ]); 
    } 
} 
?> 

3) Проверка может быть использована

<?php 
'whenClient' => "function(attribute, value, form) { 
        $("form# " + form + " > attribute") 
       }" 
?> 
Смежные вопросы