Разработка сайтов на WordPress и фреймворке Yii2

Здесь Вы можете заказать полный пакет услуг по разработке сайта. Начиная от написания ТЗ до программирования на PHP, JavaScript и верстке.

Как отменить валидацию некоторых полей в Yii2

Фреймворк Yii2

Отмена валидации будет выполняться как на стороне клиента (для 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", можно было бы использовать сценарий. Но переделывать пока-что не буду.

Удачи!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *