在树枝中循环分类,子类别和产品

时间:2016-06-28 19:56:30

标签: php symfony view twig

我的数据库中的表结构如下:

enter image description here

某些类别有儿童类别,有些则没有。产品可以属于:

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

我的数组看起来像这样:

enter image description here

A类是父类别。 B类 - 头也是父类别。 B类 - 儿童 B - Head 的子类别。

现在我想像这样显示这个数组:

enter image description here

但我仍然坚持如何知道它是一个类别还是一个产品列表。有人可以帮我这个吗?

2 个答案:

答案 0 :(得分: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 for flat(非常可能的场景)中重复,那么你可以创建并包含一个宏来为你吐出。

这是基本的,但我认为它几乎涵盖了您在正确理解问题时所提出的问题。

顺便说一句,你应该阅读twig和Symfony的文档,因为他们到处都有这样的例子。

如果您做出适当的回复,我会编辑此答案。现在你还没有发布足够的信息来真正指导你,但希望这会有所帮助。

答案 1 :(得分:0)

您可以使用递归宏。在宏中,您可以打印产品列表或打印类别列表,然后自行调用..依此类推......

{% 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,而不是你可以用来形象化的东西)......

enter image description here