Yii2 setter不起作用

时间:2015-08-26 12:40:55

标签: php model yii2 setter

我有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']); ?>
你知道吗?你能不能帮助我。

此致 瓦埃勒

1 个答案:

答案 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();
}