Пожалуйста, помогите решить интересную задачу :)
Функция
<?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 написал(а):
Спасибо, не работает

Спустя 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-я с подкатегориями.
кароч, нужно так:
Собственно код:
Чет помоему либо ты не выложил все, либо у тя структура не правильная.
нужно 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
Ну сделал - молодец, тут вроде никто и не просил тебя выкладывать свой скрипт
Ну сделал - молодец, тут вроде никто и не просил тебя выкладывать свой скрипт

Спустя 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] = '‑';
$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 написал(а):
ну как минимум сходу видно, что у тебя в таблице поле по-другому называется.
напиши
дальше скажешь если ошибка будет
массив $cA - это по сути строка из таблицы. поэтому проверь все соответствия имен.
напиши
$numnodes[$cA['parent_id']]++
дальше скажешь если ошибка будет
массив $cA - это по сути строка из таблицы. поэтому проверь все соответствия имен.
Спустя 1 час, 47 минут, 54 секунды (20.04.2012 - 12:03) Cream написал(а):
Это то понятно я менял все это как вы и написали. Вытоге посе замены всех parentId на parent_id
Ошибка Undefined variable: t_categories в этой строке:
если меняю все t_categories на categories то опять ошибка Cannot use object of type Model_Category as array в строке
Ошибка 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 написал(а):
вот эта функция:
должна отрабатывать предварительно - она копию таблицы категорий создает в массиве $t_categories. если Undefined variable: t_categories, значит эта функция не вызывалась. или как вариант - в твоей функции построения дерева не указано global $t_categories
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 написал(а):
Чот невыходит ничего. Незнаю как это сделать.(уже куда только не тулил и что только не менял.
)

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