2015-08-26 2 views
0

У меня проблема с установщиком yii2, у меня есть поле, называемое «роль» из другой таблицы, которое пользователи и роли связаны с user_id в таблице «user_role», поиск работы с геттерами, но сеттер не работает, yii2 не вызывает функцию setter! , я пробовал слишком много вещей, но поле «роль» в «правилах» функционировало как безопасное, но это не помогло, я написал $ role как общедоступную переменную в классе пользователя, и я попробовал ее как конфиденциальную, но также не работа, я не могу понять, где ошибка!Yii2 setter не работает

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

инкубаторе не будет вызываться методом нагрузки, он просто doen't работу, как это. Образом у вас есть ваши таблицы, кажется, как многие ко многим отношений, так что вам нужно будет сделать следующее на ваш взгляд:

<?= $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(); 
} 
+0

Спасибо за ваш ответ, но я не actully решить мою проблему .. я понял, что я Шоуда overwirte сценарии() функцию и изменить обновление ... поэтому я добавить $ newScenario = [» update '=> [' username ',' email ',' password ',' userrole ']]; Тогда я обнаружил, что я не должен использовать имя пользователя (роли) для моей переменной, потому что это может быть зарезервировано для Yii. Но в любом случае спасибо за вашу помощь. – Wael

Смежные вопросы