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 方法,但我不会详细介绍这个变量。
我正在开始一个使用 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 方法,但我不会详细介绍这个变量。