How to customize the data-prototype attribute in Symfony 2 forms

后端 未结 11 1190
梦如初夏
梦如初夏 2020-12-12 11:35

Since umpteens days, I block on a problem with Symfony 2 and forms.

I got a form of websites entities. \"Websites\" is a collection of website\'s entities and each w

11条回答
  •  北荒
    北荒 (楼主)
    2020-12-12 12:29

    This post focuses on using pre-existing conventions within the twig template.

    Basing off "How to Embed a Collection of Forms" from the Symfony Cookbook (http://symfony.com/doc/master/cookbook/form/form_collections.html), you can just enter whatever html_escaped form data you wish in the data-prototype (maybe considered a hack, but works wonderfully) and only pages using that template will change.

    In the example, they tell you to put:

        
      ...

    This can be successfully replaced with something such as:

    
        ...pre existing data here...
        
    Id Name

    Where the data-type attribute of the table with the class "tags" above is the html-escaped version (and line breaks removed though spaces are ok and required) of:

    
        

    ...but you must also adjust the javascript in the example to add tr's instead of li elements:

    function addTagForm(collectionHolder, $newLinkTr) {
        ...
        // Display the form in the page in an tr, before the "Add a question" link tr
        var $newFormTr = $('').append(newForm);
        ...
    };
    
    ...
    
    // setup an "add a tag" link
    var $addTagLink = $('Add a tag');
    var $newLinkTr = $('').append($addTagLink);
    
    ...
    

    For me, the next step is figuring out how to define the prototype in an external file that I can somehow call in the twig template for the data-prototype that dynamically works with the form. Something like:

    So if one of the other posts is describing this and I am too dense or if someone knows how to do such, say so!

    There is a link to something from gitHub from Francois, but I didn't see any explanation so I think that is probably the more dynamic method I'll get to one of these near-future days.

    Peace, Steve

    Update:

    One can also use just parts of the prototype:

    data-prototype="<tr>  <td>{{ form_row(form.tags.vars.prototype.tagId) | e }}</td> <td>{{ form_row(form.tags.vars.prototype.tagName) | e }}</td></tr>"
    

    Where the data-type attribute of the table with the class "tags" above is the html-escaped version (and line breaks removed though spaces are ok and required) of:

    (I used http://www.htmlescape.net/htmlescape_tool.html.)

    Symfony will replace the information between the {{}} with an html_escaped (because of the "|e") rendered field when the page is rendered. In this way, any customization at the field-level is not lost, but! you must manually add and remove fields to the prototype as you do so with the entity :)

    提交回复
    热议问题
    {{ form_row(form.tags.vars.prototype.tagId) | e }} {{ form_row(form.tags.vars.prototype.tagName) | e }}