Как настроить атрибут data-prototype в формах Symfony 2 - PullRequest
53 голосов
/ 26 сентября 2011

С нескольких дней я блокирую проблему с Symfony 2 и формами.

Я получил форму сущностей веб-сайтов.«Веб-сайты» - это набор сущностей веб-сайтов, и каждый веб-сайт содержит два атрибута: «тип» и «URL».

Если я хочу добавить больше одного веб-сайта в свою базу данных, я могу нажать «Добавить».ссылка на другой веб-сайт, которая добавляет еще одну строку веб-сайта в мою форму.Поэтому, когда вы нажимаете кнопку отправки, вы можете добавить один или несколько веб-сайтов одновременно.

В этом процессе для добавления строки используется атрибут data-prototype, который может генерировать вложенный веб-сайт.form.

Проблема в том, что я настраиваю свою форму так, чтобы она имела отличный графический рендеринг ... вот так:

<div class="informations_widget">{{ form_widget(website.type.code) }}</div>
<div class="informations_error">{{ form_errors(website.type) }}</div>
<div class="informations_widget">{{ form_widget(website.url) }}</div>
<div class="informations_error">{{ form_errors(website.url) }}</div>

Но прототип данных не заботится об этой настройке,с тегами и свойствами HTML и CSS.Я сохраняю рендеринг Symfony:

<div>
<label class=" required">$$name$$</label>
<div id="jobcast_profilebundle_websitestype_websites_$$name$$">
<div>
<label class=" required">Type</label>
<div id="jobcast_profilebundle_websitestype_websites_$$name$$_type">
<div>
<label for="jobcast_profilebundle_websitestype_websites_$$name$$_type_code" class=" required">label</label>
<select id="jobcast_profilebundle_websitestype_websites_$$name$$_type_code" name="jobcast_profilebundle_websitestype[websites][$$name$$][type][code]" required="required">
<option value="WEB-OTHER">Autre</option>
<option value="WEB-RSS">Flux RSS</option>
...
</select>
</div>
</div>
</div>
<div>
<label for="jobcast_profilebundle_websitestype_websites_$$name$$_url" class=" required">Adresse</label>
<input  type="url" id="jobcast_profilebundle_websitestype_websites_$$name$$_url" name="jobcast_profilebundle_websitestype[websites][$$name$$][url]" required="required" value="" />
</div>
</div>
</div>

У кого-нибудь есть идея сделать этот хак?

Ответы [ 11 ]

0 голосов
/ 30 апреля 2013

Этот пост посвящен использованию уже существующих соглашений в шаблоне веточки.

Основываясь на «Как встроить коллекцию форм» из Кулинарной книги Symfony (http://symfony.com/doc/master/cookbook/form/form_collections.html),, вы можете просто ввести любые данные формы html_escaped, которые вы пожелаете, в data-prototype (может считаться хаком, но прекрасно работает) изменятся только страницы, использующие этот шаблон.

В приведенном примере они говорят вам:

    <ul class="tags" data-prototype="{{ form_widget(form.tags.vars.prototype)|e }}">
    ...
    </ul>

Это может быть успешно заменено чем-то вроде:

<table class="tags" data-prototype="&lt;tr&gt;  &lt;td&gt;&lt;div&gt;&lt;input type=&quot;text&quot; id=&quot;task_tags__name__tagId&quot; name=&quot;task[tags][__name__][taskId]&quot; disabled=&quot;disabled&quot; required=&quot;required&quot;    size=&quot;10&quot; value=&quot;&quot; /&gt;&lt;/div&gt;&lt;/td&gt; &lt;td&gt;&lt;div&gt;&lt;input type=&quot;text&quot; id=&quot;task_tags__name__tagName&quot; name=&quot;task[tags[__name__][tagName]&quot; required=&quot;required&quot; value=&quot;&quot; /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;">
    <tr>
        <th>Id</th>
        <th>Name</th>
    </tr>
    <tr>
    ...pre existing data here...
    </tr>
</table>    

Где атрибут типа данных таблицы с классом «tags» выше - это html-экранированная версия (и разрывы строк удалены, хотя пробелы в порядке и обязательны):

<tr>
    <td><div><input type="text" id="task_tags__name__tagId" name="task[tags][__name__][taskId]" disabled="disabled" required="required"    size="10" value="" /></div></td>
    <td><div><input type="text" id="task_tags__name__tagName" name="task[tags[__name__][tagName]" required="required" value="" /></div></td>
</tr>

... но вы также должны настроить javascript в примере, чтобы добавить tr вместо li:

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

...

// setup an "add a tag" link
var $addTagLink = $('<a href="#" class="add_tag_link">Add a tag</a>');
var $newLinkTr = $('<tr></tr>').append($addTagLink);

...

Для меня следующий шаг - выяснить, как определить прототип во внешнем файле, который я могу как-то вызвать в шаблоне ветки для data-prototype, который динамически работает с формой. Что-то вроде:

<table class="tags" data-prototype="{{somefunction('App\Bundle\Views\Entity\TagsPrototypeInTable')}}">

Так что, если один из других постов описывает это, а я слишком тупой или если кто-то знает, как это сделать, так и скажите!

Существует ссылка на что-то из gitHub из Francois, но я не нашел никакого объяснения, поэтому я думаю, что это, вероятно, более динамичный метод, который я получу в один из этих ближайших дней.

Мир, Стив

Обновление:

Можно также использовать только части прототипа:

data-prototype="&lt;tr&gt;  &lt;td&gt;{{ form_row(form.tags.vars.prototype.tagId) | e }}&lt;/td&gt; &lt;td&gt;{{ form_row(form.tags.vars.prototype.tagName) | e }}&lt;/td&gt;&lt;/tr&gt;"

Где атрибут типа данных таблицы с классом «tags» выше - это html-экранированная версия (и разрывы строк удалены, хотя пробелы в порядке и обязательны):

<td>{{ form_row(form.tags.vars.prototype.tagId) | e }}</td>
<td>{{ form_row(form.tags.vars.prototype.tagName) | e }}</td>

(я использовал http://www.htmlescape.net/htmlescape_tool.html.)

Symfony заменит информацию между {{}} на отображаемое поле html_escaped (из-за "| e") при отображении страницы. Таким образом, любая настройка на уровне поля не теряется, но! вы должны вручную добавлять и удалять поля в прототипе, как вы делаете это с сущностью:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...