Как правильно написать условие для валидации?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
DronTat
Сообщения: 11
Зарегистрирован: 2017.12.19, 14:29

Как правильно написать условие для валидации?

Сообщение DronTat »

Есть модель где создаются пользователи, а эта модель редактирует конкретного пользователя. Если админ не меняет имя пользователя, а изменяет другие записи, от естественно валидация не проходит, так как передается тот же username. Как правильно поступить?
$id - это id пользователя.
UpdateForm:

Код: Выделить всё

class UpdateForm extends Model
{
    public $username;
    public $status;
    public $name;


    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            ['username', 'trim'],
            ['username', 'required', 'message' => 'Необходимо заполнить пользователя'],
            ['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'Такое имя пользователя уже существует.'],
            ['username', 'string', 'min' => 2, 'max' => 255]
        ];
    }
    public function update($id) {
        if (!$this->validate()) {
            return null;
        }
        $user = User::findOne(['id' => $id]);
        $user->username = $this->username;
        $user->status = $this->status;
        if ($user->save()) {
        ...
        }
    
DronTat
Сообщения: 11
Зарегистрирован: 2017.12.19, 14:29

Re: Как правильно написать условие для валидации?

Сообщение DronTat »

Может я не правильно объяснил. Я пытался сделать так, но я не знаю как добавить вместо вопросов id(можно username) редактируемого пользователя. id редактируемого пользователя приходит в метод update, но как его в валидацию добавить?

Код: Выделить всё

['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'Такое имя пользователя уже существует.', 'when' => function($model) {
                return $model->id !== ???? ;
            }]
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Как правильно написать условие для валидации?

Сообщение mkramer »

Передать в конструктор

Код: Выделить всё

class UpdateForm extends Model
{
    public $user_id;
   /** ... твои поля
   /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
           /*... */
           ['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'Такое имя пользователя уже существует.', 'filter' => 
              function($query) {
                $query->andWhere(["!=", "id", $this->user_id]);
            }]
           /* ... */
         ]
    }
    /* Теперь без параметров */
    public function update() 
    { 
            $user = User::findOne($this->user_id); // хотя я бы вообще в init это вынес
            /* ... */
    }
}
/* Создание модели */
$upForm = new UpdateForm(["user_id" => $user_id]);
И не внимательно посмотрел, который тебе дали.
DronTat
Сообщения: 11
Зарегистрирован: 2017.12.19, 14:29

Re: Как правильно написать условие для валидации?

Сообщение DronTat »

mkramer писал(а): 2018.05.30, 12:26 Передать в конструктор

Код: Выделить всё

class UpdateForm extends Model
{
    public $user_id;
   /** ... твои поля
   /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
           /*... */
           ['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'Такое имя пользователя уже существует.', 'filter' => 
              function($query) {
                $query->andWhere(["!=", "id", $this->user_id]);
            }]
           /* ... */
         ]
    }
    /* Теперь без параметров */
    public function update() 
    { 
            $user = User::findOne($this->user_id); // хотя я бы вообще в init это вынес
            /* ... */
    }
}
/* Создание модели */
$upForm = new UpdateForm(["user_id" => $user_id]);
И не внимательно посмотрел, который тебе дали.
Спасибо, помогло
Ответить