У меня есть class categroies
и class Products
.
В моем хранилище у меня есть функция
getProducts($categoryid,$location)
Мне нужно, чтобы петля в шаблон
{% for category in categories %} --{{ category.name }}-- {% for product in getProducts(category.id,location) %} --{{ product.name }}-- {% endfor %} {% endfor %}
или есть лучший способ для этого
Вы не должны. То бизнес-логика, которая не должна появляться в шаблонах. Одним из решений является создание нового действия в контроллере и в вызове шаблона
{% render '@MyBundle:Product:list' with {category: category.id} %}
Это довольно старый вопрос, но у меня отсутствует очень простое решение, подобное этому.
Можно передать объект репо на веточку и вызвать публичные методы репо из ветки так:
В вашем контроллере
$oCatRepo = $this->getDoctrine()->getManager()->getRepository('AppBundle:Categories'); .... return $this->render('product_list.html.twig', array('oCatRepo' => $oCatRepo));
И затем в вашем шаблоне ветки:
{{ oCatRepo.getProducts(category.id, location) }}
Я говорю, что это возможно, многие утверждают, что шаблоны должны отображать только данные и позволяют контроллерам собирать данные. Я лично не против позволять своим шаблонам самим получать свои данные.
Я подозреваю, что все, что вам действительно нужно, – это левое соединение, использующее выражение WITH. Что-то вроде:
class CategoryManager { public function loadCategoriesProductsForLocation($location) { $qb = $this->em->->createQueryBuilder(); $qb->addSelect('category'); $qb->addSelect('product'); $qb->from('MyBundleBundle:Category','category'); $qb->leftJoin('category.products','product', Expr\Join::WITH, $qb->expr()->eq('product.location', $location));
Это даст вам все категории с соответствующими продуктами для определенного места.
Решение является другим способом, как это делается прямо сейчас. Объект Category должен иметь отношение «один ко многим». Взгляните на http://symfony.com/doc/2.0/book/doctrine.html#entity-relationships-associations
Тогда в категории Entity должен быть атрибут EntityCollection, называемый «продуктом». В вашем шаблоне вы можете решить эту проблему следующим образом:
{% for category in categories %} --{{ category.name }}-- {% for product in category.products %} --{{ product.name }}-- {% endfor %} {% endfor %}