2013-02-26 2 views
1

У меня есть система голосования в приложении Symfony, и я использую Twig Engine. Я хочу иметь возможность сделать что-то подобное в моем шаблоне, чтобы показать пользователя, которого они уже проголосовали (подумайте о оранжевых стрелках StackOverflow).Twig проверка объекта в объекте

<div class="vote {% if entry.votes.user == loggedinuser %}already-voted{% endif %}">Vote</a> 

Проблема с этим, хотя, каждый элемент может иметь несколько голосов (так votes на самом деле PersistentCollection. Я знаю, что я мог бы сделать это с помощью PHP или даже перекручивание через каждый из votes.user, но тот грязный) ,

ответ

1

Вы можете добавить метод к вашему лицу так, что ваш шаблон будет оставаться чистым и бизнес-логика будет спрятана в сущности аналогична:

<div class="vote {% if entry.hasVoted(loggedinuser) %}already-voted{% endif %}">Vote</a> 
+0

Это было, в конце концов, вероятно лучшим решением, которое я нашел. – Prisoner

0

Вы можете использовать оператор in вместо того, чтобы выполнять итерацию по каждому экземпляру. Согласно документации Twig, в фильтр выполнит проверку герметичности на строках, массивах или объектах, реализующих интерфейс Traversable.

Попробуйте следующее:

<div class="vote {% if loggedinuser in entry.votes.user %}already-voted{% endif %}">Vote</a> 

EDIT:

Похоже, что в оператора работы с это не распространяется на экземпляр внутри коллекции. Боюсь, вам нужно будет перебирать каждый голос, чтобы проверить, совпадают ли оба пользователя или нет.

Чтобы избежать неприятностей, вы можете использовать macro.

Надеюсь, это поможет.

+0

Я не могу использовать 'в' потому что голоса Безразлично 't имеет метод/свойство 'user', дает мне:« Метод «пользователь» для объекта «Doctrine \ ORM \ PersistentCollection» не существует' – Prisoner

+0

, если я использую 'user in entry.votes' (который должен технически работать) ничто не переходит в состояние. – Prisoner

+0

Я отредактировал свой ответ. –

Смежные вопросы