Как добавить динамический атрибут в переменную с помощью Twig? - PullRequest
0 голосов
/ 07 января 2019

В моем проекте (symfony / flex 1.1) у меня был метод "displayMenuAndSubMenu ([...])" (в качестве службы) для построения меню и подменю в многомерном массиве.

Примечание: некоторые меню могут не иметь подменю

Моя проблема в том, что когда я хочу отобразить свою доску меню в шаблоне html.twig, я не могу воспроизвести инкрементные переменные $ i и $ a. В самом деле, с моим фактически веточным кодом я получаю простой вывод строки: - (

Я где-то читал, что собственное расширение ветки позволит мне обойти эту трудность.

Но мне очень сложно реализовать простой счетчик.

Итак, мои вопросы:

  • Есть ли более простой способ сделать это в шаблоне html.twig?
  • Должен ли я пройти через шаблон php.twig (настолько отвратительно в моем смысле)?
  • Обречен ли я определить расширение ветки? (И если да, то есть ли у вас пример?)

Спасибо

ContentService :: displayMenuAndSubmenu

    public function displayMenuAndSubMenu(CategoryService $categoryService, CategoryTypeService $categoryTypeService)
        {
            $categoryId = $categoryService->getCategoryId('Primary');
            $categoryTypeId = $categoryTypeService->getCategoryTypeId('Menu');

            // Getting primary menus
            $primaryMenu = $this->em->getRepository('App\Entity\Content')->findByCategoryTypeAndCategory($categoryTypeId, $categoryId);

            // Constructing MainMenu with menus and submenus
            $i = 0;
            $menu = [];
            $submenu = [];
            $mainMenu = [];
            foreach ($primaryMenu as $keyMenu => $menuItem) {
                $menu[$i] = [ 'menu_' . $i => [
                    'id' => $menuItem->getId(),
                    'name' => $menuItem->getName(),
                    'body' => $menuItem->getBody(),
                    'slug' => $menuItem->getSlug(),
                    ] 
                ];

                // Getting secondary menu
                $secondaryMenu = $this->em->getRepository('App\Entity\Content')->findByParent($menuItem->getId());
                $a = 0;
                foreach ($secondaryMenu as $keySubmenu => $subMenuItem) {
                    $submenu[$i][$a] = [ 'submenu_' . $i . '_' . $a => [ 
                                                    'id' => $subMenuItem->getId(),
                                                    'name' => $subMenuItem->getName(),
                                                    'body' => $subMenuItem->getBody(),
                                                    'slug' => $subMenuItem->getSlug(),
                                                 ]
                                             ];

                    $menu[$i] += $submenu[$i][$a];
                    $a++;
                }

                $mainMenu += $menu; 
                $i++;

            }

            return $mainMenu;
        }

_menu.html.twig

    {% set i = 0 %}
    {% for menu in menu_items %}

    {% set a = 0 %}

        <div class="center">
        <section class="primary-menu">

             {% if 'menu_'~i~'.slug' is not empty %}
             <header class="enter">{{ 'menu_'~i~'.name' }}</header>

                {% for submenu in 'menu_'~i~'.submenu' %} 
                <article>
                 <a href= {{ 'submenu_'~i~'_'~a~'.slug' }}" alt="{{ 'submenu_'~i~'_'~a~'.body' }}"class="para1">{{ 'submenu_'~i~'_'~a~'.name' }}</a>
                </article>
                {% endfor %}

            {% else %}
             <header class="enter"><a href="{{ 'menu_'~i~'.slug' }}" alt="{{ 'menu_'~i~'.body' }}">{{ 'menu_'~i~'.name' }}</a></header>
            {% endif %} 
        </section>
        {% set i = i + 1 %}
        {% endfor %}

dump ($ mainMenu) при выводе класса ContentService

    array:5 [▼
      0 => array:4 [▼
        "menu_0" => array:4 [▼
          "id" => "a420742f-124a-11e9-a1fd-805e4fe8b43b"
          "name" => "Menu 0"
          "body" => "Primary menu0"
          "slug" => null
        ]
        "submenu_0_0" => array:4 [▼
          "id" => "a4208ec3-124a-11e9-a1fd-805e4fe8b43b"
          "name" => "Submenu 0"
          "body" => "Secondary menu0"
          "slug" => "menu-0-submenu-0"
        ]
        "submenu_0_1" => array:4 [▼
          "id" => "a420a70d-124a-11e9-a1fd-805e4fe8b43b"
          "name" => "Submenu 1"
          "body" => "Secondary menu1"
          "slug" => "menu-0-submenu-1"
        ]
        "submenu_0_2" => array:4 [▼
          "id" => "a420ba8f-124a-11e9-a1fd-805e4fe8b43b"
          "name" => "Submenu 2"
          "body" => "Secondary menu2"
          "slug" => "menu-0-submenu-2"
        ]
      ]
      1 => array:1 [▼
        "menu_1" => array:4 [▼
          "id" => "a4205c9f-124a-11e9-a1fd-805e4fe8b43b"
          "name" => "Home"
          "body" => "Home menu"
          "slug" => "home"
        ]
      ]
      2 => array:4 [▶]
      3 => array:4 [▶]
      4 => array:4 [▶]
    ]
...