Phalcon / Volt动态构建/渲染通用模板区域(部分)

时间:2017-03-18 11:00:50

标签: php navigation phalcon templating volt

我使用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从页面呈现部分内容。

谢谢!

1 个答案:

答案 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方法的东西,但我不会详细介绍这个变种。