UMIhelp

Разработка сайта на UMI.CMS => Шаблоны TPL => Тема начата: john от 24 Марта 2012, 14:49:51

Название: Многоуровневое меню
Отправлено: john от 24 Марта 2012, 14:49:51
1. На демо сайте хомячков выводится горизонтальное меню, выводятся те страницы, у которых стоит галочка "Отображать в меню". Где в модуле шаблона данных можно найти его и отредактировать? Другие галочки я нашел, типа "показывать под меню, меню всегда развернуто", т.е. как это работает?

2. Второй вопрос, я хочу создать еще вертикальное многоуровневое меню, например я ставлю галочку "отображаться в вертикальном меню" и выводится эти страницы и их подразделы.
В шаблоне вызывал бы меню макросом %vertic_menu('default')%
Как правильно реализовать?

3. Или для такого случая лучше использовать Usel (для tpl-шаблонизатора), тогда как правильно расписать в шаблоне многоуровневое меню tpls/data/usel/default.tpl
$FORMS = Array();


$FORMS['vertic_menu_block_level1'] = <<<END
<ul id="menu">
%lines%
</ul>

END;

$FORMS['vertic_menu_line_level1'] = <<<END
<li><a href="%link%"><span><span>
%text%
</span></span></a>
</li>
END;

$FORMS['vertic_menu_line_level1_a'] = <<<END
<li class="act"><a href="%link%"><span><span>
%text%
</span></span></a>
</li>

END;

Название: Re:Многоуровневое меню
Отправлено: HardHardy от 25 Марта 2012, 03:30:16
Я делал горизонтальное макросом %content menu()%
А вертикальное выборкой usel. макросом %data doSelection()%
Оформление прописывается в css. (погуглите)
Пример на моем сайте: http://www.fortis74.ru/rekomendacii/ (http://www.fortis74.ru/rekomendacii/) прошу прощения за ссыль.
Название: Re:Многоуровневое меню
Отправлено: admin от 25 Марта 2012, 11:41:45
1. этот параметр скрыт/ И что именно ты хочешь в нем отредактировать?
2. можно продублировать комплекс макросов которые работают при выводе %content menu()% и сделать на их основе какой-нибудь кастомный %content vertical()%.
3. А можно сделать через Usel ( что , я бы и выбрал), вам уже в другой ветке кидали ссылку на мою статью где расписано все от и до как это делается

 
Название: Re:Многоуровневое меню
Отправлено: john от 25 Марта 2012, 17:36:38
Цитировать
Я делал горизонтальное макросом %content menu()%
А вертикальное выборкой usel. макросом %data doSelection()%
Оформление прописывается в css. (погуглите)
Пример на моем сайте: http://www.fortis74.ru/rekomendacii/ прошу прощения за ссыль.
Да вижу, только мне не надо чтобы при наведении они открывались и автоматом закрывались. Нажал на раздел и он развернулся.

1. Править ничего не хотел, аналогично ему хотел сделать.
3. Да, статья очень полезная, развернул меню у себя все прекрасно
А в видеокасте в конце упомянули про дополнительные галочки, это про развернутое или свернутое меню? как можно сделать свернутым, а при клике на раздел он разворачивался полностью?
Название: Re:Многоуровневое меню
Отправлено: john от 25 Марта 2012, 20:30:48
еще вопрос, сделал через usel.
Попытался выделить активный раздел, но почему то блок
$FORMS['elements_block_line_a'] он не видит, почему?
$FORMS['elements_block'] = <<<END
<ul id="menu">
    %items%
</ul>
END;

$FORMS['elements_block_line'] = <<<END
<li><a href="%link%">%name%</a></li>
END;

$FORMS['elements_block_line_a'] = <<<END
<li class="act"><a href="%link%"> %name%</a></li>

END;
Название: Re:Многоуровневое меню
Отправлено: admin от 26 Марта 2012, 08:22:20
про галочки... это была импровизация на тему того как сделать полноценные галочки управления при создании usel меню. Просто добавляешь дополнительные галочки которые учитываешь при выводе в шаблоне.

насчет шаблона для активноо пункта, такого нет (см внимательно документацию http://help-dev.umi-cms.ru/data.doSelection.html#tplDesc)
Название: Re:Многоуровневое меню
Отправлено: john от 27 Марта 2012, 00:00:57
получается активный пункт меню через usel нельзя сделать выделенным?
Название: Re:Многоуровневое меню
Отправлено: HardHardy от 28 Марта 2012, 16:05:43
а что мешает сделать через css?
usel просто делает выборку. все остальное в css.
Название: Re:Многоуровневое меню
Отправлено: admin от 28 Марта 2012, 16:59:39
Для определения активной страницы можно воспользоваться чем-то вроде этого маленький кастомный макрос is_active_page (http://umihelp.ru/notes/malen_kij_kastomnyj_makros_is_active_page/)
Название: Re:Многоуровневое меню
Отправлено: john от 28 Марта 2012, 22:37:42
В CSS что-то тяжеловато, если каждый <li> отличался классом то да.

Воспользовался кастомным макросом.
в /classes/modules/custom.php прописал
public function is_active_page($id=NULL) {
    if(!$id) return;
    $page_id = cmsController::getInstance()->getCurrentElementId();// берем id текущей страницы
    if($page_id==$id) return 'active';
}

в /tpls/data/usels/default.tpl

 прописал
<a href="%link%" class="Method custom::is_active_page doesn't exists">%name%</a>

В html коде вижу тоже самое
<a href="/zakupki/2012_god/godovoj_plan/" class="Method custom::is_active_page doesn't exists">Годовой план</a>
Что-то не работает
Название: Re:Многоуровневое меню
Отправлено: admin от 29 Марта 2012, 09:20:22
<a href="%link%" class="Method custom::is_active_page doesn't exists">%name%</a>

уже выглядит странно)) видимо надо так:
<a href="%link%" class="%custom is_active_page(%pid%)%">%name%</a>

и опят же стоит понимать что статук "актив" вернется только той странице которая является текущей
Название: Re:Многоуровневое меню
Отправлено: john от 29 Марта 2012, 19:11:23
так он все равно всем присваивает class текущий.
class="active" выводит у всех.
Название: Re:Многоуровневое меню
Отправлено: HardHardy от 31 Марта 2012, 08:19:36
"думаю придется обратиться к javascript. с его помощью определять активный пункт и задавать какой-нибудь дополнительный класс. уже к этому классу применить нужные стили" (с)
Название: Re:Многоуровневое меню
Отправлено: john от 31 Марта 2012, 22:51:37
Ура, получилось, %pid% на %id%
<a href="%link%" class="%custom is_active_page(%id%)%">%name%</a>
Всем спасибо))
Название: Re:Многоуровневое меню
Отправлено: HardHardy от 03 Апреля 2012, 13:34:31
А можете привести пример макроса с условиями если <li class=active> то родительский <ol class=active>?
Чтение документации по php пока результата мне не дало. Пытаюсь например так:
public function is_ol_active($id=NULL) {
if($li=='liactive') return 'olactive';
else return 'olnoactive';
Ну канешна выдает ошибки. И как он определит что <li> является дочерним родительского <ol> а не всех присутствующих <ol> в коде?
Как вообще теги php-коде указываются?
Название: Re:Многоуровневое меню
Отправлено: admin от 04 Апреля 2012, 00:26:51
HardHardy приведи полностью задачу которую ты решаешь и какими средствами, что-то мне подсказывает, что идешь немного не тем путем
Название: Re:Многоуровневое меню
Отправлено: HardHardy от 04 Апреля 2012, 13:50:00
usels/menu.xml
<selection>
    <target result="pages">
        <type id="3" />
        <category depth="2">{1}</category>
</target>
  <property name="leftmenucataloga" value="1" />
  <sort>ord</sort>
</selection>

tpls/data/usel/menu.tpl
<?php
$FORMS = Array();
$FORMS['elements_block'] = <<<END
%items%
END;
$FORMS['elements_block_line'] = <<<END
<div class="%custom is_active_page(%id%)%"><h4><a href="%link%">%name%</a></h4>
%data doSelection(menu1, menu, %id%)%</div>
END;
$FORMS['elements_block_empty'] = <<<END
END;
?>

tpls/data/usel/menu1.tpl
<?php
$FORMS = Array();
$FORMS['elements_block'] = <<<END
<ol class="%custom is_ol_active(%id%)%">%items%</ol>
END;
$FORMS['elements_block_line'] = <<<END
<li class="%custom is_li_active(%id%)%"><a href="%link%">%name%</a>
%data doSelection(menu1, menu, %id%)%</li>
END;
$FORMS['elements_block_empty'] = <<<END
END;
?>

tpls/content/inner.tpl
%data doSelection(menu, menu, 0)%<br />

css/css.css
.nav3-grid ol {
  line-height: 30px;
  height: 0px; /*Сворачивает меню*/
  list-style-type: none;
  overflow: hidden;
  padding: 0px;
}
.nav3-grid:hover ol  {
  height: auto;
}
.nav3-grid-active ol {
  line-height: 30px;
  height: auto;
  list-style-type: none;
  overflow: hidden;
  padding: 0px;
}

classes/modules/custom.php
		public function is_active_page($id=NULL) {
if(!$id) return;
$page_id = cmsController::getInstance()->getCurrentElementId();// берем id текущей страницы
if($page_id==$id) return 'nav3-grid-active';
else return 'nav3-grid';
}
public function is_li_active($id=NULL) {
if(!$id) return;
$page_id = cmsController::getInstance()->getCurrentElementId();
if($page_id==$id) return 'liactive';
else return 'linoactive';
}
/*public function is_ol_active($id=NULL) {
if(!$li=='liactive') return 'olactive';
else return 'olnoactive';
}*/
Название: Re:Многоуровневое меню
Отправлено: HardHardy от 09 Апреля 2012, 09:50:41
Как видно из выше сказанного я не знаю как и можно ли вообще подставить значение в класс тега <ol> опираясь на значение класса тега <li> через php.