PHALCON PHP - 基于用户配置文件的不同视图

时间:2015-11-30 03:42:21

标签: php model-view-controller phalcon

我创建了Phalcon PHP应用程序, 我有3个不同的用户配置文件:(ID:1)管理员,(ID:2)会计和(ID:3)仓库。

我希望我的应用能够根据这些配置文件呈现视图,例如

controllerName/index.1.volt //for Administrators
controllerName/index.2.volt //for Accountants
controllerName/index.3.volt //for Warehouses

但是当找不到这些文件时,我的应用程序将回退到:

controllerName/index.volt

我如何做到这一点?

1 个答案:

答案 0 :(得分:3)

一种方法虽然很混乱,但可以使用controlerName/index.volt作为“登陆页面”,然后从那里检查一个if语句来决定用户的角色是什么。然后从if语句中使用类似{{ partial("index.1.volt") }}之类的部分,但你需要为每个控制器硬编码...哎... ...

我推荐的一个好的解决方案是使用View的exists方法来检查控件中是否存在视图。我们的想法是将此方法的字符串路径传递给您正在查找的视图文件,但省略了扩展名。省略扩展名的原因是因为Phalcon允许您使用多个渲染引擎,因此使用.volt.phtml混合的应用程序将起作用。

假设您使用的用户角色如下:

define('GUEST_ROLE',0);
define('ADMIN_ROLE',1);
define('ACCOUNTANT_ROLE',2);
define('WAREHOUSE_ROLE',3);

(使用值为0的guest角色)我建议让所有控制器扩展ControllerBase,然后在ControllerBase中定义以下两个方法:

public function getUserLevel()
{
    if($this->session->has('userLevel'))
    {
        $userLevel=$this->session->get('userLevel');
        return (int)$userLevel;
    }else{
        return 0;//default to guest
    }
}

protected function initialize()
{
    $controllerName=$this->dispatcher->getControllerName();
    $actionName=$this->dispatcher->getActionName();
    $userLevel=$this->getUserLevel();
    if($this->view->exists("$controllerName/$actionName.$userLevel"))
    {
        $this->view->pick("$controllerName/$actionName.$userLevel");
    }
    //No reason to add an else, Phalcon defaults to "$controllerName/$actionName"

}

请确保,如果您需要为扩展ControllerBase的特定控制器定义自定义“初始化”方法,例如要为与控制器相关的所有页面添加标题前缀,请调用parent::initialize();,否则不会调用它。但是,只有当你要重写方法时才会这样。

您可能已经在使用ControllerBase并且已经使用了类似的逻辑,如果是这样,您需要编辑已经存在的“初始化”方法并将我的代码与您的代码合并。

快乐的编码。