У меня проблема с сетером yii2, у меня есть поле с именем «role» из другой таблицы, в котором пользователи и роли связаны с user_id в таблице «user_role», метод get работает, но метод set не работает, yii2 работает не вызывать функцию установки !! Я перепробовал слишком много вещей, но поле «роль» в «правилах» функционирует как безопасное, но это не помогло, я написал $ role в качестве общедоступной переменной в пользовательском классе, и я попытался использовать ее как частную, но тоже не работа, я не могу понять, где ошибка !!
class User extends BaseUser
{
public $givenname;
public static function tableName()
{
return 'user';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['role'], 'safe'],
];
}
public function getRole()
{
$sql = 'SELECT item_name FROM "user_rules" WHERE user_id = :userId';
$command = Yii::$app->db->createCommand($sql);
$command->bindValue(':userId', (int)$this->id, PDO::PARAM_INT);
return $command->queryScalar();
}
public function setRole($newRole)
{
die("SetRole has been called now " );
// Save role in the DB
.................
}
/**
* @return type array list of the system roles
*/
public static function getSystemRoles()
{
return array(
'sysadmin' => 'sysadmin',
'admin' => 'admin',
'editor' => 'editor',
'member' => 'member',
'register' => 'register'
);
}
и в моем контроллере вот действие обновления:
/**
* Updates an existing User model.
* @param integer $id
* @return mixed
*/
public function actionUpdate($id)
{
Url::remember('', 'actions-redirect');
$user = $this->findModel($id);
$user->scenario = 'update';
$this->performAjaxValidation($user);
if ($user->load(Yii::$app->request->post()) && $user->save()) {
Yii::$app->getSession()->setFlash('success', Yii::t('user', 'Account details have been updated'));
return $this->refresh();
}
return $this->render('_account', [
'user' => $user,
]);
}
//--------------------------
и в моем представлении файла:
<?= $form->field($user, 'role')->dropDownList(User::getSystemRoles(), ['class' => 'form-control col-sm-2']); ?>
у тебя есть идеи ? не могли бы вы мне помочь.
С уважением
Ваель
Метод setter не будет вызываться методом load, он просто так не работает. То, как вы работаете со своими таблицами, кажется, что отношения «многие ко многим», поэтому вам нужно будет сделать следующее:
<?= $form->field($user, 'role_id')->dropDownList(User::getSystemRoles(), ['class' => 'form-control col-sm-2']); ?>
А внутри вашей модели вы должны добавить атрибут role_id и установить его как безопасный:
class User extends \yii\db\ActiveRecord
{
public role_id = null;
...
public function rules()
{
return [
...
[['role_id'], 'safe'],
...
Затем в afterSave:
public function afterSave($insert, $changedAttributes) {
if($this->role_id !== null)
{
// Save role in the DB
}
parent::afterSave($insert, $changedAttributes);
}
И просто для того, чтобы получить правильную роль при использовании формы обновления, мы делаем следующее в afterFind:
public function afterFind()
{
$this->role_id = $this->role;
parent::afterFind();
}
Других решений пока нет …