我使用Phalcon框架以Volt作为模板引擎启动项目。我有一些Symfony / Twig的经验。 我阅读文档并尝试在互联网上搜索,但找不到令人满意的方式来完成我想要的东西(我觉得这里描述的解决方案很难看:How do I create common template with header and footer for phalcon projects with Volt Engine;它没有使用Volt本身用于导航。)
所以故事很简单:我的基本模板由4个部分组成:导航,标题,内容和页脚。我使用partials在基本模板中包含公共区域,如导航,页眉和页脚,与#34;静态数据"一起使用。
现在的问题是:如何使用来自数据库的项目动态生成导航菜单?模板的公共区域也必须来自DB,也可以在页眉,页脚和侧边栏中。必须在所有控制器动作中获取它听起来有点过分而且不是非常干(可能在init部分执行?但必须在每个控制器中完成。也许在抽象控制器中,我不知道。)
在Phalcon / Volt中实现这一目标的最佳方法是什么?在Symfony / Twig中,您可以从视图中调用控制器操作,因此您可以使用LayoutController从页面呈现部分内容。
谢谢!
答案 0 :(得分:2)
以下是一些变体:
1)您的控制器可以扩展BaseController,在它的initialize()
方法中,您可以将这些变量分配给视图。
class BaseController extends \Phalcon\Mvc\Controller
{
public function initialize()
{
// Common Variables
$this->view->assetsSuffix = $this->config->debug ? '' : '.min';
}
2)创建一个加载数据的自定义Volt函数。
// In your Volt service:
$compiler->addFunction('getMenu', function($resolvedArgs, $exprArgs){
return 'Helpers\CommonFunctions::getMenu(' . $resolvedArgs . ')';
})
// Helper file and function
public static function getMenu()
{
return \Models\Menu::find();
}
// Volt usage
{% set menuItems = getMenu() %}
{% for item in menuItems %}
{% endfor %}
3)使用模型直接从模板查询数据库。然而,Volt尚不支持此功能(不确定是否在最新版本中添加,必须确认)。
<?php $menuItems = \Models\Menu::find(); ?>
{% for item in menuItems %}
{% endfor %}
4) Ajax / Javascript,但这实际上取决于您的应用程序。类似Angular方法的东西,但我不会详细介绍这个变种。