MasterGerold
@MasterGerold

Почему не работает валидация yii2?

Доброго времени суток! Есть форма добавления информации на сайт. Если быть точнее то их таких три похожих(немного различаются полями). Две формы отлично отрабатывают валидацию, а третья не реагирует.
Вот код третей формы:
(_form.php)
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>
<div class="row">
    <div class="col-sm-6">
        <?= $form->field($model, 'type_of_sales')->dropDownList(['0' => 'Продать', '1' => 'Аренда', '2' => 'Долгосрочная аренда',]) ?>
        <?= $form->field($model, 'description')->textarea(['rows' => 6]) ?>
        <?= $form->field($model, 'area')->textInput(['maxlength' => true]) ?>
        <?= $form->field($model, 'city')->dropDownList($city) ?>
        <?= $form->field($model, 'district')->dropDownList(\yii\helpers\ArrayHelper::map(\app\modules\admin\models\Districts::find()->all(), 'title', 'title')) ?>
        <?= $form->field($model, 'address')->textInput(['maxlength' => true]) ?>
        <?= $form->field($model, 'land_type')->dropDownList($land_type) ?>
    </div>
    <div class="col-sm-6">
        <?= $form->field($model, 'phone')->textInput(['maxlength' => true]) ?>
        <?= $form->field($model, 'communicationArr')->checkboxList(['Свет' => 'Свет', 'Газ' => 'Газ', 'Вода' => 'Вода']) ?>
        <?= $form->field($model, 'contact_name')->textInput(['maxlength' => true]) ?>
        <?= $form->field($model, 'vip')->radioList(['0' => 'Нет', '1' => 'Да',]) ?>
        <div class="exchange_trigger">
            <?= $form->field($model, 'exchange')->radioList(['1' => 'Да', '0' => 'Нет',]) ?>
        </div>
        <?= $form->field($model, 'exchange_field', ['options' => ['id' => 'rent_block']])->textInput(['maxlength' => true, 'placeholder' => 'Например: гараж, дачу, 2-х комнатную квартиру',])->label(false) ?>
        <?= $form->field($model, 'price', ['options' => ['class' => 'col-sm-8 row', 'id' => 'price_block']])->textInput(['maxlength' => true]) ?>
        <?= $form->field($model, 'currency', ['options' => ['class' => 'col-sm-4 row pull-right', 'id' => 'currency_block']])->dropDownList(['uah' => 'UAH', 'usd' => 'USD', 'eur' => 'EUR']) ?>
        <div class="col-sm-12">
            <?= $form->field($model, 'gallery[]', ['options' => ['class' => 'row']])->fileInput(['multiple' => true]) ?>
        </div>
    </div>
    <div class="col-sm-12">
        <div class="form-group col-sm-6">
            <?= $form->field($model, 'reCaptcha')->widget(
                \himiklab\yii2\recaptcha\ReCaptcha::className(),
                ['siteKey' => 'бла-бла-бла']
            )->label(false)?>
        </div>
        <div class="col-sm-6">
            <?= Html::submitButton($model->isNewRecord ? 'Добавить!' : 'Обновить', ['class' => $model->isNewRecord ? 'btn btn-success center-block' : 'btn btn-primary center-block']) ?>
        </div>
    </div>
</div>
<?php ActiveForm::end(); ?>

(LandParts - Model)
class LandParts extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */

	//public $image;
	public $gallery;
	public $reCaptcha;

    public static function tableName()
    {
        return 'land_parts';
    }

    public function scenarios()
    {
        return [
            $this::SCENARIO_DEFAULT => [
                'communicationArr'
            ],
        ];
    }

    public function behaviors(){
        return [
            'gallery' => [
                'class' => 'rico\yii2images\behaviors\ImageBehave',
            ],
        ];
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['description', 'area', 'city', 'address', 'phone', 'contact_name', 'price', 'land_type', 'type_of_sales'], 'required'],
            [['description', 'vip', 'available', 'new', 'sale', 'currency', 'communication', 'exchange_field'], 'string'],
            [['area', 'land_document', 'hot', 'exchange'], 'integer'],
            [['created_at', 'updated_at'], 'safe'],
            [['title', 'price'], 'string', 'max' => 40],
            [['city'], 'string', 'max' => 50],
            [['address'], 'string', 'max' => 80],
            [['phone', 'contact_name'], 'string', 'max' => 25],
            [['realtors'], 'string', 'max' => 255],
            [['land_type'], 'string', 'max' => 100],
            [['gallery'], 'file', 'extensions' => 'png, jpg', 'maxFiles' => 4],
            [['city'], 'exist', 'skipOnError' => true, 'targetClass' => City::className(), 'targetAttribute' => ['city' => 'city_name']],
            [['district'], 'exist', 'skipOnError' => true, 'targetClass' => Districts::className(), 'targetAttribute' => ['district' => 'title']],
			[['land_type'], 'exist', 'skipOnError' => true, 'targetClass' => LandPartsType::className(), 'targetAttribute' => ['land_type' => 'title']],
			[[], \himiklab\yii2\recaptcha\ReCaptchaValidator::className(), 'secret' => 'бзззз'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'title' => 'Заголовок',
            'description' => 'Описание',
            'area' => 'Площадь',
            'distance_from_city' => 'Дистанция от города',
            'land_document' => 'Акт на землю',
            'communication' => 'Коммуникации',
            'city' => 'Город',
            'district' => 'Город',
            'address' => 'Адрес',
            'vip' => 'VIP Статус',
            'available' => 'Показывать',
            'phone' => 'Номер телефона',
            'realtors' => 'Риэлторы',
            'hot' => 'Горячее предложение',
            'exchange' => 'Обменять на:',
            'contact_name' => 'Ваше имя',
            'price' => 'Цена',
            'new' => 'Новый',
            'created_at' => 'Дата создания',
            'sale' => 'Продан',
			'land_type' => 'Тип земли',
			'gallery' => 'Картинки',
			'currency' => 'Валюта',
            'type_of_sales' => 'Я хочу',
            'communicationArr' => 'Коммуникации',
        ];
    }

    /**
     * Work with SET field in DB
     */
    public function getCommunicationArr()
    {
        return explode(',', $this->communication);
    }

    public function setCommunicationArr($value)
    {
        $this->communication = is_array($value) ? implode(',', $value) : '';
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getCity0()
    {
        return $this->hasOne(City::className(), ['city_name' => 'city'])->inverseOf('landParts');
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getLandType()
    {
        return $this->hasOne(LandPartsType::className(), ['title' => 'land_type'])->inverseOf('landParts');
	}


    public function upload()
    {
        if($this->validate()){
            $path = 'images/store/' . $this->image->baseName . '.' . $this->image->extension;
            $this->image->saveAs($path);
            $this->attachImage($path);
            @unlink($path);
            return true;
        } else {
            return false;
        }
    }

	public function uploadGallery()
    {
		if($this->validate()){
			foreach ($this->gallery as $file){
				$path = 'images/store/' . $file->baseName . '.' . $file->extension;
				$file->saveAs($path);
				$this->attachImage($path);
				@unlink($path);
			}
		return true;
		} else {
			return false;
		}
	}
}

(Controller actionCreate)
public function actionCreate()
{
    $this->layout = '/gold';

    $model = new LandParts();

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
		$model->gallery = UploadedFile::getInstances($model, 'gallery');
		if ($model->gallery)
			$model->uploadGallery();
        Yii::$app->session->setFlash('success', 'Ваше объявление пройдет предварительную модерацию и будет добавлено на сайт!');
        return $this->refresh();
    } else {
        return $this->render('create', compact('model'));
    }
}

Это стандартная валидация yii2 когда нажимаешь на поле и потом сбрасываешь фокус, а оно тебе подсвечивает поле красным или зеленым. Подскажите что это может быть? Заранее благодарен!
  • Вопрос задан
  • 2111 просмотров
Решения вопроса 1
qonand
@qonand
Software Engineer
проблема по в Вашем методе scenarios, для сценария по умолчанию указан один активный атрибут. Соответственно все остальные атрибуты не являются активными, поэтому и не валидируются на клиенте.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@vism
Если формы идентичны, возможно косяк в js на странице, потому не срабатывают события и валидация
Ответ написан
@AlxMrz
Слишком мало информации. Приведите свой код из метода rules(), где задаете правила валидации, а также фрагмент кода, где выводите поле в шаблоне
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы