2016-08-05 3 views
3

Привет У меня проблема с проверкой, я использую приложение yii2 Advanced.Проверка для parent_id в yii2

У меня есть parent_id при создании меню. Я предоставляю имя меню и предоставляю, чтобы это меню было родительским или нет, если установлен флажок родительского меню, если не выбран из раскрывающегося списка меню.

Проблема заключается в том, чтобы сделать этот родительский идентификатор, как требуется в модели по правилам, а затем в представлении оба флажка и выпадающего списка будут проверяться, и оба они будут показаны. Но я хочу только одного из них. Если я не даю его по мере необходимости, то сама проверка не происходит. См. Ниже изображение.
In this both check-box and drop-down is required.

Вот моя активная форма ..

<?= $form->field($model, 'parent_id')->checkbox(array( 
    'id'=>'new', 
    'value'=>'0', 
    'labelOptions'=>array('style'=>'padding:5px;'), 
    'disabled'=>false 
    )); ?> 

<div class="select" id="select"> 
<?= $form->field($model,'parent_id')->widget(Select2::classname(), [ 
'data' => $menu, 
'options' => ['placeholder' => 'Select a Menu name ...'], 
'pluginOptions' => [ 
    'allowClear' => true 
], 
]); ?> 
</div> 

Я хочу валидация быть, если оба из них были оставлены пустыми. Пожалуйста, скажите мне какое-нибудь решение.

ответ

0

я думаю, что вы должны использовать пользовательскую проверку для этой цели:

public function rules() 
    { 
     return [ 
      ['field1', function ($attribute, $params) { 
        // if (...) 
        $this->addError($attribute, 'Must field1 or field2 be set'); 
       } 
      }], 
     ]; 
    } 
1

Первых и для более чистого кода, если я правильно понимаю ваши требования, я хотел бы предложить введение нового виртуального атрибута вашей модели класса вместо 2 полей присвоены различные значения того же атрибута:

$form->field($model,'is_parent')->checkbox(...) // don't do 'value'=>'0' here. it will be auto mapped to model virtual attribute. 
$form->field($model,'parent_id')->widget(...) 
/* 
instead of : 
    $form->field($model,'parent_id')->checkbox(...) // parent_id is 1 or 0 here 
    $form->field($model,'parent_id')->widget(...) 
*/ 

Затем нанесите Conditional Validation в вашу модель правила S используя when свойство:

public $is_parent; 

public function rules() 
{ 
    return [ 
     ['is_parent', 'boolean'], 
     // 'parent_id' is required only if the checkbox is not checked 
     ['parent_id', 'required', 'when' => function($model) { 
      return !$model->is_parent; 
     }], 
    ]; 
} 

Примечание: Связанные документы также говорит:

Если вы также должны поддерживать условную проверку на стороне клиента, вы должны настроить whenClient свойство, которое принимает строка , представляющая функцию JavaScript, возвращаемое значение которой определяет , применять ли правило или нет.

Ожидается, что сценарий проверки клиента будет основываться на ваших первоначальных правилах. поэтому у вас есть 2 варианта. Либо вы полностью отключить его в ActiveForm и использовать Ajax проверки вместо:

<?php $form = ActiveForm::begin([ 
    ... 
    'enableClientValidation' => false, 
    'enableAjaxValidation' => true 
]); ?> 

Или другой вариант, чтобы добавить недостающую клиента, связанный сценарий к вашим правилам, как показано в документации, которая может выглядеть следующим образом в вашем случае :

public function rules() 
{ 
    return [ 
     ['is_parent', 'boolean'], 

     ['parent_id', 'required', 'when' => function($model) { 
      return !$model->is_parent; 
     }, 'whenClient' => "function (attribute, value) { 
      return !$('#menu-is_parent').val(); 
     }"], 
    ]; 
} 
  • Отметим здесь, что я ожидал вашего formName() вернуться 'menu'. По умолчанию он возвращает имя класса модели. вы также можете использовать инструменты вашего браузера для проверки ввода флажка и посмотреть, что id присваивает ему Yii.

Наконец, если определенное parent_id значение должно быть установлено, когда флажок установлен, вы можете использовать beforeSave() или afterValidate() вручную установить его на любое значение, вам нужно, как может быть:

public function beforeSave($insert) 
{ 
    if ($this->is_parent) $this->parent_id = $someModel->id; 
    return parent::beforeSave($insert); 
} 
+0

Я попробовал ваше предложение, Он не работает, даже если я установил флажок, то parent_id проверяет и требуется. –

+0

проверьте обновление. Я думаю, у вас есть enableClientValidation установлен как true, поскольку это по умолчанию. Если это так, вам нужно либо использовать проверку ajax, либо добавить соответствующий код WhenClient в ваши правила. –

+0

yes enableClientValidation установлен в true. –

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