Как я могу пропустить уникальное поле в Yii2? - PullRequest
0 голосов
/ 27 октября 2018

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

Кроме того, мне нужно сделать следующее: когда я изменяю значения и не изменяю это уникальное поле, но оставляю его как есть, то валидатор не должен клясться, что поле уже занято.

Спасибо.

Модель InfCourses:

public function rules()
{
    return [
        [['name', 'short_description', 'price', 'favorite', 'active', 'course_order', 'link'], 'required'],
        [['price', 'active'], 'integer'],
        [['favorite'], 'string'],
        [['name', 'short_description', 'link'], 'string', 'max' => 255],
        [['active'], 'exist', 'skipOnError' => true, 'targetClass' => InfStatuses::className(), 'targetAttribute' => ['active' => 'id']],
        [['course_order'], 'integer', 'min' => 1],
        [
            ['course_order'], 'unique', 
            'targetAttribute' => ['course_order'], 
            'filter' => ['!=', 'id', Yii::$app->request->get('id')],
        ],
    ];
}

Валидатор в InfCoursesController:

public function actionValidate()
{
    $model = new InfCourses();

    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }
}

Часть кода формы:

<?php $form = ActiveForm::begin([
    'enableAjaxValidation' => true,
    'validationUrl' => 'validate',
    'options' => [
        'data-pjax' => true,
    ]
]); ?>

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Хорошо ... Я вырезал код ниже для каждого действия: создать / обновить.

if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }

Затем удалить validationUrl из компонента формы.Внутри модели я делаю это правило [['course_order'],'unique'] ... Работает нормально ...

0 голосов
/ 27 октября 2018

Ваша проверка просто неверна. Вы используете Yii::$app->request->get('id') в своих правилах, что, вероятно, является основным источником ваших проблем. Модель не должна обращаться к запросу или компоненту веб-пользователя напрямую - это нарушает схему MVC. Кроме того, размещение значений непосредственно в правилах таким способом может дать вам неожиданные результаты. Вы должны проверить, какой запрос генерируется этим валидатором, потому что трудно догадаться, что происходит с таким измененным правилом.

Но может быть проще исправить actionValidate() и провести различие между проверкой новой записи и проверкой существующей записи:

public function actionValidate($id = null) {
    if (empty($id)) {
        $model = new InfCourses();
    } else {
        $model = $this->findModel($id);
    }

    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }
}

Тогда вы можете ограничить свое уникальное правило:

[['course_order'], 'unique'],

Validator будет достаточно умен, чтобы обнаружить, что он проверяет существующую запись, и не будет сообщать неизмененные значения полей как дубликаты. Вам просто нужно указать идентификатор записи в URL этого действия.

...