В представлении я это реализовал так:
Код: Выделить всё
<?php Pjax::begin(['id' => 'choosingForm']); ?>
<?php
$form = ActiveForm::begin([
'id' => 'companycreate-form',
'enableAjaxValidation' => true,
'enableClientValidation' => true,
'validationUrl' => \yii\helpers\Url::to(['validate-form']),
'options' => ['enctype' => 'multipart/form-data'],
]);
?>
<?= $form->field($model, 'of', ['inline'=>true, 'enableLabel'=>false])
->radioList([
'1'=>Yii::t('companies','PRIVATE_PERSON_TITLE'),
'2'=>Yii::t('companies','COMPANY_PERSON_TITLE'),
], [
'id' => 'of-radio',
'class' => 'btn-group',
'data-toggle' => 'buttons',
'unselect' => null,
'item' => function ($index, $label, $name, $checked, $value) {
return '<label id="btn_of'.$value.'" class="lbl_of btn btn-orange' . ($checked ? ' active' : '') . '"> ' .
Html::radio($name, $checked, ['value' => $value, 'class' => 'company_of-btn']) . ' ' . $label . '</label>';
},
]);
?>
</div>
<?php if(isset($model->of)) { ?>
<div class="col-md-12" id="choosingform">
<?php echo $this->render('_form'.$model->of.'.php',['form'=>$form,'model'=>$model]); ?>
</div>
<?php } ?>
<?php ActiveForm::end(); ?>
<?php Pjax::end(); ?>
Соответственно в зависимости от того что выберет пользователь, подгружается либо вьюха _form1.php либо _form2.php
В модели:
Код: Выделить всё
public function rules()
{
return [
[['fio'], 'required', 'when' => function($model) {
return $model->of == '1';
}
],
[['ownership_id'], 'required', 'when' => function($model) {
return $model->of == '2';
}, 'message' => Yii::t('companies','VALIDATE_ERROR_OWNERSHIP')],
[['name'], 'required', 'when' => function($model) {
return $model->of == '2';
}],
.....
}
Код: Выделить всё
public function actionCreate()
{
$model = new Companies();
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
if($model->validate() && $model->of){
.....
$model->save();
}
return $this->redirect(['view', 'slug' => $model->slug]);
}
else{
if(!isset($model->of) && NULL !== Yii::$app->request->get('of')){
$model->of = Yii::$app->request->get('of');
}
return $this->render('create', [
'model' => $model,
]);
}
}
public function actionValidateForm()
{
if (Yii::$app->request->isAjax) {
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$model = new Companies();
if($model->load(Yii::$app->request->post()))
return \yii\widgets\ActiveForm::validate($model);
}
throw new \yii\web\BadRequestHttpException('Bad request!');
}
Код: Выделить всё
$('.companies-form').on('click','.lbl_of',function(e){
var lbl_id = $(this).attr('id');
var options = $('#'+lbl_id+' input').val();
$.pjax({
type : 'GET',
url : 'companies/create',
container : '#choosingForm',
data : {'of':options},
push : true,
replace : false,
timeout : 10000,
scrollTo : false
});
Код: Выделить всё
{"companies-fio":["Необходимо заполнить «Фамилия и имя»."], .... }