Symfony 3: Как встроить коллекцию форм - после отправки у меня есть только один элемент в массиве вместо многих - PullRequest
0 голосов
/ 28 декабря 2018

Привет, ребята, в Symfony 3: я пытался следовать требованиям «Как встроить коллекцию форм» из документации Symfony 3.Это работает для определенного списка, поскольку они предлагают сначала.Но когда я пытаюсь сделать следующий шаг: разрешить новые теги с прототипом, он возвращает только мою последнюю вставленную форму.Итак, я знаю, что мой Entity работает так же, как EntityType.Ошибка должна быть на ветке.Заранее спасибо за помощь!Это работает для определенного списка, как они предлагают в первой части.Итак, я знаю, что моя сущность работает так же, как и EntityType.

enter code here
{% extends "@App/baseAdmin.html.twig" %} . 

{% block contenu %} . 
    {#{{   dump(formreservation) }}#} . 

{#{{ form(formreservation) }}#} . 
    <div> . 
        Date : {{ "now"|date("d/m/Y") }} . 
        {{ form_start(formreservation, {'attr': {'class': 'form'}}) }} . 
        {#{{   dump(formreservation) }}#} . 
        <p> . 
            {#retourne message erreur si besoin après méthode isValid dans Controleur#} . 
            {{ form_errors(formreservation.spectacle) }} . 
            {{ form_label(formreservation.spectacle, null, 
{'label_attr':  {'class': 'form-label'}}) }} :  

            {{ form_widget(formreservation.spectacle, {'attr': 
{'class': 'form-control'}}) }} . 
        </p>

        <p>
            {{ form_label(formreservation.spectateur, null, 
{'label_attr':  {'class': 'form-label'}}) }}
            <ul class="spectateur" data-prototype="{{ form_widget(formreservation.spectateur.vars.prototype)|e('html_attr') }}">

            </ul>
        </p>
        <p>
            {#retourne message erreur si besoin après méthode isValid dans Controleur#}
            {{ form_errors(formreservation.client) }}
            {{ form_label(formreservation.client, null, 
{'label_attr':  {'class': 'form-label'}}) }} :

            {{ form_widget(formreservation.client, {'attr': 
{'class': 'form-control'}}) }}
        </p>

        {# génération du champ CSRF - _token#  (Cross Site Request Forgeries en champ caché #}
        {{ form_rest(formreservation) }}

        {{ form_end(formreservation) }}
    </div>

    {# Partie JavaScript #}
    <script
        src="https://code.jquery.com/jquery-3.3.1.js"
        integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60="
        crossorigin="anonymous">
    </script>
    <script>

    var $collectionHolder;

    // setup an "add a tag" link
    var $addTagButton = $('<button type="button" class="add_tag_link">Ajoutez un spectateur</button>');
    var $newLinkLi = $('<li></li>').append($addTagButton);

    jQuery(document).ready(function() {
        // Get the ul that holds the collection of tags
        var $collectionHolder = $('ul.spectateur');

        // add a delete link to all of the existing tag form li elements
        //inutile pour le moment, ajoute un bouton qui créé la confusion
       /* $collectionHolder.find('li').each(function() {
            addTagFormDeleteLink($(this));
        });*/

        // add the "add a tag" anchor and li to the tags ul
        $collectionHolder.append($newLinkLi);

        // count the current form inputs we have (e.g. 2), use that as the new
        // index when inserting a new item (e.g. 2)
        $collectionHolder.data('index', $collectionHolder.find(':input').length);

        $addTagButton.on('click', function(e) {
            // add a new tag form (see next code block)
            e.preventDefault();
            addTagForm($collectionHolder, $newLinkLi);
        });
    });


    function addTagForm($collectionHolder, $newLinkLi) {
        // Get the data-prototype explained earlier
        //console.log($collectionHolder);
        var prototype = $collectionHolder.data('prototype');

        //console
        // get the new index
        var index = $collectionHolder.data('index');

        var newForm = prototype;
        // You need this only if you didn't set 'label' => false in your tags field in TaskType
        // Replace '__name__label__' in the prototype's HTML to
        // instead be a number based on how many items we have
        newForm = newForm.replace(/__name__label__/g, 'Spectateur n° '+ index);

        //newForm = newForm.replace(/__name__/g, index);

        // increase the index with one for the next item
        $collectionHolder.data('index', index + 1 );

        // Display the form in the page in an li, before the "Add a tag" link li
        var $newFormLi = $('<li></li>').append(newForm);
        $newLinkLi.before($newFormLi);

        // add a delete link to the new form
        addTagFormDeleteLink($newFormLi);
    }

    function addTagFormDeleteLink($tagFormLi) {
        var $removeFormButton = $('<button type="button">enlever ce spectateur</button><br>');
        $tagFormLi.append($removeFormButton);

        $removeFormButton.on('click', function(e) {
            // remove the li for the tag form
            e.preventDefault();
            $tagFormLi.remove();
        });
    }
</script>

{% endblock %}

Ожидаемый результат: коллекция, содержащая все встроенные формы.На самом деле он возвращает только последний элемент в форме для встраивания.Я проверил Entity, и он не использует метод «add», который я добавил в Entity.

здесь добавляемая часть построителя ReservationType:

->add('spectateurs', CollectionType::class, [
                'entry_type' => SpectateurReservationType::class,  
                'entry_options' => ['label' => false],  
                'allow_add' => true,  
                'allow_delete' => true,  
                'prototype' => true,  
                'by_reference' => false,  
            ] . 
        ) .

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

моя строка была:

newForm = newForm.replace (/ name__label / g, 'Spectateur n °' + index);

Моя ошибка была, ядумал, что смогу изменить это как текстовую метку:

Здорово, только это было!Большое спасибо, вы спасли меня!Теперь работает отлично!

0 голосов
/ 29 декабря 2018

)

Вы только что прокомментировали часть кода JS

newForm = newForm.replace(/__name__/g, index);

Раскомментируйте это и все будет хорошо

...