serejatoje
@serejatoje

Как вывести шаблон в php?

Всем привет! Есть вот такой код:
<?php
$nav_data = [
    [
        'id' => 1,
        'href' => '/offers',
        'title' => __('marketplace'),
        'child' => [
            [
                'title' => __('all_offers'),
                'href' => '/offers'
            ],
            [
                'title' => __('add_offer'),
                'href' => ''
            ],
            [
                'title' => __('online_shop'),
                'href' => ''
            ]
        ]
    ],
    [
        'id' => 2,
        'href' => '',
        'title' => __('news'),
    ],
    [
        'id' => 3,
        'href' => '',
        'title' => __('publications'),
        'child' => [
            [
                'title' => __('all_publications'),
                'href' => ''
            ],
            [
                'title' => __('agrocatalog'),
                'href' => ''
            ],
            [
                'title' => __('add_publication'),
                'href' => ''
            ]
        ]
    ],
    [
        'id' => 4,
        'href' => '',
        'title' => __('companies'),
        'child' => [
            [
                'title' => __('catalog_of_companies'),
                'href' => ''
            ],
            [
                'title' => __('add_company'),
                'href' => ''
            ]
        ]
    ],
    [
        'id' => 5,
        'title' => __('experts'),
        'href' => ''
    ],
    [
        'id' => 6,
        'title' => __('about'),
        'href' => ''
    ]
];

function render_nav($data, $parent = false, $selected = 0)
{
    foreach ($data as $item) {
        if ($parent)
            echo '<li><a href="' . $item['href'] . '">' . $item["title"] . '</a>';
        else
            echo '<li class="nav_item"><a class="nav_link' . ($selected == $item['id'] ? ' active' : '') . '" href="' . $item['href'] . '">' . $item["title"] . '</a>';
        if (isset($item['child'])) {
            echo '<ul class="nav_submenu">';
            render_nav($item['child'], true, 0);
            echo '</ul>';
        }
        echo '</li>';
    }
}

Функция выводит меню, всё работает на ура. Но как мне отвести это меню в отдельный шаблон, и выводить его? Просто тут рекурсия, вот я и не знаю, как реализовать шаблон и его вывод. А то постоянные echo в разных местах - не гуд.. в шаблон бы
  • Вопрос задан
  • 2653 просмотра
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
www.smarty.net/docs/en/language.function.function.... например
Но вообще надо понимать, что в реальной жизни шаблоны не такие красивые и причесанные как в специально нарисованных примерах.
И рекурсивный вывод никогда не будет выглядеть конфеткой.

Еще один вариант - дерево всегда можно развернуть в линейный массив, и выводить в цикле вместо рекурсии.
Я одно время заморочился таким. В итоге код подготовки распух, а код шаблона уменьшился. Но я бы не сказал, что он стал сильно красивее:
<? foreach ($TREE as $row): ?> 
<?     if($row['li']=="open"): ?><ul><?endif?> 
<?     if($row['li']=="close"): ?></ul><?endif?> 
<?     if($row['id']!=0): ?> 
<?          if($id==$row['id']): ?> 
<li><?=$row['title']?></li> 
<?          else: ?> 
<li><a href="?id=<?=$row['id']?>"><?=$row['title']?></a></li> 
<?          endif ?> 
<?     endif ?> 
<? endforeach ?> 
</ul>
Ответ написан
Комментировать
можно запилить примерно такой темплейт
<ul>
<?php foreach ($nav_data as $item): ?>
  <li>
    <a href="<?php echo $item['href'] ?>">
      <?php echo $item["title"] ?>
    </a>
    <?php if (!empty($item['child'])): ?>
      <ul class="nav_submenu">
        <?php foreach ($item['child'] as $child): ?>
          <li class="nav_item">
            <a class="nav_link<?php echo $selected == $item['id'] ? ' active' : '' ?>" href="<?php echo $child['href'] ?>">
              <?php echo $child["title"] ?>
            </a>
          </li>
        <?php endforeach ?>
      </ul>
    <?php endif ?>
  </li>
<?php endforeach ?>
</ul>


ну и рендер примерно такой:
function render($template, $variables) {
    extract($variables, EXTR_SKIP);
    ob_start();
    include $template;
    return ob_get_clean();
}


передать туда путь к файлу темплейта и массив array('nav_data' => $nav_data)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы