如何在此函数中使用此回调消息

时间:2016-02-16 14:55:36

标签: symfony twig

我很想在Twig中选择一个前一个for循环。我试图在一个类别中显示一些类别标题,如果该类别有子类别。如果类别没有子类别,那么它应该显示前一个循环的标题。通常,如果任何类别具有相同的深度,这将不是问题。不幸的是,这些类别有不同的深度。

所以我尝试做的是创建一些为我这样做的功能。

例如:

Category A -> Category A.sub -> Category A.subsub
 Title1        Title1.1          Title1.2
 Title1        Title1.1          Title1.2

Category B -> Category B.sub -> Category A.subsub
 Title1        Title1.1          Title1.1
 Title1        Title1.1          Title1.1   

正如您所看到的,Category B.sub.sub没有任何子类别。如果是这种情况,则应显示Category B.sub的子类别。通常我会做这样的事情:

{% for category in shop.categories %}     
  {{ category.title }} 

  {% if category.subs %}
    {% for category in category.subs %}
      {{ category.title }}

      {% if category.subs %}
        {% for category in category.subs %}
          {{ category.title }}
        {% endfor %}
      {% endif %}  

    {% endfor %}
  {% endif %}

{% endfor %}

有没有办法创建一些功能来检查一个类别是否有子类别。如果不是这种情况,则访问前一个循环并显示这些类别名称。

我认为这很简单:

{% elseif not category.subs %}
  {# Do this #}

但事实并非如此:(

2 个答案:

答案 0 :(得分:1)

我的建议是在你的PHP代码中使数组的结构相似,并且不要在模板中放置这样的逻辑。

所以在php中你会有这样的事情:

if (!isset($categoryB['sub']['subsub']) {
    $categoryB['sub']['subsub'] = $categoryA['sub']['subsub'];
}

然后你只是迭代你的模板:

{% for category in shop.categories %}
    {{ category.title }}
    {% for category in category.subs %}
        {{ category.title }}
        {% for category in category.subs.subsub %}
            {{ category.title }}

我还建议让它递归,所以你会有类似的东西:

{% itarerateCategoryes categories %}

答案 1 :(得分:0)

同意Fyntasia我在模板中没有很多逻辑,我会将控制器中的数据解析为我想要的形式。

但假设您的数据类似(无法理解您的符号);

$categories = [
            0 => [
                       'top' => ['Atop1', 'Atop2'],
                       'middle' => ['Amiddle1', 'Amiddle2'],
                       'bottom' => ['Abottom1', 'Abottom2'],
            ],
            1 => [
                       'top' => ['Btop1', 'Btop2'],
                       'middle' => ['Bmiddle1', 'Bmiddle2'],
            ],
        ];

喜欢的东西;

{% for main_index, category in categories %}     
    {% if category.top is defined and category.top|length > 0 %}
        {{ loop.index0 }} has top values 
    {% endif %}
    {% if category.middle is defined and category.middle|length > 0 %}
        {{ loop.index0 }} has middle values 
    {% endif %}
    {% if category.bottom is defined and category.bottom|length > 0 %}
        {{ loop.index0 }} has bottom values 
    {% else %}
        {{ loop.index0 }} has no value so using {{ categories[loop.index0 - 1].bottom|join(', ') }}
    {% endif %}
    <br />
{% endfor %}

输出类似的内容;

0 has top values 0 has middle values 0 has bottom values 
1 has top values 1 has middle values 1 has no value so using Abottom1, Abottom2