遍历 twig 中的类别、子类别和产品

Posted

技术标签:

【中文标题】遍历 twig 中的类别、子类别和产品【英文标题】:Loop through categories, childcategories and products in twig 【发布时间】:2016-06-28 19:56:30 【问题描述】:

我的数据库中的表结构是这样的:

有些类别有子类别,有些则没有。一个产品可以属于:

儿童类别 父类别(此类别没有子类别)

我的数组如下所示:

类别 A 是父类别。 类别 B - 头部 也是一个父类别。 Category B - ChildB - 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) &amp;  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 中的类别、子类别和产品的主要内容,如果未能解决你的问题,请参考以下文章

使用beautifulsoup刮擦类别和子类别

阵列Twig中的数组

所有产品(类别和子类别产品)都计入 magento 中的类别列表页面

在 Access 2007 中,是不是可以遍历自定义类别中的项目?

WooCommerce 在父类别中排除子类别中的产品

遍历列中的每个类别并将另一列中的值添加为单独的 df