[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ошибка в коде древовидного меню
skolozhabskiy
добрый день,

создаю древовидное меню.

структура таблицы


/*
`id` - идентификатор узла
`parent_id` - родительский узел
`title` - заголовок узла
*/

$sql = "CREATE TABLE `treemenu` (
`id` INT(11) NOT NULL auto_increment,
`parent_id` INT(11) NOT NULL,
`title` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
)"
;


код php


$content = '';
$parent = 0;
$parent_stack = array();

// $items contains the results of the SQL query
$query = "SELECT * FROM treemenu";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result)) {
$items[] = $row;
}

$children = array();
foreach ( $items as $item )
$children[$item['parent_id']][] = $item;

while ($option = each($children[$parent]) || ($parent > 0)) {
if ( !empty($option)) {
// есть дети
if ( !empty( $children[$option['value']['id']] ) ) {
$content .= '<li>'.$option['value']['title'].'</li>';
$content .= '<ul>';
array_push( $parent_stack, $parent );
$parent = $option['value']['id'];
}
// нет детей
else
$content .= '<li>'.$option['value']['title'].'</li>';
}
// текущий родитель не имеет детей
else {
$content .= '</ul>';
$parent = array_pop($parent_stack);
}
}

echo $content;


листинги ехо массивов в аттач.
в результате ничего не выводится, хотя вроде даже в цикле есть значения в $option.

вопрос: как визуально в, например, test.php вывести массив в виде дерева?
где ошибкав приведенном коде?

спасибо



Спустя 2 минуты, 20 секунд (16.05.2011 - 11:09) Админ написал(а):
Гы. Поповским духом повеяло
Цитата
while ($row = mysql_fetch_array($result)) {
$items[] = $row;
}

так и не будет

Спустя 1 минута, 28 секунд (16.05.2011 - 11:10) skolozhabskiy написал(а):
Админ - как-то странно вы себя ведете?
если есть замечания или вы видете ошибки, то укажите на них, а реплики подобные "поповского духа", если вы професионал просто неприлично здесь писать. и по делу:

что так и не будет? массив же не пустой, там все заносится. посмотрите приложенный файл

спасибо

Спустя 1 час, 48 минут, 2 секунды (16.05.2011 - 12:58) skolozhabskiy написал(а):
может кто все же подскажет в чем проблема?

спасибо

Спустя 2 минуты, 4 секунды (16.05.2011 - 13:00) sharki написал(а):
Держи мою наработку.
/*
* Формируем список категорий \ подкатегорий
*/


function wall($id) {
global $cat;
$query = "SELECT *
FROM `catalog`
WHERE `parent_id` = "
.$id."
"
;

$result = mysql_query($query);
$num = mysql_num_rows($result);
if($num <= 0)
return;

$i = 0;
$cat .= '<ul id="'.$id.'">';
while ($row = mysql_fetch_assoc($result)) {
$cat .= '<li class="folder" id="'.$row['id'].'">'.$row['name'];
wall($row['id']);
$cat .= '</li>';

}
$cat .= "</ul>";
}



$query = "SELECT `id`,`name`
FROM `catalog`
WHERE `parent_id` = 0
"
;

$result = mysql_query($query);
$num = mysql_num_rows($result);
$i = 0;
$cat = '<ul>';
while ($row = mysql_fetch_assoc($result)) {
$cat .= '<li class="folder" id="'.$row['id'].'">'.$row['name'];
wall($row['id']);
$cat .= '</li>';
}
$cat .= "</ul>";

echo $cat;

Спустя 8 минут, 41 секунда (16.05.2011 - 13:09) skolozhabskiy написал(а):
спасибо, сейчас попробую

Спустя 2 минуты, 28 секунд (16.05.2011 - 13:11) skolozhabskiy написал(а):
вывел:

узел 1
узел 1_1
узел 1_2
узел 2
узел 2_1
узел 2_2
узел 3
узел 4
узел 4_1
узел 4_2
узел 4_2_1
узел 4_2_2
узел 4_3
зел 4_3_1
зел 4_3_2
узел 4_4

а как жальше это превратить в нормальное меню?
можешь скинуть class="folder", я так понимаю от него зависит сворачивание и разворачивание меню

да, и структура таблицы у тебя такая же, как у меня в первом посте или что-то добавить еще?

спасибо

Спустя 2 минуты, 21 секунда (16.05.2011 - 13:14) sharki написал(а):
skolozhabskiy
Он не мог такое вывести, у меня все нормально выводится, как полагается, деревом...

Данный скрипт используется у меня на сайте.

Может неправильная структура в бд сейчас?

Спустя 3 минуты, 44 секунды (16.05.2011 - 13:18) sharki написал(а):
У меня там не сворачиваие идет, а выделение. Можно сделать и сворачивание, если есть хоть какие то знания по JS, структура позволяет.
$(document).ready(function() {
// выделение
var this_id;
$("ul li").click(function(even) {
even.stopPropagation();
id = $(this).attr("id");
if(typeof(this_id) != "undefined") {
$("#"+this_id).attr({
style : ''
});
}
$("#"+id).attr({
style : ' background-color: #FFE7A1;'
});
this_id = id;
$("#cat_id").val("");
$("#cat_id").val(id);
});
});

Спустя 4 минуты, 16 секунд (16.05.2011 - 13:22) skolozhabskiy написал(а):
вот полный код на странице php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
title>Untitled Document</title>
</
head>

<
body>
<?php

$dbhost = 'localhost';
$dbuser = 'xxx';
$dbpass = 'xxxx';
$dbname = 'xxxxx';
// $db = &new MySQL($host,$user,$pass,$name);

/* Database Connection */

$link = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql');
if($link) {
$select_db = mysql_select_db($dbname);
if(!$select_db) die ('No DB connection');
}
else {
die('No DB connection');
}
mysql_query("SET names UTF8");
/* Ending - Database Connection */
/*
* Формируем список категорий \ подкатегорий
*/


function wall($id) {
global $cat;
$query = "SELECT *
FROM `treemenu`
WHERE `parent_id` = "
.$id."
"
;

$result = mysql_query($query);
$num = mysql_num_rows($result);
if($num <= 0)
return;

$i = 0;
$cat .= '<ul id="'.$id.'">';
while ($row = mysql_fetch_assoc($result)) {
$cat .= '<li class="folder" id="'.$row['id'].'">'.$row['title'];
wall($row['id']);
$cat .= '</li>';

}
$cat .= "</ul>";
}



$query = "SELECT `id`,`title`
FROM `treemenu`
WHERE `parent_id` = 0
"
;

$result = mysql_query($query);
$num = mysql_num_rows($result);
$i = 0;
$cat = '<ul>';
while ($row = mysql_fetch_assoc($result)) {
$cat .= '<li class="folder" id="'.$row['id'].'">'.$row['title'];
wall($row['id']);
$cat .= '</li>';
}
$cat .= "</ul>";

echo $cat;
?>

</body>
</
html>


выводит :


узел 1
узел 1_1
узел 1_2
узел 2
узел 2_1
узел 2_2
узел 3
узел 4
узел 4_1
узел 4_2
узел 4_2_1
узел 4_2_2
узел 4_3
зел 4_3_1
зел 4_3_2
узел 4_4

только еще точечки перед разделами и иерархия дерева.

что-то не так?
может нужно еще подключить какой-то файл с css?

спасибо

Спустя 5 секунд (16.05.2011 - 13:22) sharki написал(а):
skolozhabskiy
Стили не повлияют на вид.
А ты все правильно составил?

$query = "SELECT * 
FROM `catalog`
WHERE `parent_id` = "
.$id."
"
;


Здесь из предыдущего запроса передается ID родителя, чтобы он уже выбрал детей, и так по рекурсии.



UPDATE

Щас у себя проверю еще раз

Спустя 3 минуты, 33 секунды (16.05.2011 - 13:25) sharki написал(а):
Щас скопипастил твой код, который веше, вот что у меня получилось

Спустя 1 минута, 11 секунд (16.05.2011 - 13:27) skolozhabskiy написал(а):
наподобие и у меня так выводит, ак ак сделать, чтобы это вид сворачивался и разворачивался как древовидном меню?

объединил :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
title>Untitled Document</title>

<
script>
$(document).ready(function() {
// выделение
var this_id;
$("ul li").click(function(even) {
even.stopPropagation();
id = $(this).attr("id");
if(typeof(this_id) != "undefined") {
$("#"+this_id).attr({
style : ''
});
}
$("#"+id).attr({
style : ' background-color: #FFE7A1;'
});
this_id = id;
$("#cat_id").val("");
$("#cat_id").val(id);
});
});
</
script>
</
head>

<
body>
<?php

$dbhost = 'localhost';
$dbuser = 'xxx';
$dbpass = 'xxx';
$dbname = 'xxxxxx';
// $db = &new MySQL($host,$user,$pass,$name);
/* Database Connection */

$link = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql');
if($link) {
$select_db = mysql_select_db($dbname);
if(!$select_db) die ('No DB connection');
}
else {
die('No DB connection');
}
mysql_query("SET names UTF8");
/* Ending - Database Connection */
/*
* Формируем список категорий \ подкатегорий
*/


function wall($id) {
global $cat;
$query = "SELECT *
FROM `treemenu`
WHERE `parent_id` = "
.$id."
"
;

$result = mysql_query($query);
$num = mysql_num_rows($result);
if($num <= 0)
return;

$i = 0;
$cat .= '<ul id="'.$id.'">';
while ($row = mysql_fetch_assoc($result)) {
$cat .= '<li class="folder" id="'.$row['id'].'">'.$row['title'];
wall($row['id']);
$cat .= '</li>';

}
$cat .= "</ul>";
}



$query = "SELECT `id`,`title`
FROM `treemenu`
WHERE `parent_id` = 0
"
;

$result = mysql_query($query);
$num = mysql_num_rows($result);
$i = 0;
$cat = '<ul>';
while ($row = mysql_fetch_assoc($result)) {
$cat .= '<li class="folder" id="'.$row['id'].'">'.$row['title'];
wall($row['id']);
$cat .= '</li>';
}
$cat .= "</ul>";

echo $cat;
?>

</body>
</
html>


но пока не хочет сворачиваться дерево, меню как такового нет.
в чем ошибка?

спасибо

Спустя 2 минуты, 5 секунд (16.05.2011 - 13:29) sharki написал(а):
skolozhabskiy
Еще раз
Цитата
У меня там не сворачиваие идет, а выделение. Можно сделать и сворачивание, если есть хоть какие то знания по JS, структура позволяет.


Я показал скриншот как у меня выглядит твой же код, но вот с такой структурой БД


Пройдись по посту еще раз, и посмотри что у тебя может быть неправильно.

И плюс ко всему, тебе надо подключить Jquery на странице

Спустя 4 минуты, 2 секунды (16.05.2011 - 13:33) skolozhabskiy написал(а):
как здесь картинку вывести я покажу структуру свой таблицы

заработатло, выделяет - родителя с детьми и детей по отдельности.

а как изменить код query? чтобы сворачивать, разворачивать родителей кроме выделения?



спасибо

Спустя 1 минута, 4 секунды (16.05.2011 - 13:34) sharki написал(а):
Нажми внизу всей странице на кнопку ОТВЕТИТЬ

Спустя 5 минут, 40 секунд (16.05.2011 - 13:39) skolozhabskiy написал(а):
структура таблицы, да вроде все также. теперь проблема как сворачивать и разворачивать это дерево и линки добавить.

Спустя 3 минуты, 1 секунда (16.05.2011 - 13:42) sharki написал(а):
Всё вроде как надо, значит всё должно выводится как надо, древовидным списком.

А вот с разворачиванием подумай уже сам. Я скинул основу на JQUERY, попробуй сам. Обычно тут помогают а не пишут за других.

Если какие то проблемы будут при написание подскажем.


PS не забудь подключить сам JQUERY

Спустя 7 часов, 42 минуты, 32 секунды (16.05.2011 - 21:25) skolozhabskiy написал(а):
вот так я получаю родительский идентификатор, но вот передать его в аякс не удается:

  <?php
?>

<script type="text/javascript">
$(document).ready(function() {
// выделение
var this_id;
var parent_id = <?php echo $_SESSION['parent_id']; ?>;


$("ul li").hover(function(event) {
event.stopPropagation();
id = $(this).attr("id");

if(typeof(this_id) != "undefined") {
$("#"+this_id).attr({
style : ''
});
}
/* $("#"+id).attr({
style : 'background-color: #FFE7A1; cursor:pointer;'
}); */
// $("#cat_id").val("");
// $("#cat_id").val(id);

$.ajax({
url: 'tree_menu.php',
type: 'GET',
cache: false,
data:{selected_id : this_id},
success: function(data) {
$('#results').html($('#results', data));
//alert(data);
}

}
);

// $("ul li").hover(function(event) {
// event.stopPropagation();
// id = $(this).attr("id");


if (parent_id == 0) {
$("#"+id).attr({
style : 'background-color: #ff0000;'
});
}
else {
$("#"+id).attr({
style : 'background-color: #FFE7A1;'
});
}
//});

this_id = id;
});
});
</
script>

<
div id="results">
<?php

if (!isset($_GET['selected_id'])) {
$_GET['selected_id'] = null;
}
$selected_id = isset($_GET['selected_id']) ? $_GET['selected_id'] : null;

if (isset($_GET['selected_id'])) {
$query = "SELECT `parent_id` FROM `treemenu` WHERE `id`=".$_GET['selected_id'];
$result = mysql_query($query);
$order = mysql_fetch_assoc($result);
$_SESSION['parent_id'] = $order['parent_id'];
echo '<pre>';
print_r($order['parent_id']);
}
?>

<?php
echo $_GET['selected_id']; ?></div>
<?
?>



в чем ошибка. спасибо

Спустя 4 часа, 39 минут, 34 секунды (17.05.2011 - 02:05) skolozhabskiy написал(а):
в текстовый редактор свободно копируется, а потом в php

Спустя 6 часов, 19 минут, 1 секунда (17.05.2011 - 08:24) Krevedko написал(а):
свободно ? у меня вот
[url=http://s010.radikal.ru/i311/1105/ce/5235232c8ccb.jpg]
http://s010.radikal.ru/i311/1105/ce/5235232c8ccb.jpg[/url]

Посмотрел утром свежим незамыленным взглядом.
1) Убери пхп код в отдельный файл. Так как у тебя сейчас -делают только говнокодеры. Передавай данные лучше методом POST а не GET
2) Убери массив, раз тебе нужно получить из аякса только одно значение.

Итого у тебя должно быть два файла.
Первый с чистым хтмл-кодом со вставками ява-скрипта
Второй-Чистый пхп без всяких унылых div и прочего, они там в пень не нужны. На него ты ссылаешься тут url: 'tree_menu.php'
Делай.

Спустя 2 минуты, 28 секунд (17.05.2011 - 08:26) Krevedko написал(а):
непонятно зачем стопицот проверок в пхп

if (!isset($_GET['selected_id'])) { $_GET['selected_id'] = null; } $selected_id = isset($_GET['selected_id']) ? $_GET['selected_id'] : null; if (isset($_GET['selected_id'])) {


достаточно if (isset($_GET['selected_id'])) {
а лучше POST. Ставь эхи, проверяй. Если приходит неопределенная переменная, проверяй что возвращается. Поставь фаербаг блин.

Спустя 1 час, 40 минут, 59 секунд (17.05.2011 - 10:07) skolozhabskiy написал(а):
доброе утро

Krevedko
файл прикрепил в теме "древовидное меню, родительский id в ajax"
вы ошибочно написали утром здесь
утренние советы не помогли

спасибо за помощь
Быстрый ответ:

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