Отмена валидации будет выполняться как на стороне клиента (для yiiActiveForm), так и на стороне сервера.
Использование сценария, будет является признаком того, что валидация на стороне сервера по некоторым полям проходить не будет.
На стороне клиента, отмена валидации по нужным полям будет выполняться динамически, в зависимости от выбранного действия (в нашем случае - удалить).
Наш контроллер:
$NewsletterMailForm = new NewsletterMailForm(); if(Yii::$app -> request -> post($NewsletterMailForm -> formName())['event'] != NewsletterMailForm::EVENT_DELETE) { $NewsletterMailForm -> scenario = NewsletterMailForm::EVENT_SEND; }
Если поле "event" не равно "удалению", значит нам нужно отправлять письма (пока другого ничего не предусмотрено).
Наш вид:
$this -> registerJs(" $('.btnEmailDelete').click(function(e){ e.preventDefault(); if(confirm('".Yii::t('app', 'Delete selected emails?')."')) { $('#".Html::getInputId($NewsletterMailForm, 'event')."').val('".NewsletterMailForm::EVENT_DELETE."'); $('#form-news-letter-mail').yiiActiveForm('remove', '".Html::getInputId($NewsletterMailForm, 'subject')."'); $('#form-news-letter-mail').yiiActiveForm('remove', '".Html::getInputId($NewsletterMailForm, 'body')."'); $('#form-news-letter-mail').submit(); } }); ");
Немного поясню. По умолчанию, на сабмит мы "вешаем" валидацию формы, и если все ОК - отправляем ее на сервер. Но если мы кликаем по ссылке "удалить" выбранные данные (в нашем случае почтовые адреса. То нам нужно каким-то образом отменить валидацию и отправить данные на сервер.
Более изящного способа я не нашел, поэтому использовал тот что приведен выше.
В самой модели реализовано так:
if($this -> validate() == true) { if($this -> event == NewsletterMailForm::EVENT_DELETE) { /* Удаляем подписчиков */ } elseif($this -> event == NewsletterMailForm::EVENT_SEND) { /* Отправляем список писем */ } return true; } return false;
Вместо "$this -> event", можно было бы использовать сценарий. Но переделывать пока-что не буду.
Удачи!