Всем привет!
Не совсем уверен, что написал в нужной ветке.
Модератор, перенеси тему в нужную ветку если что )
Тут строю иерархическое меню, беря пункты с базы данных и в общем то получилось, но есть нюанс.
Запутался совсем в том что получилось. Помогите исправить косяк..
Должно получится вот что:
Когда я верстал это меню у меня получился такой html:
Код:
<ul>
<li>Родитель 1</li>
<li>
<ul>
<li>Пункт 1<li>
<li>Пункт 2<li>
...
</ul>
</li>
<li>Родитель 2</li>
<li>
<ul>
<li>Пункт 1<li>
<li>Пункт 2<li>
...
</ul>
</li>
<li>Родитель 3</li>
<li>
<ul>
<li>Пункт 1<li>
<li>Пункт 2<li>
...
</ul>
</li>
<li>Родитель 4</li>
<li>
<ul>
<li>Пункт 1<li>
<li>Пункт 2<li>
...
</ul>
</li>
</ul>
Когда начал это дело реализовывать в кохане появились проблемы.
Вот структура таблицы этих категорий:
Код:
CREATE TABLE IF NOT EXISTS `categories` (
`id` SMALLINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
`parent_id` SMALLINT(8) UNSIGNED NOT NULL DEFAULT 0,
`category` VARCHAR(60) NOT NULL COMMENT 'Category title',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_category` (`category`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Вот так я её заполнил:
Код:
INSERT INTO `categories` (`id`, `parent_id`, `category`) VALUES
( 1, 0, 'Одежда'),
( 2, 0, 'Сумки'),
( 3, 0, 'Обувь'),
( 4, 0, 'Аксессуары'),
( 5, 1, 'Жакеты'),
( 6, 1, 'Жилеты'),
( 7, 1, 'Куртки'),
( 8, 1, 'Футболки'),
( 9, 1, 'Платья'),
(10, 1, 'Плащи'),
(11, 1, 'Топы'),
(12, 2, 'Большие сумки'),
(13, 2, 'Дорожные сумки'),
(14, 2, 'Дорожные косметички'),
(15, 2, 'Рюкзаки'),
(16, 2, 'Портфели'),
(17, 2, 'Клатчи'),
(18, 2, 'Сумки на ремне'),
(19, 2, 'Сумки с ручками'),
(20, 2, 'Сумки-портфели'),
(21, 3, 'Ботинки'),
(22, 3, 'Кроссовки'),
(23, 3, 'Лоферы'),
(24, 3, 'Сандали'),
(25, 3, 'Сапоги'),
(26, 3, 'Балетки'),
(27, 3, 'Обувь на платформе'),
(28, 3, 'Обувь на каблуке'),
(29, 4, 'Брелоки'),
(30, 4, 'Гаджеты'),
(31, 4, 'Галстуки'),
(32, 4, 'Кошельки'),
(33, 4, 'Ремни'),
(34, 4, 'Головные уборы');
Вот моя модель (не обращайте внимание не дополнительные условия выборки из бд):
Код:
public function get_tree($sex)
{
$sql = "SELECT " . $this->_tableCategories . ".`id` AS 'ID'," . $this->_tableCategories . ".`parent_id` AS 'PARENT', " . $this->_tableSex . ".`sex` AS SEX, " . $this->_tableCategories . ".`category` AS 'CATEGORY'" .
" FROM " . $this->_tableCategories . ", " . $this->_tableCatSex . ", " . $this->_tableSex .
" WHERE " . $this->_tableCategories . ".`id` = " . $this->_tableCatSex . ".`category_id`" .
" AND " . $this->_tableCatSex . ".`sex_id` = " . $this->_tableSex . ".`id`" .
" AND " . $this->_tableSex . ".`sex` = :sex";
return DB::query(Database::SELECT, $sql)
->parameters(array(':sex' => $sex))
->execute();
}
В контролере всё очень просто:
Код:
public function action_index ()
{
$name = $this->request->param('name');
$id = $this->request->param('id');
$this->tree = Model::factory('Page')->get_tree($name);
if($id)
$content = View::factory('/shop/category')
->bind('menu', $this->tree);
else
$content = View::factory('/shop/name')
->bind('menu', $this->tree)
->bind('name', $name);
$this->template->content = $content;
if ($name == 'man')
{
// TODO: Брать title из БД
$this->template->title .= ' | ' . 'Мужчины';
}
else
{
// TODO: Брать title из БД
$this->template->title .= ' | ' . 'Женщины';
}
}
В виде массив перебираю так:
Код:
<div id="menu">
<ul>
<?php
foreach($menu as $items_id => $items_val)
// Если этого не сделать и пройтись форичем прямо по $items_val получается фигня какая-то
$newmenu[] = $items_val;
foreach($newmenu as $items_id => $items_val)
{
if($items_val['PARENT'] == 0)
echo '<li>' . HTML::anchor('#', $items_val['CATEGORY']) . '</li>'."\n";
echo '<li><ul>'."\n";
foreach($newmenu as $p_items_val)
{
if($p_items_val['PARENT'] == $items_val['ID'])
echo '<li>' . HTML::anchor(URL::site($items_val['SEX']) .'/category/' . $p_items_val['ID'], $p_items_val['CATEGORY']) . '</li>' ."\n";
}
echo '</ul></li>'."\n";
}
?>
</ul>
</div>
И всё вроде хорошо, меню и для женского и для мужского разделов магазина генерируется правильно, иерархическое - подкатегория в категории. Но видимо с я циклом перемудрил. Потому что на выходе получился код такой (например мужской раздел) :
Код:
<ul>
<li><a href="#">Одежда</a></li>
<li><ul>
<li><a href="/man/category/5">Жакеты</a></li>
<li><a href="/man/category/6">Жилеты</a></li>
<li><a href="/man/category/7">Куртки</a></li>
<li><a href="/man/category/8">Футболки</a></li>
</ul></li>
<li><a href="#">Сумки</a></li>
<li><ul>
<li><a href="/man/category/12">Большие сумки</a></li>
<li><a href="/man/category/13">Дорожные сумки</a></li>
<li><a href="/man/category/14">Дорожные косметички</a></li>
<li><a href="/man/category/15">Рюкзаки</a></li>
<li><a href="/man/category/16">Портфели</a></li>
</ul></li>
<li><a href="#">Обувь</a></li>
<li><ul>
<li><a href="/man/category/21">Ботинки</a></li>
<li><a href="/man/category/22">Кроссовки</a></li>
<li><a href="/man/category/23">Лоферы</a></li>
<li><a href="/man/category/24">Сандали</a></li>
<li><a href="/man/category/25">Сапоги</a></li>
</ul></li>
<li><a href="#">Аксессуары</a></li>
<li><ul>
<li><a href="/man/category/29">Брелоки</a></li>
<li><a href="/man/category/30">Гаджеты</a></li>
<li><a href="/man/category/31">Галстуки</a></li>
<li><a href="/man/category/32">Кошельки</a></li>
<li><a href="/man/category/33">Ремни</a></li>
<li><a href="/man/category/34">Головные уборы</a></li>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
<li><ul>
</ul></li>
</ul>
В конце дофига пустых
li и
ul.
У кого опыта по больше, подскажите как правильно строить такое меню.
Может быть мне как то по другому вид/контролер/модель переписать?
В общем я в растерянности.