У меня есть поле формы, которое представляет собой набор другой сущности. Цель состоит в том, чтобы при создании заявки была создана начальная запись, которая настраивается как единое множество отношений. Когда я устанавливаю для коллекции «allow_add» и «protoype» false, она отображает пустой div. Довольно бесполезно. Если я установил для коллекции значение «allow_add» и «protoype» true, тогда он поместит все содержимое поля формы в атрибут data-protype элемента div.

Например:

<div class="form-group"><label>Support Entries</label><div id="form_supportEntries" data-prototype="    &lt;div class=&quot;form-group&quot;&gt;&lt;label class=&quot;required&quot;&gt;__name__label__&lt;/label&gt;&lt;div id=&quot;form_supportEntries___name__&quot;&gt;&lt;div class=&quot;form-group&quot;&gt;&lt;label for=&quot;form_supportEntries___name___comment&quot; class=&quot;required&quot;&gt;Comment&lt;/label&gt;&lt;textarea class=&quot;form-control&quot; id=&quot;form_supportEntries___name___comment&quot; name=&quot;form[supportEntries][__name__][comment]&quot; required=&quot;required&quot;&gt;&lt;/textarea&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;"></div></div>

Затем мне нужно использовать этот javascript для отображения поля формы:

    <script>
        var entryFieldHTML = $("#form_supportEntries").attr("data-prototype");
        $("#form_supportEntries").html(entryFieldHTML);
    </script>

Как только я запускаю этот javascript, он отображается и работает должным образом. Но мне действительно не нужен этот атрибут data-prototype, потому что у вас будет только один supportEntry в этой форме.

Этот вопрос связан с: формой Symfony создает новый объект и создает первый объект типа "один ко многим"

1
Dominick 5 Мар 2014 в 19:58

3 ответа

Лучший ответ

На стороне вашего контроллера инициализируйте первый SupportEntry:

// My controller, creating the form
$supportTicket = new SupportTicket();
$supportTicket->addSupportEntry(new SupportEntry); // It's the frst item of the collection

В вашем файле Twig визуализируйте единственный первый элемент с помощью;

{{ form_row(form.supportEntries) }}

Или лучше что-то вроде:

{{ form_row(form.supportEntries.children.0) }}
2
AlterPHP 5 Мар 2014 в 17:03

Вы можете вернуться к 'allow_add' => false, а затем использовать этот фрагмент кода контроллера:

public function someControllerAction(){
    $entity = ...; 

    // It is vital for `supportEntities` property not to be NULL
    // Add new, blank, sub-entity, since you'll need only one
    $entity->getSupportEntries()->add(new SupportEntry());      

    $form = $this->createForm( new YourFormClass(), $entity);

    // REST OF THE LOGIC    
}

Это то, чего вы пытались достичь?

2
Jovan Perovic 5 Мар 2014 в 16:13

Если вам нужно только одно поле формы, вы можете отобразить его в шаблоне следующим образом:

{{ form_widget(form.support_entries.vars.prototype)|replace({'__name__':1})|raw }}

Это работает, только если ранее не вызывались ни {{ form_widget(form.support_entries) }}, ни {{ form_row(form.support_entries) }}.

К сожалению, это не сработает, если вы хотите отобразить более одного поля формы из одной коллекции (что мне и нужно сделать). Это связано с тем, что визуализация поля формы вызывает вызов FormView::setRendered() (через FormRenderer::searchAndRenderBlock()), который устанавливает флаг, который проверяется перед повторной визуализацией того же поля формы.

0
Mat2 16 Авг 2019 в 15:29