PHALCON PHP - 基于用户配置文件的不同视图
PHALCON PHP - Different views based on user profile
我创建了 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
作为 "landing page",然后从那里检查 if-statement 以确定用户的角色。然后从 if-statement 使用像 {{ partial("index.1.volt") }}
这样的部分,但你需要为每个控制器 hard-code 这个......糟糕......
不过,我推荐的一个好的解决方案是使用视图的 exists 方法来检查控制器中是否存在视图。这个想法是您将此方法传递给您正在查找的视图文件的字符串路径,但省略扩展名。您省略扩展名的原因是因为 Phalcon 允许您使用多个渲染引擎,因此混合使用 .volt
和 .phtml
的应用程序可以工作。
假设您正在使用这样的用户角色:
define('GUEST_ROLE',0);
define('ADMIN_ROLE',1);
define('ACCOUNTANT_ROLE',2);
define('WAREHOUSE_ROLE',3);
(来宾角色的值为 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 的特定控制器定义自定义 "initialize" 方法,例如为与控制器相关的所有页面添加标题前缀,您调用 parent::initialize();
否则它不会被调用。但这只是在您要覆盖该方法的情况下。
您可能已经在使用 ControllerBase 并执行类似的逻辑,如果是这样,您需要编辑现有的 "initialize" 方法并将我的代码与您的代码合并。
编码愉快。
我创建了 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
作为 "landing page",然后从那里检查 if-statement 以确定用户的角色。然后从 if-statement 使用像 {{ partial("index.1.volt") }}
这样的部分,但你需要为每个控制器 hard-code 这个......糟糕......
不过,我推荐的一个好的解决方案是使用视图的 exists 方法来检查控制器中是否存在视图。这个想法是您将此方法传递给您正在查找的视图文件的字符串路径,但省略扩展名。您省略扩展名的原因是因为 Phalcon 允许您使用多个渲染引擎,因此混合使用 .volt
和 .phtml
的应用程序可以工作。
假设您正在使用这样的用户角色:
define('GUEST_ROLE',0);
define('ADMIN_ROLE',1);
define('ACCOUNTANT_ROLE',2);
define('WAREHOUSE_ROLE',3);
(来宾角色的值为 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 的特定控制器定义自定义 "initialize" 方法,例如为与控制器相关的所有页面添加标题前缀,您调用 parent::initialize();
否则它不会被调用。但这只是在您要覆盖该方法的情况下。
您可能已经在使用 ControllerBase 并执行类似的逻辑,如果是这样,您需要编辑现有的 "initialize" 方法并将我的代码与您的代码合并。
编码愉快。