Phalcon / Volt 动态 build/render 通用模板区域(部分)

Phalcon / Volt dynamically build/render common template areas (partials)

我正在开始一个使用 Phalcon 框架的项目,并将 Volt 作为模板引擎。我对 Symfony/Twig 有一些经验。 我阅读了文档并尝试在整个互联网上进行搜索,但找不到令人满意的方法来完成我想要的(我发现这里描述的解决方案很丑陋:How do I create common template with header and footer for phalcon projects with Volt Engine;它本身没有使用 Volt 进行导航。)

故事很简单:我的基本模板由 4 个部分组成:导航、页眉、内容和页脚。我使用 partials 将公共区域包括在基本模板中,如导航、页眉和页脚,与 "static data" 一起工作得很好。

现在的问题是:如何使用来自数据库的项目动态生成导航菜单?该模板将在页眉、页脚和侧边栏中具有必须来自数据库的公共区域。必须在所有控制器操作中获取它听起来有点矫枉过正而且不是很干(也许在初始化部分做?但必须在每个控制器中完成。也许在抽象控制器中,我不知道。)

在 Phalcon/Volt 中完成此任务的最佳方法是什么?在 Symfony/Twig 中,您可以从视图中调用控制器操作,这样您就可以拥有一个从页面呈现部分内容的 LayoutController。

谢谢!

这里有几个变体:

1) 您的控制器可以扩展一个 BaseController 并且在它的 initialize() 方法中您可以将这些变量分配给视图。

class BaseController extends \Phalcon\Mvc\Controller
{
    public function initialize()
    {
        // Common Variables
        $this->view->assetsSuffix = $this->config->debug ? '' : '.min';
    }

2) 创建一个加载数据的自定义电压函数。

// 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 方法,但我不会详细介绍这个变量。