[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Древовидное меню (MySQL, JavaScript)
ctydent
Привет, друзья!

Пожалуйста, помогите решить интересную задачу :)

Функция

<?php
function
print_recurse($parentid, $lvl) {
global $lvl;
$lvl++;

$result = mysql_query ("select * from `categories` where `parent`='".$parentid."'") or die (mysql_error());
if (mysql_num_rows($result) > 0) {

echo("<UL>");

while ($row = mysql_fetch_array ($result)) {
$ID1 = $row["id"]; ?>

<li><?php echo $row["name"]; ?></li>

<?php
print_recurse($ID1, $lvl);
$lvl--;
}
echo("</UL>");
}
}


print_recurse(0, 0);
?>


из таблицы

CREATE TABLE IF NOT EXISTS `categories` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`parent` int(5) NOT NULL,
`dir` int(1) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM DEFAULT CHARSET=cp1251;


выводит древовидное меню произвольной степени вложенности вида:

-ТОВАРЫ
--Для Авто 12/24V
---навигация
---датчики
---парктроник
---борт/комп "мозги" б/у
---разъёмы "папа-мама"
---OBD 2
--Инструмент
--Радиодетали
--Для Мобильнх
--Платы
---платы печатные
----б/у
---платы материнские
----для компьтеров
----для ноутбуков
---контроллеры
--Провод
...

Как переписать рекурсивную функцию, чтобы в итоге получить раскрывающееся меню из примера: http://sportinfo.ck.ua/menu.html ?

Благодарю за внимание.



Спустя 3 часа, 52 минуты, 12 секунд (19.09.2011 - 15:53) ctydent написал(а):
Help!

Спустя 5 часов, 6 минут, 9 секунд (19.09.2011 - 20:59) redreem написал(а):
Здравствуй друг! За несколько сотен деревянных я тебе подарю скрипт, который это делает! Именно это и именно из такой таблицы. На выходе - ul-li древовидная структура.

Спустя 1 час, 39 минут, 34 секунды (19.09.2011 - 22:39) Nikitian написал(а):
Вроде так, не проверял

<?php
function
print_recurse($parentid, $lvl) {
global $lvl;
static $id = 0;
$lvl++;

$result = mysql_query ("select * from `categories` where `parent`='".$parentid."'") or die (mysql_error());
if (mysql_num_rows($result) > 0) {
echo("<UL id='item".$id."'>");

while ($row = mysql_fetch_array ($result)) {
$id++;
$ID1 = $row["id"]; ?>

<li onclick="$('#item".$id."').toggle();"><?php echo $row["name"]; ?></A></li>

<?php
print_recurse($ID1, $lvl);
$lvl--;
}
echo("</UL>");
}
}


print_recurse(0, 0);
?>

Спустя 9 часов, 26 минут, 13 секунд (20.09.2011 - 08:05) ctydent написал(а):
Спасибо, не работает smile.gif

Спустя 11 минут, 18 секунд (20.09.2011 - 08:17) nugle написал(а):
ctydent
в твоем примере только список, там ничего не открывается... или открывается?

Спустя 21 минута, 35 секунд (20.09.2011 - 08:38) ctydent написал(а):
Моя функция выводит:

<UL>
<li><img
src='/img/dir.jpg'><a href=''>ТОВАРЫ</A></li>

<UL>
<li><img
src='/img/dir.jpg'><a href=''>Для Авто 12/24V</A></li>

<UL>
<li><img
src='/img/dir.jpg'><a href=''>навигация</A></li>
<li><img
src='/img/dir.jpg'><a href=''>датчики</A></li>
<li><img
src='/img/dir.jpg'><a href=''>парктроник</A></li>
<li><img
src='/img/dir.jpg'><a href=''>борт/комп "мозги" б/у</A></li>
<li><img
src='/img/dir.jpg'><a href=''>разъёмы "папа-мама"</A></li>
<li><img
src='/img/dir.jpg'><a href=''>OBD 2</A></li>

</UL>
<li><img
src='/img/dir.jpg'><a href=''>Инструмент</A></li>
...


а надо:

<ul>
<li
id="foldheader">News</li>
<ul
id="foldinglist" style="display:none" style=&{head};>
<li><a
href="">CNN</a></li>
<li><a
href="">ABC News</a></li>
<li><a
href="">Vancouver Sun</a></li>
</ul>

<li
id="foldheader">Games</li>
<ul
id="foldinglist" style="display:none" style=&{head};>
<li><a
href="">GameSpot</a></li>
<li><a
href="">Happy Puppy</a></li>
<li><a
href="">Game Center</a></li>
</ul>

<li
id="foldheader">Software</li>
<ul
id="foldinglist" style="display:none" style=&{head};>
<li><a
href="">outer 1</a></li>
<li><a
href="">outer 2</a></li>
<li
id="foldheader">Nested</li>
<ul
id="foldinglist" style="display:none" style=&{head};>
<li><a
href="">nested 1</a></li>
<li><a
href="">nested 2</a></li>
</ul>
<li><a
href="">outer 3</a></li>
<li><a
href="">outer 4</a></li>
</ul>

<li
id="foldheader">Software</li>
<ul
id="foldinglist" style="display:none" style=&{head};>
<li><a
href="">outer 1</a></li>
<li><a
href="">outer 2</a></li>
<li
id="foldheader">Nested</li>
<ul
id="foldinglist" style="display:none" style=&{head};>
<li><a
href="">nested 1</a></li>
<li><a
href="">nested 2</a></li>
<li
id="foldheader">Nested 2</li>
<ul
id="foldinglist" style="display:none" style=&{head};>
<li><a
href="">nested --</a></li>
<li><a
href="">nested --</a></li>
<li
id="foldheader">Nested 2</li>
</ul>
</ul>
<li><a
href="">outer 3</a></li>
<li><a
href="">outer 4</a></li>
</ul>
</ul>

Спустя 26 минут, 32 секунды (20.09.2011 - 09:05) Renden написал(а):
ctydent
Чет помоему либо ты не выложил все, либо у тя структура не правильная.
нужно 2 таблицы 1 с категориями, 2-я с подкатегориями.
кароч, нужно так:
CREATE TABLE IF NOT EXISTS `categories` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM DEFAULT CHARSET=cp1251;



CREATE TABLE IF NOT EXISTS `part` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`parent` int(5) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM DEFAULT CHARSET=cp1251;


Собственно код:

$query1 = mysql_query("SELECT * FROM `categories` ORDER BY id");
while($row1 = mysql_fetch_assoc($query1))
{
echo '<ul>
<li id="foldheader">'
.$row1['name'].'</li>
<ul id="foldinglist" style="display:none" style=&{head};>'
;

$query2 = mysql_query("SELECT * FROM `part` WHERE parent='".$row1['id']."'");
while($row2 = mysql_fetch_assoc($query2))
echo '<li><a href="#">'.$row2['name'].'</li>';

echo '</ul>';
}

Спустя 14 минут, 8 секунд (20.09.2011 - 09:19) redreem написал(а):
исходная таблица верная и адекватная. мой скрипт позволяет строить дерево по такой таблице неограниченной глубины узлов. была бы это пятиминутная мулька - подарил бы. но это не мулька, а довольно трудозатратная конструкция была. так что предложение в силе. пруф: меню категорий тут

Спустя 5 минут, 24 секунды (20.09.2011 - 09:24) Renden написал(а):
redreem
Цитата
неограниченной глубины узлов.

В таком случае чтоб вывести как надо нужно либо базой крутить типа как в моем примере выше (правда он только на 1 вложеность), либо формировать из базы массив, а потом его foreach-eм крутить.

Спустя 20 минут, 52 секунды (20.09.2011 - 09:45) redreem написал(а):
Renden, дело не в том, что надо, а в том, что эту задачу я уже решил и использовал в своем двиге именно на 100% как спрошено в топике. для передачи кому-то этого скрипта мне полюбас надо полчасика потратить, чтобы вычистить из него корни от двига.

Спустя 2 минуты, 51 секунда (20.09.2011 - 09:48) Renden написал(а):
redreem
Ну сделал - молодец, тут вроде никто и не просил тебя выкладывать свой скрипт smile.gif

Спустя 12 минут, 40 секунд (20.09.2011 - 10:01) redreem написал(а):
Renden, я что-то не видел в правилах форума запрета обсуждения условий передачи материалов. Ваше самолюбие оставьте при себе, вообще не вам изначально информационный посыл предназначается. Раз диалог с вами превращается в биения передних конечностей о грудную клетку, - давайте его прекратим. Засим откланиваюсь.

Спустя 1 час, 23 минуты, 37 секунд (20.09.2011 - 11:24) ctydent написал(а):
Моя просьба о помощи актуальна )

Спустя 34 минуты, 1 секунда (20.09.2011 - 11:58) redreem написал(а):
да нате, кушайтей наздоровье. надеюсь поменять пару имен сами в состоянии. халявщики.
<?php
/*
================================================================
Octopus Engine - by Web syndicate && redreem studio
----------------------------------------------------------------

http://websyndicate.ru http://redreem.ru/
----------------------------------------------------------------
Copyright © 2011 redreem studio | categories.php
================================================================
*/


function getT_categories() {//читаем все каталоги сразу
global $t_categories,$dbase;
$tQuery=$dbase->query("SELECT * FROM categories ORDER BY id,parentId");
while ($tA=$dbase->get_row($tQuery)) {
foreach ($tA as $k=>$v) if ($k!='id') $t_categories[$tA['id']][$k]=$v;
};
}

$deep=2;//выставляем глубину погружения в дерево
$parentId=0;//выставляем id родителя ветки

//---- построение дерева категорий

$numcats=count($t_categories);
for ($i=0; $i<=$numcats; $i++) $numnodes[$i]=0;

$i=0; foreach ($t_categories as $id=>$cA) {$i=$i+1;
$numnodes[$cA['parentId']]++;
$pattern[0] = '/'.chr(32).'/';
$replace[0] = ' ';
$pattern[1] = '/-/';
$replace[1] = '&#8209';
$cA['name'] = preg_replace ($pattern, $replace, $cA['name']);
$tree[$cA['parentId']][$numnodes[$cA['parentId']]]['name']=$cA['name'];
$tree[$cA['parentId']][$numnodes[$cA['parentId']]]['id']=$id;
$tree[$cA['parentId']][$numnodes[$cA['parentId']]]['stat']=$cA['stat'];
}

//---- линковка категорий
function putlevel($parentId,$level) {
global $numnodes,$tree,$categorieslist,$deep;
$categorieslist.='<ul>';
for ($i=1; $i<=$numnodes[$parentId]; $i++) {
if (($numnodes[$tree[$parentId][$i]['id']]>0) AND ($level<$deep)) {
$categorieslist.='<li><a href="/'.$modulname.'?cat='.$tree[$parentId][$i]['id'].'">'.$tree[$parentId][$i]['name'].'</a>';
putlevel($tree[$parentId][$i]['id'],$level+1);
} else {
$categorieslist.='<li><a href="/'.$modulname.'?cat='.$tree[$parentId][$i]['id'].'">'.$tree[$parentId][$i]['name'].'</a>';
}
$categorieslist.='</li>';
}
$categorieslist.='</ul>';
}
$categorieslist='';
getT_categories();
putlevel($parentId,0);
//в $categorieslist получаем дерево
?>


кто будет кричать что не работает - идите к бабушке. все работает.

Спустя 6 месяцев, 29 дней, 22 часа, 8 минут, 41 секунда (20.04.2012 - 10:07) Cream написал(а):
Не выходит поддставить сои данные выдает ошибку в $numnodes[$cA['parentId']]++; строке.(Ошибка модэли категорий, типо нет такого масива)

Мое меню:(Древовидное меню, с отступами для подпунктов и добавлением пунктов/подпунктов из админки, поэтому хотелось бы сохранить эту функцию.)
<div id="a11">
<h2>
Каталог</h2>
<div
class="menu_links">
<?php
foreach ($categories as $cat) : ?>
<?php
echo HTML::anchor('catalog/cat/c' . $cat->id, $cat->title, array('class' => ($select == $cat->id ? 'select' : ''), 'style' => 'display:list-item;margin-left:' . ($cat->lvl * 20) . 'px')) ?>
<?php
endforeach ?>
</div>

Контроллер:
<?php defined('SYSPATH') or die('No direct script access.');
/*
* Виджет "Меню сайта"
*/

class Controller_Widgets_Menu extends Controller_Widgets {

public $template = 'widgets/w_menu'; // Шаблон виждета

public function action_index()
{

$select = Request::initial()->param('cat');

// Получаем список категорий
$categories = ORM::factory('category');
$categories = $categories->fulltree()->as_array();
$this->template->categories = $categories;
$this->template->select = $select;
}

}

Модэль:
<?php defined('SYSPATH') or die('No direct script access.');

class Model_Category extends ORM_MPTT {

protected $_has_many = array(
'products' => array(
'model' => 'product',
'through' => 'products_categories',
),
);


public function rules()
{
return array(
'title' => array(
array('not_empty'),
),
);

}

public function labels()
{
return array(
'title' => 'Категория',
);

}

public function filters()
{
return array(
TRUE => array(
array('trim'),
),

'title' => array(
array('strip_tags'),
),
);

}
}

Это моя таблица Категорий:
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`parent_id` int(11) NOT NULL,
`lft` int(11) NOT NULL,
`rgt` int(11) NOT NULL,
`lvl` int(11) NOT NULL,
`scope` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=23 ;


Спустя 8 минут, 26 секунд (20.04.2012 - 10:15) redreem написал(а):
ну как минимум сходу видно, что у тебя в таблице поле по-другому называется.

напиши

$numnodes[$cA['parent_id']]++


дальше скажешь если ошибка будет
массив $cA - это по сути строка из таблицы. поэтому проверь все соответствия имен.

Спустя 1 час, 47 минут, 54 секунды (20.04.2012 - 12:03) Cream написал(а):
Это то понятно я менял все это как вы и написали. Вытоге посе замены всех parentId на parent_id
Ошибка Undefined variable: t_categories в этой строке:
$numcats=count($t_categories);

если меняю все t_categories на categories то опять ошибка Cannot use object of type Model_Category as array в строке
$numnodes[$cA['parent_id']]++

Спустя 2 часа, 31 минута, 44 секунды (20.04.2012 - 14:35) redreem написал(а):
вот эта функция:

function getT_categories() {//читаем все каталоги сразу
global $t_categories,$dbase;
$tQuery=$dbase->query("SELECT * FROM categories ORDER BY id,parentId");
while ($tA=$dbase->get_row($tQuery)) {
foreach ($tA as $k=>$v) if ($k!='id') $t_categories[$tA['id']][$k]=$v;
};
}


должна отрабатывать предварительно - она копию таблицы категорий создает в массиве $t_categories. если Undefined variable: t_categories, значит эта функция не вызывалась. или как вариант - в твоей функции построения дерева не указано global $t_categories

Спустя 20 часов, 3 минуты, 36 секунд (21.04.2012 - 10:39) Cream написал(а):
Если можно поподробней, что требуеться сделать? Потому что я в контроллере обьявляю переменную $t_categories всеравно выдает ошибку на 2 строки ниже там где foreach на него и ругаеться.

Спустя 26 минут, 42 секунды (21.04.2012 - 11:05) redreem написал(а):
в контроллере у тебя структура $t_categories получается иная, нежели та, которая требуется. воспользуйся указанной функцией для заполнения $t_categories.

Спустя 59 минут, 23 секунды (21.04.2012 - 12:05) Cream написал(а):
Чот невыходит ничего. Незнаю как это сделать.(уже куда только не тулил и что только не менял. sad.gif )

Спустя 16 минут, 53 секунды (21.04.2012 - 12:22) redreem написал(а):
ну выложи на хостинг, дай FTP доступ, я посмотрю. так не поймешь что у тебя там не работает.

Спустя 34 секунды (21.04.2012 - 12:22) redreem написал(а):
и аську в личку, если дальше обсуждать
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.