草庐IT

php - 在 Twig 中有条件地扩展模板

coder 2024-04-08 原文

采用以下树结构:

├───base
│   ├───0001
│   │   └───pages
│   │           file.twig
│   │           file_content.twig
│   └───ext
│       └───store
│       │   └───pages
│       │       └───all
│       │       │       file.twig
│       │       └───0001
│       │               file.twig
│       └───newsletter
│           └───pages
│               └───all
│               │       file.twig
│               └───0001
│                       file.twig
└───pages
    │   file.twig
    └───0001
            file.twig

如您所见,负载为 file.twig散落一地。

我要渲染文件base/0001/pages/file_content.twig的内容.
但是,我希望以下文件可以更改 block 内的内容:

  • ext/<...>/pages/0001/file.twig
  • ext/<...>/pages/all/file.twig
  • /pages/0001/file.twig
  • /pages/file.twig

但是,这些文件可能存在也可能不存在,可能需要也可能不需要并且必须能够更改任何 block 的内容。

有什么方法可以让它工作吗?

到目前为止,我有以下内容:

{% embed 'base/pages/file_content.twig' %}
    {% block page_file %}
        {{ parent() }}
        {% if data.store_enabled %}
            {% include [
                    'base/ext/store/pages/0001/file.twig',
                    'base/ext/store/pages/all/file.twig'
                ] ignore missing
            %}
        {% endif %}
        {% include ['pages/0001/file.twig', 'pages/file.twig'] ignore missing %}
    {% endblock %}
{% endembed %}

这“有效”,因为它呈现页面但不允许覆盖任何 block 。

我怎样才能使它工作?


例如,考虑这种文件结构(是的,文件丢失,这是预期的):

    ├───base
    │   ├───0001
    │   │   └───pages
    │   │           file.twig
    │   │           file_content.twig
    │   └───ext
    │       └───store
    │       │   └───pages
    │       │       └───0001
    │       │               file.twig
    └───pages
            file.twig

文件base/0001/pages/file_content.twig具有以下内容:

{% block page_file %}
    {% block title %}<h1>Nice title</h1>{% endblock %}
    {% block price %}{% endblock %}
    <div class="clearfix"></div>
{% endblock %}

文件base/ext/store/pages/0001/file.twig具有以下内容:

{% block price %}<span class="price">55 &euro;</span>{% endblock %}

和文件pages/file.twig有:

{% block title %}{{ parent() }}<hr>{% endblock %}
{% block price %}<div>{{ parent() }}</div>{% endblock %}

我期望的输出如下:

<h1>Nice title</h1><hr>
<div><span class="price">55 &euro;</span</div>
<div class="clearfix"></div>

但是使用该代码,所有其他文件的更改都将被忽略,输出仅为以下内容:

<h1>Nice title</h1>
<div class="clearfix"></div>

注意:

重要的是要注意我使用的是 Twig 1.33.2,并使用 Twig_Autoloader::register();方法。

我不能使用 Twig 2.x,因为它需要 PHP 7.0+,而我只能使用 PHP 5.3.29。

最佳答案

经过多次尝试,我终于想出了一个办法。

这看起来很丑陋......

假设结构:

├───base
│   ├───0001
│   │   └───pages
│   │           file.twig
│   │           file_content.twig
│   └───ext
│       └───store
│       │   └───pages
│       │       └───0001
│       │               file.twig
└───pages
        file.twig

主文件(base/pages/file.twig)有以下代码:

{% if data.store_enabled %}
    {% include [
            'base/ext/store/pages/0001/file.twig',
            'base/ext/store/pages/all/file.twig',

            'base/pages/file_content.twig'
        ] ignore missing
    %}
{% else %}
    {% include [
            'pages/0001/file.twig',
            'pages/file.twig',

            'base/pages/file_content.twig'
        ] ignore missing
    %}
{% endif %}

这将包括 base/ext/store/pages/ 中的文件(如果存在)。如果那里缺少文件,则会包含文件 base/pages/file_content.twig

base/ext/store/pages/ 中的所有文件顶部必须有以下代码:

{% extends [
        'pages/0001/file.twig',
        'pages/file.twig',

        'base/pages/file_content.twig'
    ]
%}

并且 pages/ 中的文件必须具有以下内容:

{% extends 'base/pages/file_content.twig' %}

这允许您覆盖 base/pages/file_content.twig 中的any block ,并且文件仅在存在时被包含/扩展。

有保证文件(在这种情况下,base/pages/file_content.twig 必须 始终存在)仍将显示“默认”内容,并且不会抛出一个讨厌的异常。


在这个答案的范围之外,我最初发现了一个非常相似的方法,它使用了条件值。

试穿:https://twigfiddle.com/u06tur

关于php - 在 Twig 中有条件地扩展模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43975210/

有关php - 在 Twig 中有条件地扩展模板的更多相关文章

  1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  2. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  3. ruby-on-rails - 如何在 ruby​​ 交互式 shell 中有多行? - 2

    这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式ruby​​shell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f

  4. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  5. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  6. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  7. ruby - ruby 中有 each_if 吗? - 2

    假设我在Ruby中有这个each循环。@list.each{|i|putsiifi>10breakend}我想循环遍历列表直到满足条件。这让我感到“不像Ruby”,因为我是Ruby的新手,是否有Ruby方法可以做到这一点? 最佳答案 您可以使用Enumerable#detect或Enumerable#take_while,取决于您想要的结果。@list.detect{|i|putsii>10}#Returnsthefirstelementgreaterthan10,ornil.正如其他人所指出的,更好的风格是先进行子选择,然后再对其

  8. c - mkmf 在编译 C 扩展时忽略子文件夹中的文件 - 2

    我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。

  9. ruby-on-rails - Mandrill API 模板 - 2

    我正在使用Mandrill的RubyAPIGem并使用以下简单的测试模板:testastic按照Heroku指南中的示例,我有以下Ruby代码:require'mandrill'm=Mandrill::API.newrendered=m.templates.render'test-template',[{:header=>'someheadertext',:main_section=>'Themaincontentblock',:footer=>'asdf'}]mail(:to=>"JaysonLane",:subject=>"TestEmail")do|format|format.h

  10. ruby - Chef Ruby 遍历 .erb 模板文件中的属性 - 2

    所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP

随机推荐