CMS Eleanor - Поиск
Полная версия этой страницы: Официальный форум Eleanor CMS » переделка стандартного горизонтального меню
Официальный форум Eleanor CMS » Поддержка пользователей системы Eleanor CMS » Разработка системы
Здравствуйте, помогите пожалуйста переделать стандартный вывод блока горизонтального меню на вот этот:

<menu id="h_flow" class="lcol">
            <li><a href="#"><span>Главная</span></a></li>
            <li class="h_this"><a href="#"><span>Выпадающее меню</span></a>
                <ul>
                    <li><a href="#">Подкатегория меню</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><a href="#"><span>Контакты</span></a></li>
            <li><a href="#"><span>Блог</span></a></li>
            <li><a href="#"><span>Кодинг</span></a></li>
            <li><a href="#"><span>Верстка</span></a></li>
            <li><a href="#"><span>Фотошоп</span></a></li>
        </menu>

вот это же меню, но в стандартном виде

<nav>
  <ul class="topmenu">
    <li><a href="#">Личный кабинет</a></li>
    <li><a href="#">Новости</a></li>
    <li><a href="#" rel="search">Поиск</a></li>
    <li><a href="#">Карта сайта</a></li>
    <li><a href="#">Информация</a></li>
    <li><a href="#" rel="contact">Обратная связь</a></li>
    <li><a href="http://eleanor-cms.ru">Eleanor CMS</a>
      <ul>
        <li><a href="#">Официальный сайт Eleanor CMS</a></li>
        <li><a href="#">Форум поддержки</a></li>
      </ul>
    </li>
  </ul>
</nav>


вот сам api файл, который выводит обычное меню

<?php
/*
	Copyright © Eleanor CMS
	URL: http://eleanor-cms.ru, http://eleanor-cms.com
	E-mail: support@eleanor-cms.ru
	Developing: Alexander Sunvas*
	Interface: Rumin Sergey
	=====
	*Pseudonym
*/
if(!defined(&apos;CMS&apos;))die;
class ApiMenu extends BaseClass
{
	private
		$config=array();

	public function __construct($config=array())
	{
		$this->config=$config;
	}

	public function GetOrderedList($lang=false,$status=1)
	{
		if(!$lang)
			$lang=Language::$main;

		if($db=Eleanor::$Cache->Get($this->config[&apos;n&apos;].&apos;_dump&apos;.$status.&apos;_&apos;.$lang))
			return $db;

		$maxlen=0;
		$res=$to1sort=$to2sort=$db=array();
		$R=Eleanor::$Db->Query(&apos;SELECT `id`,`url`,`eval_url`,`title`,`pos`,`parents`,`status` FROM `&apos;.$this->config[&apos;t&apos;].&apos;` LEFT JOIN `&apos;.$this->config[&apos;tl&apos;].&apos;` USING(`id`) WHERE `language` IN (\&apos;\&apos;,\&apos;&apos;.$lang.&apos;\&apos;)&apos;.($status===false ? &apos;&apos; : &apos; AND `status`=1&apos;));
		while($a=$R->fetch_assoc())
		{
			if($a[&apos;parents&apos;])
			{
				$cnt=substr_count($a[&apos;parents&apos;],&apos;,&apos;);
				$to1sort[$a[&apos;id&apos;]]=$cnt;
				$maxlen=max($cnt,$maxlen);
			}
			$db[$a[&apos;id&apos;]]=array_slice($a,1);
			$to2sort[$a[&apos;id&apos;]]=$a[&apos;pos&apos;];
		}
		asort($to1sort,SORT_NUMERIC);

		foreach($to1sort as $k=>&$v)
			if($db[$k][&apos;parents&apos;] and preg_match(&apos;#(\d+),$#&apos;,$db[$k][&apos;parents&apos;],$p)>0)
				if(isset($to2sort[$p[1]]))
					$to2sort[$k]=$to2sort[$p[1]].&apos;,&apos;.$to2sort[$k];
				else
					unset($to1sort[$k],$db[$k],$to2sort[$k]);

		foreach($to2sort as $k=>&$v)
			$v.=str_repeat(&apos;,0&apos;,$maxlen-substr_count($db[$k][&apos;parents&apos;],&apos;,&apos;));

		natsort($to2sort);
		foreach($to2sort as $k=>&$v)
			$res[$k]=$db[$k];
		Eleanor::$Cache->Put($this->config[&apos;n&apos;].&apos;_dump&apos;.$status.&apos;_&apos;.$lang,$res,86400);
		return $res;
	}

	public static function BuildMultilineMenu($a,$first=&apos;<ul>&apos;)
	{
		$parents=reset($a);
		$l=strlen($parents[&apos;parents&apos;]);
		$c=$first;
		$n=-1;
		$onp=false;
		foreach($a as &$v)
		{
			++$n;
			$nl=strlen($v[&apos;parents&apos;]);
			if($nl!=$l)
			{
				if($l>$nl)
					break;
				elseif(!$onp)
				{
					$c.=self::BuildMultilineMenu(array_slice($a,$n));
					$onp=true;
				}
				continue;
			}
			if($n>0)
				$c.=&apos;</li>&apos;;
			$c.=&apos;<li><a href="&apos;.$v[&apos;url&apos;].&apos;"&apos;.$v[&apos;params&apos;].&apos;>&apos;.$v[&apos;title&apos;].&apos;</a>&apos;;
			$onp=false;
		}
		return$c.&apos;</li></ul>&apos;;
	}
}
wormen
не совсем понятно, что вы хотите изменить...
Цитата (wormen @ 2013-06-07, 19:34)
не совсем понятно, что вы хотите изменить...


вывод меню переделать под нужный
Maximkaboom
Qnut, по моему правильнее будет переделать стиль вашего меню в шаблоне под систему, чем ковырять файлы движка и переделывать их под шаблон
Цитата (Maximkaboom @ 2013-06-07, 22:53)
Qnut, по моему правильнее будет переделать стиль вашего меню в шаблоне под систему, чем ковырять файлы движка и переделывать их под шаблон


да нет, не правильнее, я использую новые разработки html5 а там только сделан вид под html5, плюс меню имеет свой скрипт чего туда не прикрутишь...
Maximkaboom
Qnut, а разве стандартный вид меню не подходит под стандарты html5?
Спрашиваю так, для общего развития.

На счет вашей проблемы, смогу помочь, как буду дома, сейчас с телефона просто
Цитата (Maximkaboom @ 2013-06-07, 23:05)
Qnut, а разве стандартный вид меню не подходит под стандарты html5?
Спрашиваю так, для общего развития.

На счет вашей проблемы, смогу помочь, как буду дома, сейчас с телефона просто


он то работает, не спорю, но это больше под xhtml идёт, в html5 специально внедрили тег "menu" дабы отличать обычные списки и меню сайта, тег nav, который сейчас там стоит предназначен для навигации, это всеже сео оптимизация, и не хочется чтобы из-за какой-то мелочи портилось всё
Maximkaboom
Qnut, а навигация это разве не меню?:) не понимаю, зачем вы паритесь на счет этого. Ну да ладно, ваше дело.
Цитата (Maximkaboom @ 2013-06-07, 23:22)
Qnut, а навигация это разве не меню?:) не понимаю, зачем вы паритесь на счет этого. Ну да ладно, ваше дело.

Тег <menu> предназначен для отображения списка пунктов меню. Аналогично тегам <ol> и <ul> внутри контейнера <menu> список формируется с помощью тегов <li>.
<menu>
<li>пункт меню</li>
<li>пункт меню</li>
</menu>
Тег <nav> задает навигацию по сайту. Если на странице несколько блоков ссылок, то в <nav> обычно помещают приоритетные ссылки.
<nav>ссылки</nav>

тобишь как видно, нав не предназначен для того, чтобы внутри него были списки, а только ссылки типа <a href="">
Alexander
Qnut, добавьте еще один метод и пользуйте его:

	public static function BuildMultilineMenu2($a,$first='<menu>',$span=true)
	{
		$parents=reset($a);
		$l=strlen($parents['parents']);
		$c=$first;
		$n=-1;
		$onp=false;
		foreach($a as &$v)
		{
			++$n;
			$nl=strlen($v['parents']);
			if($nl!=$l)
			{
				if($l>$nl)
					break;
				elseif(!$onp)
				{
					$c.=self::BuildMultilineMenu(array_slice($a,$n),'<menu>',false);
					$onp=true;
				}
				continue;
			}
			if($n>0)
				$c.='</li>';
			$c.='<li>'.($span ? '<span>' : '').'<span><a href="'.$v['url'].'"'.$v['params'].'>'.$v['title'].($span ? '/<span>' : '').'</a>';
			$onp=false;
		}
		return$c.'</li></menu>';
	}
Спасибо огромное!

Александр, я вам писал на почту касательно адаптации или написания нового модуля, ответьте пожалуйста.
а как сделать чтобы если есть под меню, то к родительскому тегу li добавлялся класс class="h_this" ?

И нужно чтобы <menu> были только в основном списке, в подкатегориях нужны <ul> теги
Alexander
Qnut, умнее и проще всего это сделать при помощи javascript. Как-то так:

$("#menuid > li:has(ul)").addClass("h_this");
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.