【问题标题】:Yii2 setter does not workYii2 设置器不起作用
【发布时间】:2015-08-27 00:02:07
【问题描述】:

我的 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']); ?>

你有什么想法吗?你能帮帮我吗?

问候 韦尔

【问题讨论】:

    标签: php model yii2 setter


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,但我并没有真正解决我的问题.. 我发现我应该覆盖场景()函数并编辑更新......所以我添加了 $newScenario = ['更新' => ['用户名','电子邮件','密码','用户角色']];然后我发现我不应该为我的变量使用(角色)名称,因为它可能是为 Yii 保留的。不过还是谢谢你的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多