создаю древовидное меню.
структура таблицы
/*
`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", я так понимаю от него зависит сворачивание и разворачивание меню
да, и структура таблицы у тебя такая же, как у меня в первом посте или что-то добавить еще?
спасибо
узел 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:
выводит :
только еще точечки перед разделами и иерархия дерева.
что-то не так?
может нужно еще подключить какой-то файл с css?
спасибо
<!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
Стили не повлияют на вид.
А ты все правильно составил?
Здесь из предыдущего запроса передается ID родителя, чтобы он уже выбрал детей, и так по рекурсии.
UPDATE
Щас у себя проверю еще раз
Стили не повлияют на вид.
А ты все правильно составил?
$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? чтобы сворачивать, разворачивать родителей кроме выделения?
спасибо
заработатло, выделяет - родителя с детьми и детей по отдельности.
а как изменить код 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
А вот с разворачиванием подумай уже сам. Я скинул основу на 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'
Делай.
[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. Ставь эхи, проверяй. Если приходит неопределенная переменная, проверяй что возвращается. Поставь фаербаг блин.
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"
вы ошибочно написали утром здесь
утренние советы не помогли
спасибо за помощь
Krevedko
файл прикрепил в теме "древовидное меню, родительский id в ajax"
вы ошибочно написали утром здесь
утренние советы не помогли
спасибо за помощь