2016-06-28 2 views
-1

Моя структура таблицы в моей базе данных, как это:Перебор категории, childcategories и продуктов в веточке

enter image description here

Некоторые категории имеют категорию ребенка, а некоторые нет. Продукт может принадлежать:

  • категории Детский
  • Родитель Категория (эта категория не имеет дочерние категории)

Мой массив выглядит следующим образом:

enter image description here

Категория A является родительской категорией. Категория B - Голова также является родительской категорией. Категория B - Ребенок является дочерней категорией B - Голова.

Теперь я хотел бы показать этот массив так:

enter image description here

Но я застрял на том, как знать, если это категория или список продуктов. Может кто-то помочь мне с этим?

+0

Структура данных не выглядит идеальным для того, что вы пытаетесь делать. Существует ли максимальное число дочерних категорий, которые могут иметь родительская категория? Например, может быть другая категория в категории B? Или элемент может быть только под двумя категориями? – Shane

+0

@ Шейн, может быть другая дочерняя категория под Категория B - Голова. Какую структуру вы бы предложили? .. – nielsv

+0

Может ли категория иметь как дочерние категории, так и продукты, или у них есть только одна? – qooplmao

ответ

1

Если вы используете модели Doctrine (которые, если вы используете Symfony, вы должны быть), то все, что вы делаете, - это цикл методов на объекте.

Быстрый и грязный пример с несколькими предположениями, например. используя @Template() аннотаций и стандартных объектов DAO иначе EntityManager [S], а также имеющие GetChildren() и getProducts() Методы на category.php (AKA модели/объекта)

На контроллере

/** 
* @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 для плоских (очень вероятный сценарий), то вы можете создать и включить макрос, чтобы выплюнуть, что для вас.

Это основное, но я думаю, что это в значительной степени охватывает то, о чем вы спрашиваете, правильно ли я понимаю ваш вопрос.

Кстати, вы обязательно должны прочитать документы для ветки и Symfony, так как у них есть примеры, подобные этим везде.

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

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

Смежные вопросы