Benutzerdefiniertes Formular-Feld-Vorlage mit Zweig

Ich würde gerne eine benutzerdefinierte Vorlage erstellen, in twig Rendern des Formulars angezeigt.

Beispiel:

{{ form_row(form.field) }}

Diese kann überschrieben werden, durch die form, das Aussehen

{% block form_row %}
... custom code
{% endblock form_row %}

Was ich tun möchte, ist dies:

{% block custom_row %}
... custom code
{% endblock custom_row %}

und verwenden Sie es wie diese:

{{ custom_row(form.field }}

jedoch, löst dies eine Ausnahme, die Methode custom_row nicht gefunden.

Mein Verständnis ist, dass dies getan werden kann, mit Twig-Erweiterung, aber ich weiß nicht, wie registrieren Sie einen block, um eine Funktion sein.

Update

was ich eigentlich will:

Nutze ich twitter bootstrap und ein Bündel, die überschreibt alle Formular-Themen. Und es macht ein div um ein radio, so ist es nicht inlined. Also wollte ich etwas wie das hier tun:

kopieren Sie Ihre Vorlage und loszuwerden, die div:

{% block inline_radio_row %}
    {% spaceless %}
        {% set col_size = col_size|default(bootstrap_get_col_size()) %}

        {% if attr.label_col is defined and attr.label_col is not empty %}
            {% set label_col = attr.label_col %}
        {% endif %}
        {% if attr.widget_col is defined and attr.widget_col is not empty %}
            {% set widget_col = attr.widget_col %}
        {% endif %}
        {% if attr.col_size is defined and attr.col_size is not empty %}
            {% set col_size = attr.col_size %}
        {% endif %}

        {% if label is not sameas(false) %}
            {% if not compound %}
                {% set label_attr = label_attr|merge({'for': id}) %}
            {% endif %}
            {% if required %}
                {% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required')|trim}) %}
            {% endif %}
            {% if label is empty %}
                {% set label = name|humanize %}
            {% endif %}
            {% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' radio-inline')|trim}) %}
            <label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>
                {{ block('radio_widget') }}
                {{ label|trans({}, translation_domain) }}
            </label>
        {% else %}
            {{ block('radio_widget') }}
        {% endif %}
        {{ form_errors(form) }}
    {% endspaceless %}
{% endblock inline_radio_row %}

dann

{{ inline_radio_row(form.field) }}

Landete ich nur das überschreiben der ganze Thema, und fügte hinzu, wenns um das div in Frage, a die Klasse (radio-inline). Aber ich bin immer noch Fragen, wenn es gibt einen Weg, um diese Arbeit zu machen. Wie es scheint, macht Sie so hart arbeiten für etwas so einfach.

Update 2

Fand ich die Funktionalität:

class FormExtension extends \Twig_Extension
{
    public function getFunctions()
    {
        return array(
            'inline_radio_row'  => new \Twig_Function_Node(
                'Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode',
                array('is_safe' => array('html'))
            ),
        );
    }
}

Dieser genau das tut, was ich will, aber es sagt, es ist veraltet. Kennt jemand eine aktualisierte version, wie dies zu nutzen?

Update 3

Ähnliche Funktionalität kann auch erzielt werden, mit http://twig.sensiolabs.org/doc/tags/include.html

  • Wollen Sie dies für ein oder mehrere Felder?
  • ein, obwohl ich dont sehen, wie es einen Unterschied macht
  • Es ist einfacher zu Personalisieren, wird ein Feld als die Definition einer benutzerdefinierten Vorlage.
  • Was ist dein Ziel? Was ist das erwartete Ergebnis?
  • Mein Ziel ist, erstellen Sie eine Funktion, die aufgerufen werden kann, twig, wie form_row, form_widget, radio_row.. etc, dann rendert meine Vorlage. Ich verstehen, es könnte workarouds... jetzt habe ich eine Standard-Vorlage überschrieben (in meinem Fall radio_row) und noch ein paar, wenn das zu erreichen, was ich will. Aber ich bin neugierig, ob es ist ein Weg, um benutzerdefinierte Vorlagen definieren. Es ist eine sehr nützliche Sache zu haben, so etwas wie teilweise auf den in ASP.NET MVC.
  • Wenn Makros sind nicht geeignet, können Sie erklären, warum? 🙂
  • nicht schauen Sie in die Makros vor. Sie könnte nützlich sein, in der Tat. aber nicht übergeben bekommen, die den Kontext und die option der gleichen Weise wie die form-Funktionen. Lassen Sie mich aktualisieren Sie die Frage mit was ich eigentlich Tat.
  • Haben Sie versuchen, hinzufügen einer CSS-Klasse des div-Zeile, um das überschreiben der bootstrap-CSS-Regeln? Es sollte einfacher sein, als Umschreibung aller Formular-Feld.
  • Es wahrscheinlich getan werden könnte, aber warum sollte ich das tun, wenn es einen vordefinierten Weg, es zu tun mit boostraps Standard-css. Jedenfalls der Punkt ist, ich möchte wissen, ob das, was ich Rede in meiner Frage, ist möglich.
  • Ok, jetzt, dass ich weiß, was du versuchst zu erreichen, es klingt wie das, was Sie brauchen, ist Anwendung-Breite form-rendering-Anpassung. 🙂
  • Links zu offiziellen tutorials sind nicht gonna helfen. Ich habe durch alle von Ihnen. Wenn Sie wissen, wie zu tun genau das, was beschrieben wird, in die Frage schreiben Sie bitte eine Antwort, die erklärt wie.
  • Frage, aktualisiert mit neuesten Erkenntnissen.

InformationsquelleAutor Necros | 2013-12-14
Schreibe einen Kommentar