4

私はググったり、チュートリアルやブログを読んだり、たくさん実験したりしました。そのため、コントローラー アクションへのロール ベースのアクセスを定義できます。すべて正常に動作します。聞きたいことは。ユーザー自身の投稿を表示、編集、および削除するルールを作成するにはどうすればよいですか?

デフォルトでは、すべての投稿が表示されます。ただし、データプロバイダーの基準を設定して、独自の投稿を表示できます。しかし、そのために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,
        ));
    }
4

3 に答える 3

3

更新および削除アクションをユーザー自身の投稿に制限するには、コントローラー アクション内のアクセス許可を確認する必要があります (これは、accessRulesアクセス許可を確認する投稿の 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.');
}
于 2012-06-26T15:38:01.070 に答える
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();
于 2014-10-28T04:45:54.143 に答える
0

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

  1. accessRule の変更。これが機能するためには、メソッド$this->userIdで実行できる accessRules が評価される前に値があることを確認してください。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('*'),
        ),
    );
    
  2. added_byurl パラメータに idを追加するビューの変更。デフォルトで生成されたcrudビュー、つまりindex.php、_view.php、_form.php、_view.php、update.phpなどがあるとします。_view.phpには投稿の詳細ビューへのリンクがあります。これもindex.php のリストビューの 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 フィールドも渡すように、削除、更新アクションのリンクを変更する必要があります。

于 2012-06-27T10:44:56.627 に答える