【问题标题】:reading yaml from twig从树枝上读取 yaml
【发布时间】:2018-01-02 17:42:17
【问题描述】:

前言: 我记得在 ez4 中有一个 tpl 函数来读取 ini 设置,我们曾经使用它来传递特定的位置或 id,然后我们可以使用它来渲染某些内容。

在 ezplatform 我现在正在做同样的事情,但是使用 PreContentViewListener(在 PreContentViewListener 中读取一个 yml 文件并作为参数传递到视图中),但这感觉不是正确的方法,因为 PreContentViewListener 没有总是被触发,例如在自定义控制器中。

问题 是否有从 twig 模板中读取 yaml 文件的本地方法?搜索文档和可用的包装师后,我找不到任何东西:/

【问题讨论】:

    标签: symfony twig yaml ezpublish ezplatform


    【解决方案1】:

    看看我们的 CjwPublishToolsBundle。 https://github.com/cjw-network/CjwPublishToolsBundle https://github.com/cjw-network/CjwPublishToolsBundle/blob/master/Services/TwigConfigFunctionsService.php

    这里我们有 2 个 wrapper twig 函数

    {{cjw_config_resolver_get_parameter ( 'yamlvariablename', 'namespace default ezsettings') }}
    

    => ezpublish 站点访问匹配

    {{cjw_config_get_parameter( 'mailer_transport' )}}
    

    => 没有站点访问权限的核心 symfony yaml 阅读器

    【讨论】:

      【解决方案2】:

      您可以在 eZ 4 中做很多事情,但并不总是对您的应用程序设计有好处。 ezini 能够从模板中读取配置,但现在在 eZ 平台和扩展 Symfony 中,您需要尊重更常见的模式。 IMO 的观点不应该那么聪明。

      然后从侦听器(PreContentViewListener 或您自己的)向视图注入变量不是一个坏主意。

      您还可以使用 Twig Globals,它可以让您做 2 件全局性的事情:

      • 注入变量 (1)
      • 注入服务 (2)

      看这里:https://symfony.com/doc/current/templating/global_variables.html

      (2):请不要全局注入服务容器,这是不好的

      (1):我不记得 Twig Globals 是否支持站点访问,如果不注入您自己的服务 (2) 来管理对配置的访问可能会更好。

      最后,我认为用例并不常见:

      我们过去常常使用它来传递特定的位置或 ID,然后我们可以使用这些位置或 ID 呈现某些内容。

      在大多数情况下,传递来自配置的 id 来渲染某些东西是个坏主意,最好组织内容结构以让您使用 PHP API 拉取您想要的位置。 (在配置中没有 id 对 dev、stage、preprod 和 prod 架构没有任何麻烦)

      【讨论】:

      • 关于可维护性,我不建议将服务注入模板,而是使用监听器将结果添加到全局 twig 变量中。
      • 虽然我原则上同意这也是对可用资源和项目预算的妥协。如果您有一个主要是前端的开发人员,那么通过管理员与客户端设计内容树和内容类型效果很好,然后同一个人可以构建 tpl 覆盖和 tpls,而后端开发人员的输入很少。但是,我确实明白您的观点,并且在 dev stag 和 prod 之间更改 id 的头痛是真实的。
      【解决方案3】:

      如果您的需求很简单(即读取容器参数),您还可以使用 eZ Publish 配置解析器组件,该组件可在任何带有ezpublish.configResolver 的 Twig 模板中使用。

      您可以指定格式为<namespace>.<scope>.<param_name> 的站点访问感知参数,如下所示:

      parameters:
          app.default.param.name: 'Default param value'
          app.eng.param.name: 'English param value'
          app.cro.param.name: 'Croatian param value'
      

      其中defaultengcro 是不同的eZ Publish 范围。

      然后您可以使用配置解析器来获取当前范围内的参数:

      {{ ezpublish.configResolver.parameter('param.name', 'app') }}
      

      如果您安装了 Legacy Bridge,如果 Symfony 容器参数不存在,这甚至会退回到旧 INI 设置:

      {{ ezpublish.configResolver.parameter('SiteSettings.SiteName', 'site') }}
      

      免责声明:有人说使用配置解析器是不好的做法,但对于更简单的用例,它是可以的,IMO。

      【讨论】:

      • 这可能是这个问题的最佳答案!
      • 谢谢,这正是我想要的。我在文档中找不到它。
      • 是的,除了在记录全局ezpublish 变量的页面上有一行说它可用:doc.ez.no/display/EZP/Twig+Helper
      猜你喜欢
      • 2015-04-22
      • 2015-03-08
      • 2012-07-27
      • 2018-02-09
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多