Меню с выделением текущего раздела
Практически на всех сайтах есть навигация в виде меню. К сожалению, в CakePHP нет хелпера, который бы помогал делать меню автоматически. Это вполне реализуемо, ведь на семантически правильно свёрстаных сайтах меню делается одинаково: <ul><li>...
Мне надоело делать меню вручную и я написал небольшой Element, который делает одноуровневое меню, выделяя текущий раздел.
В шаблоне (например, views/layouts/default.ctp) пишется
-
'Главная' => '/',
-
'О компании' => '/pages/company',
-
'Услуги' => '/services/',
-
'Контакты' => '/feedbacks/add',
-
)))?>
, где ключи - это названия разделов, а значения - пути к разделам в формате Router (то есть array('controller'=>'feedbacks', 'action'=>'add') будет работать).
Это выведет на главной такой код
-
<div class="menu">
-
<ul>
-
<li class="current">Главная</li>
-
<li><a href="/pages/company">О компании</a></li>
-
<li><a href="/services/">Услуги</a></li>
-
<li><a href="/feedbacks/add">Контакты</a></li>
-
</ul>
-
</div>
Обёрточный div мне советуют делать наши верстальщики, чтобы было легче оформлять его как угодно с помощью CSS. Текущая страница выделена классом current и не является ссылкой. Если вы привыкли верстать по-другому, то код элемента интуитивно понятен.
/views/elements/menu.ctp
-
<div class="menu">
-
<ul>
-
<? foreach ($items as $name=>$link): ?>
-
<? if (Router::url($link) != $here): ?>
-
<li><?=$html->link($name, $link)?></li>
-
<? else: ?>
-
<li class="current"><?=$name?></li>
-
<? endif ?>
-
<? endforeach ?>
-
</ul>
-
</div>
Для стандартной темы CakePHP я вставляю главное меню в #header после h1 и применяю такой CSS:
-
#header {padding-bottom:27px}
-
#header h1 {height: auto; float:left}
-
#header div.menu ul {padding-top:0; float:right}
-
#header div.menu ul li {float:left; list-style:none; font-weight:bold;}
-
#header div.menu ul li a {color:#dd9; font-weight:normal}
-
#header div.menu ul li a.current {color:#fff; text-decoration:none}
Вроде получилось в стиле Cake. Что скажете?
>> Что скажете?
Скажу, что не вижу смысла в замене фигурных скобок на двоеточия. А в остальном -- вполне в стиле кейка.
Не понял еще смысл двух галок после этой формы.
> Скажу, что не вижу смысла в замене фигурных скобок на двоеточия
Тут непонятно. В default.ctp они пишут
А в flash.ctp
Видимо можно писать как удобнее
А о двух галках после формы не совсем понял.
После формы для отправки комментария стоят две галки. Одна до кнопки "Добавить комментарий", другая после. Описания галок мало чем отличаются.
Одна "Подписаться на следующие комментарии к этой записи по e-mail", а вторая "Отправлять мне следующие комментарии по e-mail". У них все таки разный смысл или один и тот же?
упс, не заметил. для зарегистрированных пользователей показывало только одну.
спасибо, исправил.
Симпатично
Я чем-то подобным пользуюсь уже давно (правда не для кейка, а для своей самописной системы). Для универсальности кода могу порекомендовать назначать первому и последнему LI классы "first" и "last" (верстальщики будут рады :)).
+1
Действительно такое просят. Но так как сейчас мне это не нужно, то будем считать, что код опережает время и рассчитан на CSS3
подскажите неучу откуда вы получаете массив $items в файле menu.ctp. Бьюсь уже целый день не могу понять..
тут на помощь придёт Антон Исайкин
http://cake-php.ru/wiki/Manual11/views#h18760-5
Блин, а для меня это вообще тёмный лес, но у меня диплом по WEB и мне просто необходимо разобраться и забацать свой проект. А тема у меня: "Разработка ПО интернет - библиотеки"
Подскажите, а как бы это переписать для пирожка 1.1. А то не хочется в рабочий проект бэту тыкать
Просто не совсем понял стиль написания (что за двоеточия - это вместо скорок?)
А как переписать данный Element для пирожка 1.1. Просто не хочется бетой пользоваться (пусть подлатают - тогда пересядем
)
К сожалению, не знаю. Уже месяца 3 как у нас перевёли все проекты на CakePHP 1.2
Там хороший код, можно пользоваться.
[...] by implementation of menu element for CakePHP I found that I require multilevel menus. Furthermore if should fit [...]
Спасибо, интересный пример. Правда я делал такое не через Routers::url
Не могу найти как сообразить древовидную навигацию из таблицы типа
CREATE TABLE `productions` (
`id` int(11) NOT NULL auto_increment,
`parent` int(11) default '0',
`title` varchar(60) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
может гуру покажут?
А в чем проблема?
Вариантов два:
1. Выгрести одним запросом всю таблицу и скриптом отсортировать.
2. Выгребать поэтапно - сначала все записи с parent=0, потом шерстить результат выборки и вытаскивать дочерние элементы.