我用谷歌搜索,阅读教程,博客和实验很多。所以我能够定义基于角色的控制器动作访问。 一切正常。 我想问的是。如何编写规则来显示,编辑和删除用户自己的帖子?
默认显示所有帖子。但是,我们可以将数据提供者标准显示为自己的帖子。但是我怎么能控制CRUD? 请帮助我。我的代码如下。
public function accessRules() {
return array(
array('allow', // allow all users to perform 'index' and 'view' actions
'actions' => array('index', 'view'),
'users' => array('*'),
),
array('allow', // allow authenticated user to perform 'create' and 'update' actions
'actions' => array('create', 'update'),
'expression' => 'Yii::app()->controller->HaveAccess()',
//'users' => array('@'),
),
array('allow', // allow admin user to perform 'admin' and 'delete' actions
'actions' => array('admin', 'delete'),
'expression' => 'Yii::app()->controller->HaveAccess()',
),
array('deny', // deny all users
'users' => array('*'),
),
);
}
帖子显示:
public function actionIndex() {
$dataProvider = new CActiveDataProvider('Advertisment');
if (!$this->IsAdmin()) {
$dataProvider = new CActiveDataProvider('Advertisment', array(
'criteria' => array(
'condition' => 'added_by='.$this->userId,
'order' => 'id DESC',
),
'pagination' => array(
'pageSize' => 20,
),
));
}
$this->render('index', array(
'dataProvider' => $dataProvider,
));
}
答案 0 :(得分:3)
要限制对用户自己帖子的更新和删除操作,您必须检查控制器操作内的权限(这在控制器的accessRules
afaik中是不可能的,因为要检查权限的帖子的ID ,accessRules
被评估时尚未知晓。)
示例:
public function actionUpdate($id){
$model = $this->loadModel($id);
if($model->added_by === $this->userId){
// your code here
}else
throw new CHttpException(401,'You are not authorized to edit this post.');
}
答案 1 :(得分:1)
使用范围:
http://www.yiiframework.com/doc/api/1.1/CActiveRecord#scopes-detail
在您的模型中:
public function scopes()
{
return array(
'own'=>array(
'condition'=>'userid=' . Yii::app()->user->id,
),
);
}
然后选择您的数据:
Post::model()->own()->findAll();
答案 2 :(得分:0)
我能想到的唯一方法是首先修改激活操作的链接:更新,删除,查看以发送added_by
字段以及帖子的ID (默认情况下发送帖子ID)。然后在'expression'
中,您可以检查added_by
是否与您的userId
匹配。下面是一个视图示例(假设您的意思是当您在问题中显示时的视图):
accessRule修改,为了确保您在评估accessRules之前在$this->userId
中有值,可以在init()
方法中完成:
return array(
array('allow', // allow all users to perform 'index' actions
'actions' => array('index'),
'users' => array('*'),
),
array('allow', // allow authenticated user to perform 'create' and 'update' actions
'actions' => array('create', 'admin'),
'expression' => 'Yii::app()->controller->HaveAccess()',
//'users' => array('@'),
),
array('allow', // allow admin user to perform 'admin' and 'delete' actions
'actions' => array('view', 'delete', 'update'),
'expression' => 'Yii::app()->controller->HaveAccess() && ($_REQUEST["added_by"]=='.$this->userId.")",
),
array('deny', // deny all users
'users' => array('*'),
),
);
查看修改以将added_by
id添加到url参数。假设您有默认生成的crud视图,即 index.php,_view.php,_form.php,_view.php,update.php等,其中 _view.php 具有链接转到帖子的详细视图,这也是index.php中listview的itemView。在这里我们进行一些更改(_view.php):
<div class="view">
<b><?php echo CHtml::encode($data->getAttributeLabel('id')); ?>:</b>
<?php echo CHtml::link(CHtml::encode($data->id), array('view', 'id'=>$data->id,'added_by'=>$data->added_by)); ?>
<br />
<b><?php echo CHtml::encode($data->getAttributeLabel('someattribute')); ?>:</b>
<?php echo CHtml::encode($data->someattribute); ?>
<br />
<!-- more attributes-->
</div>
您必须修改删除链接,更新操作以传递added_by字段。