遍历 twig 中的类别、子类别和产品
Posted
技术标签:
【中文标题】遍历 twig 中的类别、子类别和产品【英文标题】:Loop through categories, childcategories and products in twig 【发布时间】:2016-06-28 19:56:30 【问题描述】:我的数据库中的表结构是这样的:
有些类别有子类别,有些则没有。一个产品可以属于:
儿童类别 父类别(此类别没有子类别)我的数组如下所示:
类别 A 是父类别。 类别 B - 头部 也是一个父类别。 Category B - Child 是 B - Head 的子类别。
现在我想这样显示这个数组:
但我不知道如何知道它是一个类别还是一个产品列表。有人可以帮我解决这个问题吗?
【问题讨论】:
数据结构看起来并不适合您尝试做的事情。父类别可以拥有的子类别的最大数量是多少?例如,B 类下是否有另一个类别?或者一个项目只能属于两个类别? @Shane,B 类下可能还有另一个子类别 - 头。你会建议什么结构? .. 一个类别可以同时拥有子类别和产品,还是只能拥有其中一个? @qooplmao,一个类别可以有子类别(这些类别可以有产品)或产品。不是两者。 @nielsv 老实说,我对 Symfony 了解不多,但类别不仅仅是一个数组键,它可能是一个实际的实体(取决于它是否在后端设置) .然后,我认为检查您当前循环的内容是否是/具有子类别会更容易一些。 【参考方案1】:如果你使用 Doctrine Models(如果你使用 Symfony,你应该这样做),那么你所做的就是循环遍历对象上的方法。
快速而肮脏的示例,假设很少,例如使用 @Template() 注释和标准 DAO 也称为 EntityManager[s] 以及在 Category.php(AKA 模型/实体)上具有 getChildren() 和 getProducts() 方法
在控制器上
/**
* @Route("/products", name="all_products")
* @Template()
*/
public function someAction()
...
$categories = $this->getCategoryManager()->findBy([]);
...
return [
'categories' => $categories
];
在你的树枝模板中
% if categories|length > 0 %
% for category in categories %
% if category.children|length > 0 %
... Here you create the html for nested ...
% else %
... Here you create the HTML for Category ...
% for product in category.products %
... Here you create the HTML for products ...
% endfor %
% endif %
% endfor %
% else %
.... some html to handle empty categories ....
% endif %
如果嵌套的 HTML 在平面的 HTML 中重复(很可能是这种情况),那么您可以创建并包含一个宏来为您吐出它。
这是基本的,但如果我正确理解您的问题,我认为它几乎涵盖了您要问的内容。
顺便说一句,您绝对应该阅读 twig 和 Symfony 的文档,因为它们到处都有这样的示例。
如果您做出适当的回应,我会编辑此答案。目前您还没有发布足够的信息来真正正确地指导您,但希望这会有所帮助。
【讨论】:
【参考方案2】:您可以使用递归宏。在宏中,您要么打印产品列表,要么打印类别列表,然后调用自身……等等……
% macro navigation(categories, products) %
% from '_macros.html.twig' import navigation %
% if categories|length > 0 or products|length > 0 %
<ul>
% for category in categories %
<li>
category.name
( category.children|length child(ren) & category.products|length products)
navigation(category.children, category.products)
</li>
% endfor %
% for product in products %
<li> product.name </li>
% endfor %
</ul>
% endif %
% endmacro %
您只需在...这样的模板中使用它
% from '_macros.html.twig' import navigation %
navigation(array_of_categories)
这只是创建了一组基本的嵌套无序列表,但显然可以与任何你想要的 HTML 一起使用。
有关小提琴,请参阅http://twigfiddle.com/mzsq8z)。
小提琴呈现如下(twigfiddle 仅显示 HTLM,而不是您可以用来可视化的东西)...
【讨论】:
以上是关于遍历 twig 中的类别、子类别和产品的主要内容,如果未能解决你的问题,请参考以下文章
所有产品(类别和子类别产品)都计入 magento 中的类别列表页面