使用controller-yii中的规则,根据用户在模型中的值来限制视图

时间:2014-03-24 14:23:42

标签: yii

有没有办法根据用户在控制器中的模型输入来限制视图? 我想根据自己的选择隐藏/显示自己的页面。 profile_hide_show,其值为'p'=> public,'f'=>朋友,'m'=> me

public function accessRules()
{
    return array(
        array('allow',
            'actions'=>array('view'),
            'users'=>array('?'), //?based on user's selection in model,
        ),
    );
}

2 个答案:

答案 0 :(得分:0)

执行此操作检查action或loadModel函数。您无法访问accessRules中的模型。

public function loadModel($id) {

    $type = modelname();
    $class = CActiveRecord::model($type);
    $model = $class->findByPk($id);

    if($model === null)
        throw new CHttpException(404, 'The requested page does not exist.');

    if($model->profile_hide_show != 'p')
        throw new CHttpException(404, 'You cannot view this profile.');

    return $model;
}

答案 1 :(得分:0)

Yii访问控制允许您在下降到控制器的本地方法之前执行基本控制。

您可以使用访问控制列表的“表达式”属性启用访问控制。例如:

public function accessRules(){
$owner_id = $this->loadModel()->owner_id;
return array(
        array('allow', 
                'actions'=>array('action1'),
                'expression'=>"{$user->id}=={$owner_id}",
             ),
        array('allow', 
                'actions'=>array('action2'),
                'expression'=>'(Yii::app()->user->id == ($_GET[\'id\']))',
             ),
        array('allow', 
                'actions'=>array('action3'),
                'expression'=>'"Yii::app()->controller->isEnabledByUser()',
             )

);
}

如果您看到action3的表达式,您将看到可以调用将返回将由expression属性计算的true / false值的函数。

public function isEnabledByUser(){
    $user_id = Yii::app()->user->id;
    $user    = User::model()->findByPk($user_id); 
    if ($user->show_my_page == 'Y')
       return true;
    else
       return false;
}

参考 How to view data only made by the user?