Реализация многоуровнего меню

Обсуждение CMS Made Simple в России.

Moderators: iturbay, wdwp

Post Reply
seregarem
Forum Members
Forum Members
Posts: 200
Joined: Sat Aug 28, 2010 1:03 pm

Реализация многоуровнего меню

Post by seregarem »

Нужно сделать такое меню:

Code: Select all

<ul id="nav">
	<li class="top"><a href="#" class="top_link"><span class="down">Как проверяет инспектор</span></a>
    	<ul class="sub" id="sub1">
		<li><a href="#">Федеральный закон №294-ФЗ</a></li>
		<li><a href="#">Блок-схема последовательности действий инспектора</a></li>
		<li><a href="#">Основные процедурные требования при проверке</a></li>
		<li><a href="#">Права и обязанности юридических лиц и индивидуальных предпринимателей при проверке</a></li>
		<li><a href="#">Журнал учета надзорных проверок</a></li>
	</ul>
    </li>
	<li class="top"><a href="#" class="top_link"><span class="down">Где и что проверяет инспектор</span></a>
		<ul class="sub" id="sub2">
			<li><a href="#">Сводные планы надзорных проверок</a></li>
			<li><a href="#">Интерактивная карта РФ</a></li>
		</ul>
	</li>
	<li class="top"><a href="#" class="top_link"><span class="down">Готовимся к проверке</span></a>
		<ul class="sub" id="sub3">
			<li><a href="#" class="fly">Экология</a>
				<ul id="sub3_1">
					<li><a href="#">Глоссарий</a></li>
					<li><a href="#">Экологические пособия</a></li>
					<li><a href="#">Система экологических требований</a></li>
					<li><a href="#">Экологический экспресс-аудит</a></li>
				</ul>
			</li>
			<li><a href="#" class="fly">Охрана труда</a>
            	<ul id="sub3_2">
					<li><a href="#">Глоссарий</a></li>
					<li><a href="#">Пособие по охране труда</a></li>
					<li><a href="#">Система требований по охране труда</a></li>
					<li><a href="#">Экспресс-аудит по охране труда</a></li>
				</ul>
            </li>
			<li><a href="#" class="fly">Пожарная охрана</a>
            	<ul id="sub3_3">
					<li><a href="#">Глоссарий</a></li>
					<li><a href="#">Пособие по пожарной безопасности</a></li>
					<li><a href="#">Система требований по пожарной безопасности</a></li>
					<li><a href="#">Экспресс-аудит по пожарной безопасности</a></li>
				</ul>
            </li>
			<li><a href="#" class="fly">Санитария</a>
            	<ul id="sub3_4">
					<li><a href="#">Глоссарий</a></li>
					<li><a href="#">Пособие по санитарии</a></li>
					<li><a href="#">Система требований по санитарии</a></li>
					<li><a href="#">Экспресс-аудит по санитарии</a></li>
				</ul>
            </li>
		</ul>
	</li>
	<li class="top"><a href="#" class="top_link"><span class="down">Проверяем работу инспектора</span></a>
		<ul class="sub" id="sub4">
			<li><a href="#">Анализ обоснованности акта проверки и предписания</a></li>
			<li><a href="#">Соблюдение процедур проверки и оформления документов</a></li>
			<li><a href="#">Обжалование действий и документов инспектора</a></li>
			<li><a href="#">Основания для признания проверки незаконной</a></li>
		</ul>
	</li>
	</ul>

Делаю так:

Code: Select all

{assign var='number_of_levels' value=10000}
{if isset($menuparams.number_of_levels)}
  {assign var='number_of_levels' value=$menuparams.number_of_levels}
{/if}

{if $count > 0}
<ul id="nav">
{foreach from=$nodelist item=node}
{if $node->depth > $node->prevdepth}
{repeat string='<ul class="sub" id="sub1">' times=$node->depth-$node->prevdepth}
{elseif $node->depth < $node->prevdepth}
{repeat string="</li></ul>" times=$node->prevdepth-$node->depth}
</li>
{elseif $node->index > 0}</li>
{/if}

{if $node->parent == true or $node->current == true}
  {assign var='classes' value='menuactive'}
  {if $node->parent == true}
    {assign var='classes' value='menuactive menuparent'}
  {/if}
  {if $node->children_exist == true and $node->depth < $number_of_levels}
    {assign var='classes' value=$classes|cat:' sub'}
  {/if}
  <li class="{$classes}"><a class="{$classes}" href="{$node->url}"><span>{$node->menutext}</span></a>

{elseif $node->children_exist == true and $node->depth < $number_of_levels and $node->type != 'sectionheader' and $node->type != 'separator'}
<li><a href="#" class="fly">{$node->menutext}</a>

{elseif $node->current == true}
<li class="currentpage"><h3><span>{$node->menutext}</span></h3>

{elseif $node->type == 'sectionheader'}
<li class="top"><a href="#" class="top_link"><span class="down">{$node->menutext}</span></a>

{elseif $node->type == 'separator'}
<li class="separator" style="list-style-type: none;"> <hr />

{else}
<li><a href="{$node->url}">{$node->menutext}</a>

{/if}

{/foreach}
{repeat string="</li></ul>" times=$node->depth-1}</li>
</ul>
{/if}

Два вопроса:
1. Как задать id для каждого элемента в {repeat string='<ul class="sub" id="sub1">' times=$node->depth-$node->prevdepth}

2. Как сделать, чтобы в подподменю вместо <ul class="sub" id="sub1"> было <ul id="sub3_2">?
Fenik17
Power Poster
Power Poster
Posts: 450
Joined: Tue Jun 01, 2010 5:42 am

Re: Реализация многоуровнего меню

Post by Fenik17 »

С использованием repeat никак не сделать, т.к. эта функция выглядит так (файл plugins/function.repeat.php):

Code: Select all

function smarty_cms_function_repeat($params, &$smarty)
{
	return (isset($params['times']) && intval($params['times']) > 0 ? str_repeat($params['string'], $params['times']) : '');
}
Можно свой плагин написать по аналогии с этим. А я бы вообще весь вывод меню написал бы плагином, т.к. php в этом случае удобнее.
seregarem
Forum Members
Forum Members
Posts: 200
Joined: Sat Aug 28, 2010 1:03 pm

Re: Реализация многоуровнего меню

Post by seregarem »

А как сделать, чтобы в id добавить счетчик, т.е.

Code: Select all

{repeat string='<ul id="sub[b]счетчик[/b]">' times=$node->depth-$node->prevdepth}
{elseif $node->depth < $node->prevdepth}
Каков синтаксис?
Fenik17
Power Poster
Power Poster
Posts: 450
Joined: Tue Jun 01, 2010 5:42 am

Re: Реализация многоуровнего меню

Post by Fenik17 »

Если чисто smarty, можно так, к примеру, попробовать:

Code: Select all

{section name=foo start=0 loop=$node->depth-$node->prevdepth}
  <ul id="sub{$smarty.section.foo.index}">
{/section}
seregarem
Forum Members
Forum Members
Posts: 200
Joined: Sat Aug 28, 2010 1:03 pm

Re: Реализация многоуровнего меню

Post by seregarem »

А как

Code: Select all

{repeat string='<ul id="sub[b]счетчик[/b]">' times=$node->depth-$node->prevdepth}
{elseif $node->depth < $node->prevdepth}
объединить с

Code: Select all

{section name=foo start=0 loop=$node->depth-$node->prevdepth}
  <ul id="sub{$smarty.section.foo.index}">
{/section}
Fenik17
Power Poster
Power Poster
Posts: 450
Joined: Tue Jun 01, 2010 5:42 am

Re: Реализация многоуровнего меню

Post by Fenik17 »

Надо

Code: Select all

{repeat string='<ul id="sub[b]счетчик[/b]">' times=$node->depth-$node->prevdepth}
заменить на

Code: Select all

{section name=foo start=0 loop=$node->depth-$node->prevdepth}
  <ul id="sub{$smarty.section.foo.index}">
{/section}
elseif с repeat никак не связан.
seregarem
Forum Members
Forum Members
Posts: 200
Joined: Sat Aug 28, 2010 1:03 pm

Re: Реализация многоуровнего меню

Post by seregarem »

Почему-то везде формируется <ul id="sub0">
Fenik17
Power Poster
Power Poster
Posts: 450
Joined: Tue Jun 01, 2010 5:42 am

Re: Реализация многоуровнего меню

Post by Fenik17 »

А, ну да. Там же ж счетчик нужен. Тогда в начале шаблона вставить {counter start=0}, а в section выводить так:

<ul id="sub{counter}">

В любом случае рекомендую почитать документацию по smarty, о работе с переменными и прочим.
Post Reply

Return to “Russian - русский”