Ошибка шаблона ветки Symfony4: переменная "виджет" не существует - PullRequest
0 голосов
/ 20 ноября 2018

Я получаю Twig_Error_Runtime enter image description here

Я пытаюсь найти ошибку, которую я сделал, но я не вижу никакой ... возможно, я смотрю наневерный файл, но я пробовал искать везде, где я делал изменения до появления этой ошибки.

Это мой код ветки:

{% extends 'base.html.twig' %}
{% block body %}
    <div class="container">

        {% form_theme form 'bootstrap_4_layout.html.twig' %}
        {{ form_start(form) }}

        <br>

        Name {{ form_widget(form.name) }}
        Price {{ form_widget(form.price) }}
        Available {{ form_widget(form.available) }}
        Date {{ form_widget(form.date) }}
        <div class="row js-ticket-time-wrapper"
             data-prototype="{{ form_widget(form.times.vars.prototype)|e('html_attr') }}"
             data-index="{{ form.times|length }}">
            {% for time in form.times %}
                <div class="col-xs-4 js-ticket-time-item">
                    <a href="#" class="js-remove-time pull-right">
                        <span class="fa fa-close"></span>
                    </a>
                    {{ form_row(time.name) }}
                </div>
            {% endfor %}
            <a href="#" class="js-ticket-time-add">
                <span class="fa fa-plus-circle"></span>
                Add another Time
            </a>
        </div>
        <button type="submit" class="btn btn-primary" formnovalidate>Save</button>
        {{ form_end(form) }}
    </div>

{% endblock %}
{% block js %}
    {{ parent() }}
    <script>
        jQuery(document).ready(function() {
            var $wrapper = $('.js-ticket-time-wrapper');
            $wrapper.on('click', '.js-remove-time', function(e) {
                e.preventDefault();
                $(this).closest('.js-ticket-time-item')
                    .fadeOut()
                    .remove();
            });
            $wrapper.on('click', '.js-ticket-time-add', function(e) {
                e.preventDefault();
                // Get the data-prototype explained earlier
                var prototype = $wrapper.data('prototype');
                // get the new index
                var index = $wrapper.data('index');
                // Replace '__name__' in the prototype's HTML to
                // instead be a number based on how many items we have
                var newForm = prototype.replace(/__name__/g, index);
                // increase the index with one for the next item
                $wrapper.data('index', index + 1);
                // Display the form in the page before the "new" link
                $(this).before(newForm);
            });
        });
    </script>
{% endblock %}

Я также внес изменения во время сущностей& Ticket, но я не думаю, что это как-то связано.

Вот моя форма TicketType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name',TextType::class)
        ->add('price',MoneyType::class)
        ->add('available',IntegerType::class)
        ->add('date',DateType::class)
        ->add('times', CollectionType::class, array(
            'entry_type' => \App\Form\TimeType::class,
            'allow_delete' => true,
            'by_reference' => false,
            'allow_add' => true,
    ));
}

А это TimeType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('name', TextType::class);
}

1 Ответ

0 голосов
/ 20 ноября 2018

Поскольку имя класса вашего типа формы TimeType совпадает с именем типа Symfony TimeType (https://symfony.com/doc/current/reference/forms/types/time.html), макет formtheme пытается отобразить тип Symfony вместо вашего. Вы можете видеть, что Symfony TimeType имеет опциюназывается widget, так что тип формы ожидает этот тип.

Поэтому попробуйте переименовать ваш TimeType во что-то еще, например TicketTimeType.

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

public function getBlockPrefix()
{
    return "ticket_time_type";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...