2016-02-16 1 views
2

Я пытаюсь выбрать предыдущий цикл for в Twig. Я пытаюсь отобразить несколько категорий в категории, если эта категория имеет подкатегории. Если категория не имеет подкатегорий, то она должна отображать заголовки из предыдущего цикла. Обычно это не будет проблемой, если какая-либо категория имеет одинаковую глубину. К сожалению, категории имеют разную глубину.Как использовать это сообщение обратного вызова при этой функции

Итак, я пытаюсь создать какую-то функцию, которая делает это для меня.

Так, например:

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 %} 

Есть ли способ, чтобы создать somesort функции, которая проверяет, является ли категория имеет подкатегории. Если это не так, то доступ к предыдущему циклу и отображение этих имен категорий.

Я думал, что это было так просто, как:

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

Но это не так :(

+0

Вместо того, чтобы использовать только установленную проверку, попробуйте добавить категорию | длина> 0 проверить. Я бы также рекомендовал использовать индекс for, value в категории с уникальными именами на каждом уровне. Это позволит вам либо получить элемент в текущем цикле, либо предыдущий, используя стандартную нотацию массива. – Rooneyl

+0

@Rooney: Проверка длины - это то, что я попробую ... Я должен использовать стандартную нотацию! Или вы имеете в виду что-то другое? У вас есть пример? – Meules

+0

Задумывались ли вы о написании пользовательского расширения/функции twig для этого? Я бы хотел отвлечь логику от шаблонов – Fyntasia

ответ

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 %} 
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 
Смежные вопросы