2012-06-22 4 views
5

私はグーグル、チュートリアル、ブログを読んで、多くの実験をしました。だから私はコントローラのアクションへのロールベースのアクセスを定義することができます。 すべて正常に動作します。 私が尋ねたいことは何ですか。ユーザーの投稿を表示、編集、削除するルールを作成するにはどうすればよいですか?Yiiロールベースのアクセス、自分の投稿を管理

デフォルトでは、すべての投稿が表示されます。しかし、データプロバイダの基準を自分の投稿に表示することができます。しかし、私はそれの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, 
     )); 
    } 
+2

は、単純にユーザーIDを追加しますあなたのような行動はdoiですacitonIndex '$ this-> userId' – Orlymee

+0

コントローラでは' $ this-> userId'の値を設定していますか? –

答えて

3

更新を制限し、ユーザー自身の投稿にアクションを削除するには、コントローラのアクション内の権限を確認する必要があります(これはでは不可能ですコントローラのaccessRules afaikは、許可を確認する投稿のIDとして、accessRulesが評価されるまでには分かっていません)。

例:

0123私はこれを行うと考えることができ
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.'); 
} 
+0

しかし、私はどこかにaccessrulに何かを置くことができ、自動的にリスティングもユーザのために変更できることを見てきました –

+0

あなたはこの[Wiki/Tutorial](http://www.yiiframework.com/wiki/136/)を参照していますか?理解している階層的な-bac-scheme /)? – burnedikt

0

唯一の方法は、最初のアクションをアクティブリンク変更することである:更新、削除、投稿のIDと一緒にもadded_byフィールドを送信するためのビューを(ポストIDがで送られますデフォルト)。次に'expression'added_byがあなたのuserIdと一致するかどうかを確認できます。以下は、ビューの例がある(あなたがあなたの質問にディスプレイを言うときにビューを意味すると仮定した場合):

  1. accessRuleの変更を、これが機能するために評価され、あなたがaccessRules前$this->userIdに値を持っていることを確認し、そのことができますURLパラメータにadded_by IDを追加する

    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('*'), 
        ), 
    ); 
    
  2. ビューの変更:init()方法で行われます。 index.php、_view.php、_form.php、_view.php、update.phpなど_view.phpには、投稿のdetailviewに行くリンクがあるがあります。これは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> 
    
  3. 削除のためのリンクを変更する必要がありますし、またadded_byフィールドを渡すためにアクションを更新します。

関連する問題