Первых и для более чистого кода, если я правильно понимаю ваши требования, я хотел бы предложить введение нового виртуального атрибута вашей модели класса вместо 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);
}
Я попробовал ваше предложение, Он не работает, даже если я установил флажок, то parent_id проверяет и требуется. –
проверьте обновление. Я думаю, у вас есть enableClientValidation установлен как true, поскольку это по умолчанию. Если это так, вам нужно либо использовать проверку ajax, либо добавить соответствующий код WhenClient в ваши правила. –
yes enableClientValidation установлен в true. –