2016-09-01 9 views
1

Из двух пар полей ввода мне нужен только тот или иной. Я не могу получить правильность проверки.Yii2 При проверке

listing_image_url и poster_image_url должно быть необходимо, только если $model->listingImage - null.

Также пробовал использовать strlen($model->listingImage) == 0.

 [['listing_image_url', 'poster_image_url'], 'required', 
      'when' => function($model){ 

       var_dump($model->listingImage); //result is empty string '0' 

       return $model->listingImage == NULL && $model->posterImage == NULL; 
      },'whenClient' => "function(attribute, value) { 
        return $('#vod-listingimage').val() == '' && $('#vod-posterimage').val() == ''; 
      }", 'message' => 'look' 
     ], 

Как и выше, но наоборот.

[['listingImage', 'posterImage'], 'required', 
       'when' => function($model) { 
        return $model->listing_image_url == NULL && $model->poster_image_url == NULL; 
       }, 
       'whenClient' => "function(attribute, value) { 

        return $('#vod-listing_image_url').val() == '' && $('#vod-poster_image_url').val() == ''; 
       }", 'message' => 'hi' 
      ], 
+0

Не могли бы вы уточнить ваши правила, возможно, с помощью [таблица истинности] (https://en.wikipedia.org/wiki/Truth_table)? Является ли установка 'poster_image' и' listing_image_url' действительной? – topher

ответ

1

Вы можете создать свой собственный inline validator для модели проверки на стороне серверной, например:

[['listingImage', 'posterImage'], function($attribute, $params) { 
    if ($this->listingImage === null && empty($this->$attribute)) { 
      $this->addError($attribute, 'Can not be blank if listingImage is null'); 
    } 
}] 

Для того, чтобы также обеспечить на стороне клиента проверки вы можете построить пользовательские standalone validator.

0

Я попробовал что-то подобное, и поведение действительно странно. Но вы можете создать валидатор, который проверяет, выбрано ли только одно из двух полей.

public function validateListingAgainstPoster($attribute, $params) 
{ 
    if (!empty($this->listing_image_url) && !empty($this->poster_image_url)) { 
     $this->addError($attribute, 'Only one of "Listing" or "Poster" fields can be selected.'); 
    } 
    if (empty($this->listing_image_url) && empty($this->poster_image_url)) { 
     $this->addError($attribute, 'Please select one of "Listing" or "Poster Group".'); 
    } 
} 

И в правилах:

[['listing_image_url', 'poster_image_url'], 'validateListingAgainstPoster', 'skipOnEmpty' => false, 'skipOnError' => false], 
+0

Я действительно получил его на работу. Глядя на ответ @ nadar, я добавил '===' NULL и, похоже, исправил проблему. Я сделаю немного больше испытаний и вернусь. – Ciprian

+0

О, это здорово! Я пытался использовать empty(). Пожалуйста, напишите свой ответ, если вы справитесь с этим. –

 Смежные вопросы

  • Нет связанных вопросов^_^