私はマルチユーザーアプリケーションをコーディングしています。各モデルには、フィールド user_id があり、すべてのユーザーログインがあり、彼の id: を取得できますYii::app()->user->id
。
すべてのアクションの検索/更新/挿入条件で繰り返したくないので、モデル user_id でこれを設定するにはどうすればよいですか?
CActiveRecordBehaviorを使用します。このようにして、すべてのモデルのbeforeFind/afterFindイベントとbeforeSave/afterSaveイベントをフックできます。本当にいいです
親クラスを作成して継承する必要があります
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'));