Как я могу обновить только определенные поля в структуре Yii?

введите описание изображения здесь

Я не хочу обновлять поля пароля. Как использовать это. Я использую md5 encode для пароля. Поэтому я не хочу обновлять поле пароля в yii framework.any help appreciated ??

В вашей модели вы должны сделать что-то вроде этого:

public function rules() { return array( array('name, username, email, password', 'required', 'on' => 'create'), array('name, username, email', 'required', 'on' => 'update'), ); } 

Допустим, что сценарий, который вы запускаете сейчас, – это обновление. Поэтому я не требую пароля. Я требую его только в сценарии создания, который у вас может быть. Поэтому в файле вида, который у вас есть, вы удаляете поле пароля и внутри действия, которое у вас есть, вы включаете это:

 $model->setScenario('update'); 

поэтому он не будет требовать пароль, и он останется прежним.

Для изменения пароля вы можете создать новое действие (например, actionPassChange), в котором вам потребуется ввести дважды новый пароль.

Я думаю, что лучший подход заключается в том, чтобы не использовать сценарий в этом случае. Следующий код в правилах просто говорит сценарию: необходимы следующие поля . Но нет: пропустите другой .

 array('name, username, email', 'required', 'on' => 'update'), 

Например, если мы ограничиваем длину пароля до 32 символов, но в базе данных хранится в формате sha1 (длина 40), то у нас есть проблема, потому что валидатор блокирует запрос базы данных. Это происходит потому, что когда вы make update, метод «validatе» проверяет все свойства класса (относительно сопоставления таблиц базы данных), а не только новые, отправленные почтой.

Можно использовать метод saveAttributes, но потом я заметил еще одну проблему. Если столбец «email» уникален в базе данных, и в случае, если отредактированная электронная почта дублирует одну из существующих, то система сообщений Yii, определенная в правилах, не может уведомлять и выдает код ошибки в отношении запроса к базе данных.

Самый простой подход, на мой взгляд, заключается в следующем: не устанавливайте сценарий в этом случае. Просто отправьте в качестве аргумента свойства, которые вы хотите. Это сохранит все функции CRUD, созданные GII.

В вашем коде это выглядит так: (в модели)

 public function rules() { return array( array('name, username, email, password', 'required'), ); } 

(в контроллере)

 if($id==Yii::app()->user->id){ $model=$this->loadModel($id); if(isset($_POST['JbJsJobResume'])) { $model->attributes=$_POST['JbJsJobResume']; if($model->save(true, array('name', 'username', 'email'))) $this->redirect(array('view','id'=>$model->id)); } $this->render('update',array( 'model'=>$model, )); } 

Я заметил, что вы не используете RBAC. Это очень удобно и гибко – попробуйте.

http://www.yiiframework.com/doc/guide/1.1/en/topics.auth#role-based-access-control

 $model->attributes=$_POST['JbJsJobResume']; 

вместо назначения всех атрибутов просто назначьте те, которые вы хотите сохранить, а

 $model->name=$_POST['JbJsJobResume']['name']; $model->save(); 

1-й вариант. Просто установите пароль для пароля перед установкой:

 function update(){ $model=$this->loadModel($id); unset($_POST['JbJsJobResume']['password']); $model->attributes=$_POST['JbJsJobResume']; $model->save(); } с function update(){ $model=$this->loadModel($id); unset($_POST['JbJsJobResume']['password']); $model->attributes=$_POST['JbJsJobResume']; $model->save(); } 

Вторая опция: используйте временную переменную:

 function update(){ $model=$this->loadModel($id); $temPassword = $model->passwrod; $model->attributes=$_POST['JbJsJobResume']; $model->passwrod = $temPassword; $model->save(); } 

3-й вариант: сценарии использования

Я не уверен, почему это проблема, и какой-то код может помочь нам понять, почему. Если вы не хотите захватывать / обновлять пароль, то почему поле пароля в форме?

Если вы удалите поле пароля из представления, значение поля пароля не будет отправлено обратно контроллеру, а затем оно не будет обновлено.

Существует вероятность того, что вышеуказанный метод не работает, и это может быть так, что в вашей модели пользователя вы afterValidate пароль в методе afterValidate ?:

 protected function afterValidate() { parent::afterValidate(); $this->password = $this->encrypt($this->password); } public function encrypt($value) { return md5($value); } 

В этом случае, если вы удаляете поле пароля из представления и просто обновляете имя, имя пользователя или адрес электронной почты, тогда хеш-пароль md5 будет автоматически изменен и вы потеряете реальный пароль.

Один из способов обойти это – это md5 пароль в методе afterValidate (создать или обновить), однако, если пользователь хочет изменить данные профиля, в той же форме попросите пользователя снова подтвердить свой пароль.

  1. FORM: имя пользователя изменяет и проверяет пароль.
  2. Форма отправлена
  3. Контроллер вызывает метод аутентификации.
  4. Если аутентифицировать true, перезапишите запись в пользовательской таблице (включая проверенную pw)

Я думаю, что ответ «Грави» прав, спасибо, Грави и Никос Циракис. Я исправил почти такую ​​же проблему, как @faizphp. Я добавляю сценарий для модели пользователя, как сказал Никос Циракис, но также получил такую ​​же проблему. Затем я обнаружил, что шифрую пароль в User.afterValidate, поэтому при каждом обновлении модели User программа снова зашифровывает пароль в базе данных для неправильного пароля. Поэтому я изменил свою функцию

 protected function afterValidate() { parent::afterValidate(); if (!$this->hasErrors()) $this->password = $this->hashPassword($this->password); } </code> 

в

 protected function afterValidate() { parent::afterValidate(); if (!$this->hasErrors() && $this->scenario==="create") $this->password = $this->hashPassword($this->password); } 

, Кажется, работа.