Saitoff, все идеально встроено в дизайн. Да и позиции для модуля по факту нет на том месте. Я уже думал прикрутить другой модель меню, никак. Шаблон сверстан так, что подходит только этот скрипт, ну или нужно пилить стандартный модуль меню, чтобы он так же красиво вписался в дизайн.
Там реально заменить 4- 5 строчек максимум, но все поисковики молчат. Руки опускаться начинают.
alexj69, все верно. Проблема только с одним меню. Вот DEMO моего шаблона, я его конечно, переделал, но функционал и внешний вид меню не трогал. Вот Вам и пациент. А вот файл PHP:
<?php /** * @version 1.5.x * @package JoomVision Project * @email webmaster@joomvision.com * @copyright (C) 2008 http://www.JoomVision.com. All rights reserved. */ // No direct access defined('_JEXEC') or die(); /** * Class Menu Common * */ class MenuSystem{ var $_name = null; var $_template = null; var $_start = null; var $_end = null; var $_suffix = null; var $_active = null; var $_type = null; var $_cache = null; var $_nav = null; var $Itemid = null; /** * Enter description here... * * @param string $name * @param string $menutype * @param string $template_name * @param string $suffix * @return MenuSystem */ function MenuSystem( $name,$menutype,$template_name, $suffix="" ){ global $Itemid; $this->_name = $name; $this->_template = $template_name; $this->_suffix = $suffix; $this->_type = $menutype; $this->Itemid = $Itemid; $document =& JFactory::getDocument(); $document->addStyleSheet(JURI::base().'templates/'.$this->_template.'/jv_menus/'.'jv_'.$this->_name.'menu/'.'jv.'.$this->_name.'menu.css'); $document->addCustomTag('<script type="text/javascript" src="'.JURI::base().'templates/'.$this->_template.'/jv_menus/'.'jv_'.$this->_name.'menu/'.'jv.'.$this->_name.'menu.js"></script>'); /* if ($this->_name == 'dropline') { $document->addCustomTag('<script type="text/javascript">var menusys_active = new Array('. ( (count($this->_active) == 1) ? '"'.$this->open[0].'"' : implode(",", array_reverse($this->_active)) ) .');</script>'); } */ $this->genmenu(); } function hasChild($lvl) { $pid = $this->fatherId ($lvl); if (!$pid) return false; if (@$this->_nav[$pid]) return true; else return false; } function _showMenuDetail($row, $level = 0) { $_temp = null; $title = "title=\"$row->name\""; $menu_params = & new JParameter ($row->params); if ($row->type == 'separator') { echo '<a href="javascript://" title=""><span class="separator">'.$row->name.'</span></a>'; } if ($menu_params->get('menu_image') && $menu_params->get('menu_image') != -1) { $str = '<img src="images/stories/'.$menu_params->get('menu_image').'" alt="'.$row->name.'" /><span class="menusys_name">'.$row->name.'</span>'; } else { $str = '<span class="menusys_name">'.$row->name.'</span>'; } $Class = $this->activeClass ($row, $level); $id='id="menusys'.$row->id.'"'; if ($row->url != null) { if ($row->browserNav == 0) { $menuItem = '<a href="'.$row->url.'" '.$Class.' '.$id.' '.$title.'>'.$str.'</a>'; } elseif ($row->browserNav == 1) { $menuItem = '<a target="_blank" href="'.$row->url.'" '.$Class.' '.$id.' '.$title.'>'.$str.'</a>'; } elseif ($row->browserNav == 2) { $url = str_replace('index.php', 'index2.php', $tmp->url); $atts = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=500,height=350'; $menuItem = '<a href="'.$url.'" onclick="window.open("'.$url.'",\'targetWindow\',\''.$atts.'\'); return false;" '.$Class.' '.$id.' '.$title.'>'.$str.'</a>'; } } else { $menuItem = '<a '.$active.' '.$id.' '.$title.'>'.$str.'</a>'; } echo $menuItem; } function show($start=0, $end = 14) { $this->_start = $start; $this->_end = $end; echo "<div class=\"menusys_".$this->_name.$this->_suffix."\">"; if ($this->_start == 0) { //~~ Only first level will be shown ~~ $this->showMenu (0, 0); }else{ $parID = $this->fatherId($this->_start); if ($parID) $this->showMenu ($parID, $this->_start); } echo "</div>"; } function showMenu($pid, $level) { if (@$this->_nav[$pid]) { if ($level == 0) { echo "<ul id=\"menusys_".$this->_name."\">"; } elseif($level == 1 && ($this->_name == 'submoo' || $this->_name == 'split')) { echo "<ul id=\"menusub_".$this->_name."\">"; } else { echo "<ul>"; } $i = 0; foreach ($this->_nav[$pid] as $menu) { if(@$this->_nav[$menu->id]) $abc = " hasChild"; else $abc = ""; if ($i == 0) echo '<li class="first-item'.$abc.'">'; elseif ($i == count($this->_nav[$pid]) - 1) echo '<li class="last-item'.$abc.'">'; else echo '<li class="'.$abc.'">'; $this->_showMenuDetail( $menu, $level); if ($level < $this->_end) $this->showMenu( $menu->id, $level+1 ); $i++; echo "</li>"; } echo "</ul>"; } } function activeClass ($menu_item, $level) { return (in_array($menu_item->id, $this->_active)) ? " class=' active'" : " class=' item'"; } //~~ This function will found the father ID of and item marked by level in array of active items ~~~~~~~ function fatherId ($lvl) { if (!$lvl) return 0; //echo "<pre>";print_r($this->_active);exit; if (count($this->_active) < $lvl) return 0; $parID = count($this->_active) - $lvl; return $this->_active[$parID]; } /** * Generate the menu * * @return mixed */ function genmenu(){ $nav = @JMenu :: getInstance(); $my = &JFactory::getUser(); $nav = array(); $this->_cache = array(); if(@strtolower(get_class($menu)) == 'jexception') { $nav = @JMenu :: getInstance('site'); } $menus = &JSite::getMenu(); $rows = $menus->getItems('menutype', $this->_type); $_tmp = array(); if (count($rows)) { foreach ($rows as $key => $value) { if ($value->access <= $my->get('gid')) { $par = $value->parent; $list_menu = @ ($nav[$par]) ? $nav[$par] : array (); if ($value->type == 'separator') { return '<span class="separator">'.$value->name.'</span>'; } elseif ($value->type == 'url') { if ((strpos($value->link, 'index.php?') !== false) && (strpos($value->link, 'Itemid=') === false)) { $value->url = $value->link.'&Itemid='.$value->id; } else { $value->url = $value->link; } } else { $router = JSite::getRouter(); if ($router->getMode() == JROUTER_MODE_SEF) { //~~ No JRoute now ~~~ $value->url = 'index.php?Itemid='.$value->id; } else { //~~ No JRoute now ~~~ $value->url = $value->link.'&Itemid='.$value->id; } } $value->_index = count($list_menu); $list_menu[] = $value; $nav[$par] = $list_menu; } $this->_cache[$value->id] = $value; $_tmp[$value->id] = $key; } } $this->_nav = $nav; //~~ Find out what submenus this item has ~~~~~~~~~~~ $active = array ($this->Itemid); $max = 14; //~~ We dont need more than 14 levels of menu, do we? ~~~ $id = $this->Itemid; while ($max) { if (isset($_tmp[$id])) { $tmp = $_tmp[$id]; if (isset ($rows[$tmp]) && $rows[$tmp]->parent > 0) { $id = $rows[$tmp]->parent; $active[] = $id; } else { break; } } $max--; } $this->_active = $active; } } ?>
, именно он несет ответственность за кривость этих ссылок. Если я отключаю это меню (moomenu) то получаю стандартное неотесанное меню, которое не горизонтальное, а вертикально и совсем не вписывается в дизайн, но при этом ссылки там такие, как нужно.
Вопрос в том, что нужно изменить в этом коде, чтобы ссылки были такого же типа, как и с стандартном меню. Но я повторюсь еще раз, в PHP полный нубяра. Есть мысли по этому поводу?---------- Добавлено 18.05.2012 в 14:11 ----------Вот внешний вид меню, если что:
alexj69, все стоит. Как это по-другому, 7000 ссылок генерирует, а на разделы и категории из ОДНОГО меню - нет, а на другие меню - да =)
Я точно говрю, дело в в том, кокой тип ссылок указан для вывода в коде MOOMENU. Его надо править, только где бы спеца найти, у Вас никого нет?
alexj69, я не хочу Вас обвинять в том,ч его вы, возможно, никогда не делали и, надеюсь, не сделаете. Надеюсь Вы честный и порядочный человек. Но сайты показывать никому не буду, это кредо, пускай иногда и во вред себе.
Ссылки точно такие, как я уже показывал:
www.domen.ru/index.php?Itemid=986
Ни в админке, ни в sh404sef таких и близко нет.
Пытался делать 301-й
Redirect 301 /index.php?Itemid=986 http:/www.domen.ru/razdel/
Пытался загонять их в sh404SEF насильно, но он их отказался принимать.
Думаю попробовать другое меню.
alexj69, крайне неудобно перед Вами, но ссыль дать не могу. Все же мой пациент, деньги приносит. Не могу рисковать даже в ЛС. Спасибо за помощь!
Кнопочка прочистить ссылки? - Конечно!
Кеш Joomla, браузера и т.п.
Почему грешу на меню, так потому что в других меню ссылки нормально работаю, отображаются как положено. Но не в этом случае. Такое ощущение, что на него не действует ЧПУ. Почему я привел кусок кода, который за это отвечает по-идее.
Добрый день! Прошу помощи в решении проблемы с ЧПУ в меню сайта.
1. Думал, что не работает там ЧПУ из-за неэффективного компонента, который собственно и генерировал ЧПУ ссылки по всему сайту. Был переустановлен, все ссылки 301 редиректом переложил на новые адреса. Ночь не спал 8)
2. Пока был занят сохранением трафика и ссылочного, промаргал самую явную цель... ЧПУ так и не подключилось в меню... точнее сказать почти не подключилось. Остановлюсь подробнее.
Если я нахожусь на главной странице, то в меню ссылки вида:
http://www.site.ru/index.php?Itemid=986
При переходе в материал (статью, страницу) с вероятностью 30-50% нормальные ссылки ЧПУ вида
http://www.site.ru/ssulka-krasivaya/
3. ЧПУ создаю при помощи sh404SEF, дружу нормально с этим компонентом.
4. Шаблон сайта jv_eoty demo
5. Движок J1.5.23
Самое похожее нашел по этому адресу, но я очень слаб в PHP, не могу подстроить данные под свою ситуацию.
Вот код jv.common.php, который отвечает за тип ссылок moomenu меню:
$menus = &JSite::getMenu(); $rows = $menus->getItems('menutype', $this->_type); $_tmp = array(); if (count($rows)) { foreach ($rows as $key => $value) { if ($value->access <= $my->get('gid')) { $par = $value->parent; $list_menu = @ ($nav[$par])? $nav[$par] : array (); if ($value->type == 'separator') { return '<span class="separator">'.$value->name.'</span>'; } elseif ($value->type == 'url') { if ((strpos($value->link, 'index.php?')!== false) && (strpos($value->link, 'Itemid=') === false)) { $value->url = $value->link.'&Itemid='.$value->id; } else { $value->url = $value->link; } } else { $router = JSite::getRouter(); if ($router->getMode() == JROUTER_MODE_SEF) { //~~ No JRoute now ~~~ $value->url = 'index.php?Itemid='.$value->id; } else { //~~ No JRoute now ~~~ $value->url = $value->link.'&Itemid='.$value->id; } } $value->_index = count($list_menu); $list_menu[] = $value; $nav[$par] = $list_menu; } $this->_cache[$value->id] = $value; $_tmp[$value->id] = $key; } }
Не видел существование новой ветки.
Выражаю благодарность товарищу alexj69 за этот пост!---------- Добавлено 18.05.2012 в 11:47 ----------Поспешил я, не работает все равно.
При условии что я в любом месте кроме главное - работает, ссылки как положено отображаются. Но как только я нажимаю "Главная", то снова кривые. В чем может еще быть дело?
alexj69, не понял.
Как можно заставить ссылки меню конвертировать одним методом, а остальные - другим?
Где эта надстройка находится?
Спасибо!
Добрый день, уважаемые джумловоды. Прошу помощи в решении проблемы с ЧПУ в самом большом меню моего сайта.