【问题标题】:PHALCON PHP - Different views based on user profilePHALCON PHP - 基于用户配置文件的不同视图
【发布时间】:2016-03-03 15:30:38
【问题描述】:

我创建了 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

我该如何做到这一点?

【问题讨论】:

    标签: php model-view-controller phalcon


    【解决方案1】:

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

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

    假设您使用的是这样的用户角色:

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

    (guest 角色的值为 0)我建议让所有控制器扩展 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 并且已经在执行类似的逻辑,如果是这样,您需要编辑您已经存在的“初始化”方法并将我的代码与您的合并。

    编码愉快。

    【讨论】:

      猜你喜欢
      • 2021-05-03
      • 2020-01-09
      • 1970-01-01
      • 2023-03-04
      • 2016-04-21
      • 2020-07-16
      • 1970-01-01
      • 2016-07-24
      • 2023-02-14
      相关资源
      最近更新 更多