【问题标题】:Phalcon Design approach / patternPhalcon 设计方法/模式
【发布时间】:2014-05-29 03:52:05
【问题描述】:

大家好,感谢您花时间阅读本文。

我一直在使用 Phalcon 来实现高性能 JSON/XML API。 管理这个应用程序的后端曾经/仍然由一个过时的 symfony 版本驱动,但它将被 Phalcon 和 Volt 模板引擎取代。

现在我的问题如下:

想象一个基本应用程序和一个基本模板,并且应用程序是模块化的。大部分模块会由不同的团队开发,但都必须集成 niceley,从程序逻辑方面来说这不是问题。

但是想象一下: 你有一个简单的页面、一些表单、头部、导航等等。 现在有人想添加一个模块,该模块将模板块注入页脚以用于任何目的。例如在页脚中添加一个 TagCloud(用于 SEO 目的)。

这里的想法是,插件可以编辑除了它自己带来的模板文件之外的任何模板文件。

如何在初始开发后不更改基本模板的情况下实现这一点?

这个想法基本上是挂钩一个事件,为了简单起见,我们称之为 TEMPLATE_RENDER。 TEMPLATE_RENDER 被触发,为其注册的每个侦听器现在都有机会向模板添加内容,例如附加块等。所有这些都无需手动更改核心模板。

如果有办法在 Volt 中简单地将一堆模板文件添加在一起并输出编译结果就足够了。


编辑:

好的,经过一番思考,我在 Volt 中寻找的是:

Compiler#compileMultipleFiles(String... files);

所以可以这样使用:

$compiler->compileMultipleFiles('/path/to/template1','/path/to/template2', ...);

“理论上”除了将 file1、file2、...、fileN 中的所有内容放入一个大文件中,然后将其编译为单个模板之外,什么都不会做。如果还不可能,我可以通过简单地将每个文件的内容组合到单个文件或缓存变量中并使用 compileString() 来模拟该功能,但这会破坏模板中的任何相对路径,这将是一个问题。

我也可以手动编译每个模板,但我最终会得到一个纯 html 文档,而无法附加到主模板中的块。

【问题讨论】:

    标签: templates design-patterns phalcon volt


    【解决方案1】:

    我相信您正在寻找Volt include。您可以在模板中留下一些测试,例如:

    {% if foo.enabled %}
      {% include "foo/bar.volt" %}
    {% endif %}
    

    如果您需要比这更复杂的东西,您也可以使用template inheritance

    【讨论】:

    • 您没有正确阅读我的问题。包含要求主模板事先了解小部分。如果我想将一些来自新安装的插件的东西注入到模板中,我也会遇到同样的问题。仅当我像上面所说的那样执行时,包含才会有用:在主模板的末尾放置一个 foreach 循环并包含每个值,然后附加到该数组以动态添加新的模板部分。但我宁愿不使用这样的解决方法。
    【解决方案2】:

    显然没有直接这样的功能。

    但是,您可以使用一个数组并在主模板末尾的该区域上进行迭代,并动态包含传入其中的任何文件。

    【讨论】:

      猜你喜欢
      • 2019-01-07
      • 2016-01-21
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      相关资源
      最近更新 更多