1

在两对输入字段中,我只需要其中一个。我无法正确验证。

listing_image_url并且仅在为 nullposter_image_url时才需要。$model->listingImage

也尝试使用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'
            ],
4

2 回答 2

1

您可以为后端的模型验证创建自己的内联验证器,如下所示:

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

为了还提供客户端验证,您可以构建一个自定义的独立验证器

于 2016-09-01T09:13:10.503 回答
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],
于 2016-09-01T09:23:51.923 回答