Symfony Twig и цикл for

У меня следующая проблема. У меня есть таблица встреч в базе данных, включая id, guest, host, start_time, end_time и table_number. Я использую wkhtmltopdf и symfony 3 для генерации, простая генерация pdf не проблема, к сожалению, Twig не хочет сотрудничать со мной. Я хотел бы сделать это сначала для создания встреч для таблицы 1, затем для 2 и т. д. Весь процесс должен выглядеть так:

  • Начало генерации pdf для таблицы 1
  • Таблица меняется с 1 на 2, происходит разрыв страницы и начинается создание новой страницы с встречами для таблицы 2 и т. д.

Проблема в том, что он генерирует мне pdf-файл для таблицы 1, затем добавляет одно собрание для таблицы 2. Он начинает генерировать pdf-файл для таблицы 2, в конце выдает мне 1 встречу из таблицы 3. Сгенерированный pdf-файл выглядит так: http://cyrklaf.eu/table.pdf

Я понятия не имею, в чем ошибка, что он всегда получает одну встречу из-за другого стола. Мой код Twig, потому что проблема в нем:

Мой код Twig:

<html lang = "pl">
<head>
    <meta charset = "utf-8">
    <style>
        body {
            background: #FFF;
        }

        .page {
            page-break-after: always;
        }
    </style>
</head>
<body>
{% set last_table = 1 %}
{% for meeting in meetings %}
    <div class = "page">
    {{ meeting.guest }} {{ meeting.host }} stolik obecny {{ meeting.tableNumber }} stolik poprzedni {{ last_table }}

    {% if meeting.tableNumber != last_table %} // 
        {% set last_table = meeting.tableNumber %}
        </div>
    {% endif %}

{% endfor %}
</body>
</html>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
232
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы написал это так в Twig:

<html lang = "pl">
<head>
    <meta charset = "utf-8">
    <style>
        body {
            background: #FFF;
        }

        .page {
            page-break-after: always;
        }
    </style>
</head>
<body>
{% for i in 1..4 %}
  {% for meeting in meetings %}
    {% if meeting.tableNumber == i %}

      <div class = "page">
        {{ meeting.guest }} {{ meeting.host }} stolik obecny {{ meeting.tableNumber }} stolik poprzedni {{ last_table }}
      </div>

    {% endif %}
  {% endfor %}
{% endfor %}

</body>
</html>

Количество таблиц не фиксировано, иногда оно может быть максимум 20, в другой раз 5, поэтому цикл for выпадает, если я не передам в параметрах количество таблиц. С другой стороны, у меня может быть, например, 10 таблиц, но, например, 2 из них будут для других целей, и цикл for не пройдет экзамен.

PawelC 14.06.2018 10:46
Ответ принят как подходящий

Вы должны обрабатывать разрыв таблицы следующим образом:

{% set previous_table_number = 1 %}
{% for meeting in meetings %}
    {# This handle table break close old div if is changed #}
    {% if meeting.tableNumber != previous_table_number and not loop.first %} 
      </div>
    {% endif %}
    {# This handle table break #}
    {% if meeting.tableNumber != previous_table_number or loop.first %} 
      <div class = "page">
    {% endif %}

    {{ meeting.guest }} {{ meeting.host }} stolik obecny {{ meeting.tableNumber }} stolik poprzedni {{ previous_table_number }}

    {% if loop.last %}
      </div>
    {% endif %}


{% set previous_table_number = meeting.tableNumber %}


{% endfor %}

Вы можете поиграть с ним в эта рабочая рабочий пример

Надеюсь на эту помощь

теперь все работает, проблема только в том, что в конце генерируется пустая страница.

PawelC 14.06.2018 12:37

Другие вопросы по теме