Если интересует как самостоятельно выполнить? Оформлю пост .
PS//Это ла-ла-да-ла-ла образно, Не принимать за личную обиду!
Поскольку есть одна функция menu, к которой обращаемся при выводе ВСЕХ меню ( верхнего, нижнего, меню действий, меню пользователя и так далее). Все меню выводит один шаблон.
То стоит вопрос для использования своих хаков для меню (именно "Персональное меню" — в нашем случае),
нам необходим свой шаблон отличный от системного.
Выполняем хак файла core/template.php. Меняем функцию menu на эту:
/** * Выводит меню */ public function menu($menu_name, $detect_active_id=true, $css_class='menu', $max_items=0, $is_allow_multiple_active=false){ $core = cmsCore::getInstance(); $config = cmsConfig::getInstance(); $menu_model = cmsCore::getModel('menu'); $menu = $menu_model->getMenu($menu_name, 'name'); if (!$menu){ return; } $items = $menu_model->getMenuItemsTree($menu['id']); if (!$items){ return; } $this->addMenuItems($menu_name, $items); } if ($detect_active_id){ if ($menu_name == 'main'){ // dump($this->menus[$menu_name]); } //перебираем меню в поисках текущего пункта foreach($this->menus[$menu_name] as $id=>$item){ $item['url'] = href_to($item['controller'], $item['action'], $item['params']); $this->menus[$menu_name][$id]['url'] = $item['url']; $menu[$id] = $item; } if (!$url) { continue; } //полное совпадение ссылки и адреса? if ($current_url == $url){ $active_ids[] = $id; $is_strict = true; } else { //частичное совпадение ссылки и адреса (по началу строки)? if ($url_first_part == $url){ $active_ids[] = $id; $is_strict = false; } } } } } if($menu['id']==2){ $this->renderUsrMenu($this->menus[$menu_name], $active_ids, $css_class, $max_items); } else{ $this->renderMenu($this->menus[$menu_name], $active_ids, $css_class, $max_items); } } else{ $this->renderMenu($this->menus[$menu_name], $active_ids, $css_class, $max_items); } }
Если id меню не 2 ( тоесть Меню пользователя) и это меню Действий( id не имеет)- то рендерим обычный шаблон menu.tpl
Если это меню пользователя- то рендерим свой шаблон usr_menu в котором мы и определим нужную нам обработку js script.А также подключим js css файлы.
И создадим свою функцию рендер добавив в файл.core/template.php код функции
$tpl_file = $this->getTemplateFileName('assets/ui/usr_menu'); include($tpl_file); }
Собственно и все.
Файл шаблона
<?php $this->addJS('templates/default/js/jquery.cookie.js'); $this->addJS('templates/default/js/jquery.hoverIntent.minified.js'); $this->addJS('templates/default/js/jquery.dcjqaccordion.2.7.min.js'); $this->addCSS('templates/default/css/skins/blue.css'); //$this->addCSS('templates/default/css/skins/graphite.css'); //$this->addCSS('templates/default/css/skins/grey.css'); ?> <script type="text/javascript"> $(document).ready(function($){ $('#accordion-1').dcAccordion({ eventType: 'click', autoClose: true, saveState: true, disableLink: true, speed: 'slow', showCount: true, autoExpand: true, cookie : 'dcjq-accordion-1', classExpand : 'dcjq-current-parent' }); $('#accordion-2').dcAccordion({ eventType: 'click', autoClose: false, saveState: true, disableLink: true, speed: 'fast', classActive: 'test', showCount: true }); $('#accordion-3').dcAccordion({ eventType: 'click', autoClose: false, saveState: false, disableLink: false, showCount: false, speed: 'slow' }); $('#accordion-4').dcAccordion({ eventType: 'hover', autoClose: true, saveState: true, disableLink: true, menuClose: false, speed: 'slow', showCount: true }); $('#accordion-5').dcAccordion({ eventType: 'hover', autoClose: false, saveState: true, disableLink: true, menuClose: true, speed: 'fast', showCount: true }); $('#accordion-6').dcAccordion({ eventType: 'hover', autoClose: false, saveState: false, disableLink: false, showCount: false, menuClose: true, speed: 'slow' }); }); </script> <div class="blue"> <ul class="accordion" id="accordion-3"> <?php if ($max_items){ // // Считаем количество пунктов первого уровня // $first_level_count = 0; $first_level_limit = 0; $index = 0; foreach($menu as $item){ if ($item['level']==1){ $first_level_count++; } if ($first_level_count > $max_items && !$first_level_limit){ $first_level_limit = $index; } $index++; }
Файлы js /templates/default/js/
Файлы css /templates/default/css/
Выбирайте сами тип меню их 6, Просто ид блока указав accordion-1 или accordion-3 или accordion-6
ну и стили уж как нибудь под свои нужды сами.
Не претендую на красоту решения. Другого пути пока не вижу!
Нет необходимости делать хаки системных файлов. Свой шаблон меню тоже не нужен (ну или я не увидел в вашем описании почему без него нельзя обойтись).Другого пути пока не вижу!
Ваш шаблон ведь в плане верстки по сути идентичен системному (да и глобально, вообще, практически любому меню на любом сайте) — он генерирует ul-li список. А привязать JS и CSS можно в основном шаблоне сайта (main.tpl.php), который может быть уникальным и для этого не требуется вмешательство в ядро. Выбирать нужное меню в JS можно по css-классу виджета.
Вот за это — уважение.Вы сдесь пока ла-ла-да-ла-ла… Сел и сделал гармонь-меню за полчаса.
Уважаемым R2! Мне спорить не к лицу.Нет необходимости делать хаки системных файлов. Свой шаблон меню тоже не нужен (ну или я не увидел в вашем описании почему без него нельзя обойтись).
Сделаю робкое обьяснение.
Для использования всех этих гармоней… необходим и класс и селектор id блока. Вот именно для одного меню,
Стандартный шаблон имеет
<ul class="<?php echo $css_class; ?>">
Тоесть если я добавлю
<ul class="accordion" id="accordion-3">
Что много писать, Лучше практически реализацию увидеть.Ваш шаблон ведь в плане верстки по сути идентичен системному (да и глобально, вообще, практически любому меню на любом сайте) — он генерирует ul-li список. А привязать JS и CSS можно в основном шаблоне сайта (main.tpl.php), который может быть уникальным и для этого не требуется вмешательство в ядро. Выбирать нужное меню в JS можно по css-классу виджета.
Fuze, ещё раз спасибо, что это уже есть в первой ветке!
Геннадий Иванович, я там и пытался освоить создание возможности выбора шаблона для виджета (аккордион просто для примера)
Найти элемент ведь можно не только по id. Есть масса способов как составить селектор
Если не считать виджеты, то можно, например, присвоить класс любому корневому пункту в нужном меню, через админку.
Например, класс accordion-1. Тогда найти само меню можно будет так:
$('li.accordion-1').parent('.menu')
Будет со временем.r2, есть просьба прислушаиться — каждый виджет снабдить выбором шаблона (и про контент очень желательно не забыть).
В первой ветке это делал я )Fuze, ещё раз спасибо, что это уже есть в первой ветке!
Я же не ради спора, а для консультации. Править системные файлы плохо, по понятным причинам. Поэтому я и подсказываю как можно обойтись без них.Мне спорить не к лицу.
Сейчас там можно изменить только название меню, хотелось бы туда еще поле класс добавить и передать в файл \templates\default\assets\ui\menu.tpl.php
Там ведь первая строчка кода, от куда то получает css класс 'menu' — только не знаю от куда.
<ul class="<?php echo $css_class; ?>">
Извините, — думал что вы ведёте двойку а единичку — Fuze.В первой ветке это делал я )
Спасибо!
Да, я уже об этом думаюr2, Хотелось бы увидит возможность, установки CSS класса в меню, не к пунктам меню а в самом меню
Сейчас уже так оно и есть.Извините, — думал что вы ведёте двойку а единичку — Fuze.
Evanescence, этот класс получается отсюда \templates\default\widgets\menu\menu.tpl.phpТам ведь первая строчка кода, от куда то получает css класс 'menu' — только не знаю от куда.
Код PHP:
<ul class="<?php echo $css_class; ?>">
Попробовал я Ваш способ. В итоге в левом верхнем углу остались иконка пользователя и никнейм из шапки меню пользователя и больше ничего:)Собственно и все.
Если в
if($menu['id']==2){
В шаблоне уже идет представление класса а определение идет в функции menu.Evanescence, этот класс получается отсюда \templates\default\widgets\menu\menu.tpl.php
Этот класс принудительно указан в функции public function menu class cmsTemplate
public function menu($menu_name, $detect_active_id=true, $css_class='menu',
Я удаляю описание класса в шаблоне меню у элемента ul. и получаю развязанные руки в стилях для всех меню.
Есть предложение для использования личных шаблонов и классов для меню
Сейчас оформляю.