10

変数を使用して特定のマクロ名を呼び出そうとしています。

インポートされているマクロファイルがあります

{% import 'form-elements.html.twig' as forms %}

このファイルには、テキスト、テキストエリア、選択、ラジオなど、すべてのフォーム要素マクロが含まれています。

要素を含む、渡される配列変数があります。

$elements = array(
    array(
        'type'=>'text,
        'value'=>'some value',
        'atts'=>null,
    ),
    array(
        'type'=>'text,
        'value'=>'some other value',
        'atts'=>null,
    ),
);

{{ elements }}

私がやろうとしているのは、マクロからそれらの要素を生成することです。名前で呼び出すと、問題なく機能します。

{{ forms.text(element.0.name,element.0.value,element.0.atts) }}

しかし、私がやりたいのは次のようなものです。

{% for element in elements %}
{{ forms[element.type](element.name,element.value,element.atts) }}
{% endfor %}

次のすべてを試したところ、同じエラーが発生しました。

{{ forms["'"..element.type.."'"](element.name,element.value,element.atts) }}
{{ forms.(element.type)(element.name,element.value,element.atts) }}
{{ forms.{element.type}(element.name,element.value,element.atts) }}

残念ながら、これにより次のエラーがスローされます。

 Fatal error: Uncaught exception 'LogicException' with message 'Attribute "value" does not exist for Node "Twig_Node_Expression_GetAttr".' in Twig\Environment.php on line 541

ソリューションまたは使用するより良いスキーマに関するヘルプやアドバイスは非常に役立ちます。

4

2 に答える 2

16

fabpotが提供するように、他の人がこれに対する答えを望んでいるのではないかと思いました。

これは確かにサポートされていないものです。動的な名前でマクロを呼び出す(問題を明確にするために適切な例外を追加しました)。

あなたが本当にそれをしたいのなら、あなたは次のコードでそうすることができます:

{{attribute(forms、element.type、[element.name、element.value、element.atts])}}

-fabpot

https://github.com/twigphp/Twig/issues/922#issuecomment-11133299

于 2012-12-07T17:42:05.637 に答える
1

Twigでは動的マクロがサポートされていない可能性があります。

ただし、他のテンプレートを動的に含めることができるため、簡単な回避策があります。

例:
サイトに多数のコンテンツモジュールまたはコンテンツブロックがある(またはそれらを呼び出したい)とします。そして、これらの各モジュールのレンダリングを担当するTwigマクロがあります。

{# modules.twig #}

{% macro module1(config) %}
  <div>module one</div>
{% endmacro %}

{% macro module2(config) %}
  <div>module two</div>
{% endmacro %}

{% macro module3(config) %}
  <div>module three</div>
{% endmacro %}

ここで、これらのマクロを動的に呼び出す必要があるのは、次のように、それぞれに追加のテンプレートを追加することです。

{# module1.twig #}

{% import "modules.twig" as modules %}
{{ modules.module1(config) }}
{# module2.twig #}

{% import "modules.twig" as modules %}
{{ modules.module2(config) }}
{# module3.twig #}

{% import "modules.twig" as modules %}
{{ modules.module3(config) }}

最後に、実際のページテンプレートには、マクロを呼び出す代わりにテンプレートを含めるだけです。

{# template.twig #}

{# this is the macro's name to be called #}
{% set macro = 'module2' %}
{# this is just a config object to be passed to the macro #}
{% set config = {} %}

{% include macro ~ '.twig' with { config: config } only %}

Etvoilá、(動的に生成された)出力はになります<div>module two</div>

于 2019-05-03T13:28:06.103 に答える