Создание навигации в Smarty

Beastie

Новичок
Создание навигации в Smarty

Только начинаю разботать со Smarty.
Цель простая, создать красивую навигацию для сайта.
Имеем массив:
PHP:
$smarty->assign('name', array('Новости','База знаний','Форум','Ладер'));
$smarty->assign('uri', array('','base/','forum/','lader/'));
Теперь собственно шаблон для навигации:
PHP:
<table width="100%"  border="0" cellpadding="1" cellspacing="1" bordercolor="#000000">
   <tr>
     <th bgcolor="#8A8A8A" scope="col">
     <div align="left">&nbsp;&nbsp;Сервер:&nbsp;&nbsp;</div></th>
   </tr>
{section name=navig  loop=$name}

// Если текущий URI совпадает с uri из массива 
// показываем, что мы находимся в этом разделе

{if {$smarty.env.PATH} eq {$uri[navig]}} 
<tr>   
<th width="$cell_width" bgcolor="#33CC99" scope="col">&nbsp;&nbsp; 
   <nobr>{$name[navig]}</nobr>
   </th>
</tr>

// Показываем остальные элементы массива
<else>
<tr>
   <th width="$cell_width" bgcolor="#CCCCCC" scope="col"> 
   &nbsp;&nbsp;
   <a href="{$uri[navig]}"><nobr>{$name[navig]}</nobr></a>
   </th>
</tr>
</if>
{/section}
</table>
Конструкция не работает =( Можно ли как-то организовать подобную схему?
Заранее спасибо.
 

Фанат

oncle terrible
Команда форума
а что означают конструкции </if> и width="$cell_width"?
 

Beastie

Новичок
Автор оригинала: Panchous
а не проще:
1. array('Новости'=>"URL1",'База знаний'=>"URL2"...)
2. foreach
Не представляю, как потом доставать данные из масива, что бы получить на выходе:
PHP:
<a href="URL1"><nobr>Новости</nobr></a>
Собственно дело не в этом, меня больше интересует условие,
при котором определяется текущий раздел, выделяется ячейка таблицы другим цветом
и убирается ссылка.
Для этого и хотел использовать IF.

-~{}~ 06.05.06 15:58:

Автор оригинала: Фанат
а что означают конструкции </if> и width="$cell_width"?
{/if} - опечатка
width="$cell_width" - как следует из названия задает ширину ячейки (можно обойтись и без него).

-~{}~ 06.05.06 16:03:

Вопрос снят =)
неправильно определял:{if {$smarty.env.PATH} eq {$uri[navig]}}
Буду внимательнее.
Теперь все работает:
PHP:
$smarty->assign('name', array('Новости','База знаний','Форум','Ладер'));
$smarty->assign('uri', array('','base/','forum/','lader/'));
PHP:
<table width="100%"  border="0" cellpadding="1" cellspacing="1" bordercolor="#000000">
   <tr>
     <th bgcolor="#8A8A8A" scope="col">
     <div align="left">&nbsp;&nbsp;Сервер:&nbsp;&nbsp;</div></th>
   </tr>
{section name=navig  loop=$name}
// Если текущий URI совпадает с uri из массива 
// показываем, что мы находимся в этом разделе
{if $smarty.env.path == $uri[navig]}
<tr>   
<th width="" bgcolor="#33CC99" scope="col">&nbsp;&nbsp; 
   <nobr>{$name[navig]}</nobr>
   </th>
</tr>
{/if}
// Показываем остальные элементы массива
<tr>
   <th width="$cell_width" bgcolor="#CCCCCC" scope="col"> 
   &nbsp;&nbsp;
   <a href="{$uri[navig]}"><nobr>{$name[navig]}</nobr></a>
   </th>
</tr>
{/section}
</table>
 

magic

lancer
Вот пример
PHP:
require_once 'HTML/Menu.php';
require_once 'HTML/Menu/ArrayRenderer.php';

// build menu items
$menu_array = array(
    1 => array(
        'title' => 'Menu 1',
        'url' => 'file1.php',
        'sub' => array(
            11 => array('title' => 'Menu 1.1', 'url' => 'file1-1.php'),
            12 => array('title' => 'Menu 1.2', 'url' => 'file1-2.php'),
            13 => array('title' => 'Menu 1.3', 'url' => 'file1-3.php'),
        )
    ),
    2 => array(
        'title' => 'Menu 2',
        'url' => 'file2.php',
    ),
    3 => array(
        'title' => 'Menu 3',
        'url' => 'file3.php',
        'sub' => array(
            31 => array('title' => 'Menu 3.1', 'url' => 'file3-1.php'),
            32 => array('title' => 'Menu 3.2', 'url' => 'file3-2.php'),
        )
    ),
);

$menu =& new HTML_Menu($menu_array);
$renderer =& new HTML_Menu_ArrayRenderer();
$menu->render($renderer, 'sitemap');
$smarty->assign('menu', $renderer->toArray());
Код:
<table>
{section name=menuid loop=$menu}
    <tr>
        <td><a href="{$menu[menuid].url}">{$menu[menuid].title}</a></td>
    </tr>
{/section}
</table>
 

crocodile2u

http://vbolshov.org.ru
magic
Что-то я не понял: ты, получается, берешь массив, проделываешь с ним какие-то манипуляции посредством классов HTML_Menu и HTML_Menu_ArrayRenderer, а потом получаешь опять массив, который уже передаешь в смарти??? Не проще ли передавать туда сразу исходный массив?
 

magic

lancer
crocodile2u
Не проще :) Посмотри код и подумай зачем так делается.
 

vanya

Новичок
Автор оригинала: magic
crocodile2u
Не проще :) Посмотри код и подумай зачем так делается.
есть дополнительно вот это:
PHP:
$menu->render($renderer, 'sitemap');
но, вот это
PHP:
$renderer->toArray()
почему то пересортировывает массив так, что получается, что пункт, к примеру, 1.5 следует перед 1.4.1....

И как тут быть? Ответьте пожалуйста!

-~{}~ 16.05.09 10:24:

сорри.... уВас с вашим массивом все работает отлично...
Но если массив меню получать таким образом:
PHP:
$menu_array = $nestedSet->getAllNodes(true);
то получается, что подменю находятся не во вложенных массивах, а на одном уровне с основными.
И как же тут быть? Так, чтоб не самому все анализировать и разбирать?

Ведь, если без Smarty, то вызываешь
PHP:
$menu->show();
и все.

А со Смарти как быть?
 
Сверху