【问题标题】:Phalcon / Volt dynamically build/render common template areas (partials)Phalcon / Volt 动态构建/渲染公共模板区域(部分)
【发布时间】:2017-03-18 11:00:49
【问题描述】:

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

所以故事很简单:我的基本模板由 4 部分组成:导航、页眉、内容和页脚。我使用部分来包含基本模板中的公共区域,如导航、页眉和页脚,与“静态数据”一起工作得很好。

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

在 Phalcon/Volt 中实现此目的的最佳方法是什么?在 Symfony/Twig 中,您可以从视图中调用控制器操作,因此您可以拥有像 LayoutController 一样从页面呈现局部的。

谢谢!

【问题讨论】:

    标签: php navigation phalcon templating volt


    【解决方案1】:

    这里有几个变种:​​

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

    【讨论】:

    • 尼古拉,谢谢你的建议。 4号并非如此。数字 3 听起来有点奇怪,因为您必须直接从视图中调用模型。数字 2 有点类似于 3,但您只是通过 Volt 函数进行代理。我在想1号是要走的路。我可能会坚持通过控制器的方法。无论如何,我都倾向于这样做,只是想确保我没有遗漏一些明显的东西,因为我是一个 Phalcon/Volt 菜鸟。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2016-01-29
    • 2018-11-26
    • 1970-01-01
    • 2019-06-26
    • 2011-05-23
    • 1970-01-01
    相关资源
    最近更新 更多