В форме у меня находится 2 модели связанных, первая модель нормально валидирует, а вторая вообще не валидирует и можно сохранить пустое поле, что недопустимо.
Вот код models/client
class Client extends \yii\db\ActiveRecord
{
const SCENARIO_DEFAULT = 'default';
const SCENARIO_CREATE = 'create';
public static function tableName()
{
return 'client';
}
public function scenarios()
{
return [
self::SCENARIO_DEFAULT => ['id', 'fio', 'phone', 'emaail', 'home','street', 'apartment'],
self::SCENARIO_CREATE => ['id'],
];
}
public function rules()
{
return [
[['id'], 'required', 'on' => self::SCENARIO_CREATE],
[['fio', 'phone'], 'required', 'on' => self::SCENARIO_DEFAULT],
...
];
}
В моделе models/zakaz
public function getIdClient()
{
return $this->hasOne(Client::className(), ['id' => 'id_client']);
}
В контроллере controllers/ZakazController
public function actionUpdate($id)
{
$model = $this->findModel($id);
$client = new Client();
$client->scenario = Client::SCENARIO_CREATE;
if ($model->load(Yii::$app->request->post())) {
$model->id_client = ArrayHelper::getValue(Yii::$app->request->post('Client'), 'id');
}
$model->validate();
if (!$model->save()) {
Yii::$app->session->addFlash('errors', 'Произошла ошибка');
print_r($model->getErrors());
} else {
$model->save();
Yii::$app->session->addFlash('update', 'Успешно отредактирован заказ');
}
}
return $this->render('update', [
'model' => $model,
'client' => $client,
]);
}
И во вьюшке views/update
<div class="col-xs-12">
<?= $form->field($model, 'name')->textInput(['placeholder' => 'Имя клиента', 'class' => 'inputForm'])->label(false) ?>
<?php !$model->isNewRecord ? $client->id = $model->id_client : null ?>
<?php if (Yii::$app->request->get('phone')) {
echo $form->field($client, 'id')->widget(Select2::className(), [
'data' => [Yii::$app->request->get('phone')],
'disabled' => true,
])->label(false);
} else {
echo $form->field($client, 'id')->widget(Select2::className(), [
'data' => ArrayHelper::map(Client::find()->all(), 'id', 'phone', 'fio'),
'options' => ['placeholder' => 'Введите номер телефона'],
])->label(false);
}?>
</div>