我有yii2 setter的问题,我有一个名为" role"从另一个表中,用户和角色与表" user_role"中的user_id链接,getter工作查找,但是setter不起作用,yii2不调用setter函数!! ,我尝试了太多的东西,但我的领域"角色"在"规则"作为安全的功能,但它没有帮助,我在用户类中写了$ 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']); ?>
你知道吗?你能不能帮助我。
此致 瓦埃勒
答案 0 :(得分:0)
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();
}