Как перебрать многие свойства в цикле Twig? - PullRequest
1 голос
/ 04 ноября 2019

У меня проблема со свойствами в (возможно) Twig. У меня есть контроллер в Symfony, где getCategories () , getWords () , getTranslations () методы (из Doctrine) возвращают объекты (отношения). Каждое свойство в контроллере является массивом, потому что я вызываю метод findAll () (снова из Doctrine), который возвращает массив. Наконец, я возвращаю все свойства из контроллера для просмотра (файл Twig), где пытаюсь отобразить результаты с помощью цикла Twig for.

Проблема заключается в том, что цикл Twig повторяется только для свойства flashcards (Iзнаю почему;)) и я понятия не имею, как сделать много свойств повторяющимися. Я бы хотел, чтобы цикл перебирал все свойства, возвращаемые контроллером.

В цикле foreach контроллера я попытался обновить массив flashcards новыми ассоциативными ключами, такими как: category , word и translation, чтобы все результаты, возвращаемые Doctrine (включая отношения), сохранялись в одном свойстве flashcards , но затем Symfony генерирует исключения.

Мне было интересно, создадим ли в контроллере один массив, к которому я бы вставил карточки , cateogry , word и translation массивов и затем возвращают этот один массив в представление, но я не думаю, что это хорошая практика.

Вот код метода контроллера:

public function showAllCards()
{
    $flashcards = $this->getDoctrine()->getRepository(Flashcards::class)
        ->findAll();

     foreach ($flashcards as $flashcard) {
        $category = $flashcard->getCategories()->getName();
        $word = $flashcard->getWords()->getWord();
        $translation = $flashcard->getTranslations()->getWord();
    }

      return $this->render('try_me/index.html.twig', [
        'flashcards' => $flashcards,
        'category' => $category,
        'word' => $word,
        'translation' => $translation
    ]);
}

Вот код цикла Twig:

{% for flashcard in flashcards %}

  {{ word }}
  <br>
  {{ flashcard.pronunciation }}
  <br>
  {{ flashcard.exampleSentence }}
  <br>
  {{ category }}
  <br>
  {{ translation }}
  <br>

{% endfor %}

Я попытался выполнить следующий код контроллера ...

public function showMeAll()
{
    $flashcards = $this->getDoctrine()->getRepository(Flashcards::class)
        ->findAll();

     foreach ($flashcards as $flashcard) {
        $flashcards['categories'] = $flashcard->getCategories()->getName();
        $flashcards['words'] = $flashcard->getWords()->getWord();
        $flashcards['translations'] = $flashcard->getTranslations()->getWord();
    }

      return $this->render('try_me/index.html.twig', [
        'flashcards' => $flashcards,
    ]);
}

... со следующим циклом Twig ...

{% for flashcard in flashcards %}

  {{ flashcard.words }}
  <br>
  {{ flashcard.pronunciation }}
  <br>
  {{ flashcard.exampleSentence }}
  <br>
  {{ flashcard.categories }}
  <br>
  {{ flashcard.translations }}
  <br>

{% endfor %}

... но затем Symfony говорит:

Исключение было выдано во времярендеринг шаблона («Catchable Fatal Error: объект класса Proxies__CG __ \ App \ Entity \ Words не может быть преобразован в строку»).

Не могли бы вы дать мне несколько советов, как решить эту проблему,пожалуйста? Я бы хотел, чтобы цикл Twig повторялся по многим свойствам ( flashcard , word , category , translation ). Или напишите, если есть лучшее решение, пожалуйста.

Заранее спасибо за каждый ответ!

1 Ответ

0 голосов
/ 04 ноября 2019

Согласно вашим фрагментам, я предполагаю, что вы хотите что-то вроде следующего:

{% for flashcard in flashcards %}
    {% for word in flashcard.getWords() %}
        {{ word }}<br />
    {% endfor %}
    {{ flashcard.getPronunciation() }}<br>
    {{ flashcard.getExampleSentence() }}<br>
    {% for category in flashcard.getCategories()() %}
         {{ category.getName() }}<br />
    {% endfor %}
    {% for translation in flashcard.getTranslations() %}
         {{ translation.getWord() }}<br />
    {% endfor %}
{% endfor %}

Посмотрите на этот раздел документации. В основном, если у вас есть foo.bar, twig будет проверять, является ли bar публичным свойством foo, и если нет, то проверять, есть ли публичное getter, getBar, для получения bar.


Некоторые sidenotes в обоих ваших циклах, значения category, word и translation будут содержать только последнее значение вашего flashcards, потому что вы перезаписываете значение каждый раз.

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