Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHALCON PHP-基于用户配置文件的不同视图_Php_Model View Controller_Phalcon - Fatal编程技术网

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

PHALCON PHP-基于用户配置文件的不同视图,php,model-view-controller,phalcon,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 但如果找不到这些文件,我的应用程序将

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

如何做到这一点呢?

一种方法,虽然很麻烦,但可以使用
controlerName/index.volt
作为“登录页”,然后从那里检查if语句以确定用户的角色。然后从if语句中使用类似于
{{partial(“index.1.volt”)}}
的分部代码,但是您需要为每个控制器硬编码它。。。哎呀

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

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

define('GUEST_ROLE',0);
define('ADMIN_ROLE',1);
define('ACCOUNTANT_ROLE',2);
define('WAREHOUSE_ROLE',3);
(对于值为0的来宾角色)我建议让所有控制器扩展a,然后在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的特定控制器定义自定义“initialize”方法,例如,为与控制器相关的所有页面添加标题前缀,您可以调用
parent::initialize()否则它将不会被调用。但只有当您要重写该方法时,才可以这样做

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

快乐编码