Скасування валідації буде виконуватись як на стороні клієнта (для yiiActiveForm), так і на стороні сервера.
Використання сценарію буде слугувати ознакою того, що валідація на стороні сервера для деяких полів виконуватись не буде.
На стороні клієнта скасування валідації для потрібних полів буде виконуватись динамічно, в залежності від вибраної дії (у нашому випадку — видалення).
Наш контролер:
$NewsletterMailForm = new NewsletterMailForm();
if(Yii::$app -> request -> post($NewsletterMailForm -> formName())['event'] != NewsletterMailForm::EVENT_DELETE)
{
$NewsletterMailForm -> scenario = NewsletterMailForm::EVENT_SEND;
}Якщо поле "event" не дорівнює "видалити", це означає, що потрібно надсилати листи (інших дій поки не передбачено).
Наш вигляд (view):
$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();
}
});
");Трохи поясню. За замовчуванням на submit форми навішується валідація, і якщо все добре — вона надсилається на сервер. Але якщо ми натискаємо на посилання «видалити» обрані дані (у нашому випадку — email-адреси), нам потрібно якимось чином скасувати валідацію і просто відправити форму.
Більш витонченого способу я не знайшов, тому використав описаний вище.
У самій моделі реалізовано так:
if($this -> validate() == true)
{
if($this -> event == NewsletterMailForm::EVENT_DELETE)
{
/* Delete subscribers */
}
elseif($this -> event == NewsletterMailForm::EVENT_SEND)
{
/* Send list of emails */
}
return true;
}
return false;Замість $this -> event можна було б використовувати сценарій (scenario), але поки що не перероблятиму.
Успіхів!
