Необходимо указать один из раскрывающихся списков.

Привет, у меня есть 2 раскрывающихся списка:

 <?= $form->field($model, 'Rel_User')->widget(Select2::classname(), [
    'data' => ArrayHelper::map(UrUser::find()->orderby('Surname')->all(), 'Id', 'fullName'),
    'language' => 'pl',
    'options' => ['placeholder' => Yii::t('app', 'Wybierz użytkownika ...')],
    'pluginOptions' => [
        'allowClear' => true
    ],
]); ?>

    <?= $form->field($model, 'Rel_Category')->widget(Select2::classname(), [
    'data' => ArrayHelper::map(SmUserCategory::find()->orderby('Name')->all(), 'Id', 'Name'),
    'language' => 'pl',
    'options' => ['placeholder' => Yii::t('app', 'Wybierz kategorię ...')],
    'pluginOptions' => [
        'allowClear' => true
    ],
]); ?>

И я хочу сделать один из них обязательным, если второй из них не выбран. Поэтому, если пользователь не выберет их оба, он должен показать сообщение под двумя из них, но если пользователь выберет один, он должен сохранить мою модель. Я пытался сделать это с помощью правил:

 [['Rel_User'], 'required', 'whenClient' => "function (attribute, value) {return $('#banner-rel_category input[type=dropdown]:checked').val() == null}"],
 [['Rel_Category'], 'required', 'whenClient' => "function (attribute, value) {return $('#banner-rel_user input[type=dropdown]:checked').val() == null}"],

но теперь 2 из них все время требуется. Что я могу сделать, чтобы потребовать один из них? мое действие создать в ctrl

 public function actionCreate() {
            $model = new Banner();
            $model->scenario='create';
            if ($model->load(Yii::$app->request->post())) {
                $model->File = UploadedFile::getInstance($model, 'File');
                if ($model->save() && $model->upload() && $model->validate()) {
                    return $this->redirect(['view', 'id' => $model->Id]);
                }
            } else {
                return $this->render('create', [
                            'model' => $model,
                ]);
            }
        }

Мои правила сейчас:

public function rules() {
        return [
            [['Url'], 'required'],
            [['File'], 'required', 'on' => 'create'],
            [['Rel_User'], 'my_required'],
            [['Rel_Category'], 'my_required'],
            [['Views', 'Rel_User', 'Rel_Category', 'CreatedAt', 'UpdatedAt', 'IsDeleted', 'Id'], 'integer'],
            [['Image', 'Url', 'Caption'], 'string', 'max' => 255],
            [['Url'], 'match', 'pattern' => '/^(http(s?):\/\/)?(www\.)?[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$/'],
            [['File'], 'file', 'extensions' => ['gif', 'jpg', 'png', 'jpeg', 'JPG', 'JPEG', 'PNG', 'GIF'], 'checkExtensionByMimeType' => false,],
            [['CreatedAt', 'IsDeleted'], 'safe']
        ];
    }

person qwerty    schedule 11.03.2016    source источник


Ответы (1)


Используйте пользовательскую проверку в модели:

public function rules()
{
  return [      
     [['Rel_User, Rel_Category'], 'my_required'],
  ];
}

public function my_required($attribute_name, $params)
{
   if (empty($this->Rel_User) && empty($this->Rel_Category)) 
   {
     $this->addError($attribute_name, Yii::t('app', 'At least 1 of the field must be filled up properly'));

    return false;
   }

   return true;
}

Справочник

person Insane Skull    schedule 11.03.2016
comment
хм, теперь не требуется оба выпадающих списка - person qwerty; 11.03.2016
comment
я не знаю, почему это не работает, или я использовал эти собственные правила раньше в другом проекте, и они работают, но теперь это не так. - person qwerty; 11.03.2016
comment
нет, может быть, контроллер неисправен, но те рули, которые у меня есть, работают нормально, я покажу вам свой контроллер - person qwerty; 11.03.2016
comment
но я пытался переместить $model-›validate() во все возможные места и все равно не работал - person qwerty; 11.03.2016
comment
@qwerty. удалить оба поля из требуемого правила. - person Insane Skull; 11.03.2016
comment
извините, я исправляю это :) так что, возможно, вы знаете, где это может быть проблемой. Я пытался использовать эту функцию, например, для другого атрибута, и это все еще не работает: public function my_required($attribute_name, $params) { if (empty($this->Caption)) { $this->addError($attribute_name, Yii::t('app', 'Jedno z tych pól musi być wypełnione')); } } - person qwerty; 11.03.2016