1

私はマルチユーザーアプリケーションをコーディングしています。各モデルには、フィールド user_id があり、すべてのユーザーログインがあり、彼の id: を取得できますYii::app()->user->id

すべてのアクションの検索/更新/挿入条件で繰り返したくないので、モデル user_id でこれを設定するにはどうすればよいですか?

4

2 に答える 2

1

CActiveRecordBehaviorを使用します。このようにして、すべてのモデルのbeforeFind/afterFindイベントとbeforeSave/afterSaveイベントをフックできます。本当にいいです

于 2013-02-06T05:43:19.197 に答える
0

親クラスを作成して継承する必要があります

abstract class UserAccess extends CActiveRecord {

    public function getUserAccessCondition($condition, array $params)
    {
        if ($condition instanceof CDbCriteria) {
            $condition->compare('user_id', Yii::app()->user->id);
        } else {
            if(!is_array($condition)) {
                $condition['condition'] = $condition;
                $condition['params'] = $params;
            }
            if (trim($condition['condition']) == '') $condition['condition'] = 'user_id=:user_id';
            else $condition['condition'] .= ' and user_id=:user_id';
            $params[':user_id'] = Yii::app()->user->id;
        }
        return $condition;
    }

    public function find($condition='',$params=array())
    {
        $condition = $this->getUserAccessCondition($condition, $params);
        parent::find($condition, $params);
    }
    // and so on in findAll,  findAttributes...
    // for findByPk you need make some things maybe after find 
    // chek user_id and if is not equal throw access denied exception 
    public function afterFind()
    {
        if ($this->user_id != Yii::app()->user->id) {
            throw new CHttpException(403, 'Access Denied');
        }
    }
}


class UserItem extends UserAccess
{
   //.. rules tableName etc

}
// simple call
$userItem = UserItem::model()->find('name=:name', array(':name' => 'Some search name'));
于 2013-02-05T05:23:43.550 に答える