Tree

Подскажите как решить задачку. Необходимо вывести структурное меню (типа tree). Имеются таблицы первого и второго уровней, с обозначениями (id, id_parent). Как можно вывести такое меню с возможностью перехода к нужной таблице посредством PHP? Я понимаю что это вопрос можно охарактеризовать как вопрос по PHP, но ни на одном форуме по PHP я не смог найти нужную информацию. Помогите разобраться в проблеме.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Классическая задача рекурсии

Классическая задача рекурсии.
На этом примере начинается изучение рекурсивных запросов : ))
Вот здесь пример с графом можете брать целиком, заменив link на id_parent.
depth - это level (уровень, глубина) дерева, увеличивается на 1 для каждого следующего вложения;
data - любые данные, которые вы храните и хотите извлечь из дерева

Блин, торможу. То есть, если

Блин, торможу. То есть, если для простого вывода таблицы я использую:

<?php 
// database access parameters 
// alter this as per your configuration 
$host "192.***"
$user "user"
$pass "123"
$db "ST"
$table"project";

// open a connection to the database server 
$connection pg_pconnect ("host=$host dbname=$db user=$user password=$pass"); 
if (!
$connection

die(
"Could not open connection to database server"); 

$query "SELECT id,id_parent,name,org,date FROM $table ORDER BY id_parent";
$result pg_query($connection$query) or die("Error in query: $query.
pg_last_error($connection));
$result pg_query($query) or die('Query failed: ' pg_last_error());

echo 
"<table width="."100%"." border="."1".">"
echo 
"<tbody>";
echo 
"<tr>";

echo 
"<td>";
echo 
"id";
echo 
"</td>";
echo 
"<td>";
echo 
"id_parent";
echo 
"</td>";
echo 
"<td>";
echo 
"Name";
echo 
"</td>";
echo 
"<td>";
echo 
"Org";
echo 
"</td>";

echo 
"</tr>";
while (
$row pg_fetch_row($result))
{
echo 
"<tr>";

echo 
"<td>";
echo 
"$row[0]";
echo 
"</td>";
echo 
"<td>";
echo 
"$row[1]";
echo 
"</td>";
echo 
"<td>";
echo 
"$row[2]";
echo 
"</td>";
echo 
"<td>";
echo 
"$row[3]";
echo 
"</td>";

echo 
"</tr>";
}

echo 
"</table>";

// get the number of rows in the resultset 
$rows pg_num_rows($result); 
echo 
"There are currently $rows records in the database.";
// close database connection 
pg_close($connection); 
?>

то для вывода меню - нужно написать следующее ->?????

WITH RECURSIVE search_graph(id, id_parent, name, org, date, depth, path, cycle) AS (
        SELECT g.id, g.id_parent,  g.name, g.org, g.date, 1,
          ARRAY[g.id],
          false
        FROM graph g
      UNION ALL
        SELECT g.id, g.id_parent,  g.name, g.org, g.date, sg.depth + 1,
          path || g.id,
          g.id = ANY(path)
        FROM graph g, search_graph sg
        WHERE g.id = sg.link AND NOT cycle
)
SELECT * FROM search_graph;

Нет. Для вывода нужно написать другое.

Этот запрос нужно подставить в строку
$query = "SELECT...";

А выводить рекурсивное дерево нужно так же рекурсивно.
Что-нибудь типа:

<?php
function print_tree(&$res, &$row$lvl=1)
{   if (
$row pg_fetch_assoc($res)) {
        if (
$row['level'] = $lvl) {
            echo 
'<ul>';
            while (
$row['level'] = $lvl) {
                echo 
"<li>{$row['description']}";  -- описаниеили что хотите отразить в списке (название)
                    
print_tree($res$row$lvl+1);  -- рекурсивно выводим поддерево текущего узла
                
echo '</li>';
                }
            echo 
'</ul>';
            }
        }
}

// и вызов:
$row 0;
print_tree($result$row);
?>

?

То есть примерно так????:

<?php
// open a connection to the database server 
$connection pg_pconnect ("host=$host dbname=$db user=$user password=$pass"); 
if (!
$connection

die(
"Could not open connection to database server"); 


// generate and execute a query 


$query "SELECT id,id_parent FROM $table ORDER BY id_parent";



$result pg_query($connection$query) or die("Error in query: $query.
pg_last_error($connection));


$result pg_query($query) or die('Query failed: ' pg_last_error());






function 
print_tree(&$res, &$row$lvl=1)
{   if (
$row pg_fetch_assoc($res)) {
        if (
$row['level'] = $lvl) {
            echo 
'<ul>';
            while (
$row['level'] = $lvl) {
                echo 
"<li>{$row['id']}";  -- описаниеили что хотите отразить в списке (название)
                    
print_tree($res$row$lvl+1);  -- рекурсивно выводим поддерево текущего узла
                
echo '</li>';
                }
            echo 
'</ul>';
            }
        }
}

// и вызов:
$row 0;

echo 
"($result$row)";
?>
;

При таком коде вообще ничего

При таком коде вообще ничего не выводится - белый экран.... :

<?php
// open a connection to the database server 
$connection pg_pconnect ("host=$host dbname=$db user=$user password=$pass"); 
if (!
$connection

die(
"Could not open connection to database server"); 


// generate and execute a query 

WITH RECURSIVE search_graph(idid_parentnameorgdatedepthpathcycle) AS (
        
SELECT g.idg.id_parent,  g.nameg.orgg.date1,
          ARRAY[
g.id],
          
false
        FROM graph g
      UNION ALL
        SELECT g
.idg.id_parent,  g.nameg.orgg.datesg.depth 1,
          
path || g.id,
          
g.id ANY(path)
        
FROM graph gsearch_graph sg
        WHERE g
.id sg.link AND NOT cycle
)
//SELECT * FROM search_graph;
//$query = "SELECT id,id_parent FROM $table ORDER BY id_parent";

$query "SELECT * FROM search_graph";

$result pg_query($connection$query) or die("Error in query: $query.
pg_last_error($connection));


$result pg_query($query) or die('Query failed: ' pg_last_error());


function 
print_tree(&$res, &$row$lvl=1)
{   if (
$row pg_fetch_assoc($res)) {
        if (
$row['level'] = $lvl) {
            echo 
'<ul>';
            while (
$row['level'] = $lvl) {
                echo 
"<li>{$row['id']}";  -- описаниеили что хотите отразить в списке (название)
                    
print_tree($res$row$lvl+1);  -- рекурсивно выводим поддерево текущего узла
                
echo '</li>';
                }
            echo 
'</ul>';
            }
        }
}

// и вызов:
$row 0;
echo 
print_tree($result$row);
?>

- - -

Народ, ну помогите же вывести эту менюшку. Уже перепробовал наверное все что мог. Недостаточно у меня пока знаний.... :(

Беру код такой, и ни фига не получается.... :'( :

<?php 

// database access parameters 
// alter this as per your configuration 
$host "192***"
$user "user"
$pass "123"
$db "ST"
$table"project";


// open a connection to the database server 
$connection pg_pconnect ("host=$host dbname=$db user=$user password=$pass"); 
if (!
$connection

die(
"Could not open connection to database server"); 


// generate and execute a query 

WITH RECURSIVE search_graph(idid_parentnameorgdatedepthpathcycle) AS (
        
SELECT g.idg.id_parent,  g.nameg.orgg.date1,
          ARRAY[
g.id],
          
false
        FROM graph g
      UNION ALL
        SELECT g
.idg.id_parent,  g.nameg.orgg.datesg.depth 1,
          
path || g.id,
          
g.id ANY(path)
        
FROM graph gsearch_graph sg
        WHERE g
.id sg.link AND NOT cycle
)
//SELECT * FROM search_graph;
//$query = "SELECT id,id_parent FROM $table ORDER BY id_parent";

$query "SELECT * FROM search_graph";

$result pg_query($connection$query) or die("Error in query: $query.
pg_last_error($connection));


$result pg_query($query) or die('Query failed: ' pg_last_error());


function 
print_tree(&$res, &$row$lvl=1)
{   if (
$row pg_fetch_assoc($res)) {
        if (
$row['level'] = $lvl) {
            echo 
'<ul>';
            while (
$row['level'] = $lvl) {
                echo 
"<li>{$row['id']}";  -- описаниеили что хотите отразить в списке (название)
                    
print_tree($res$row$lvl+1);  -- рекурсивно выводим поддерево текущего узла
                
echo '</li>';
                }
            echo 
'</ul>';
            }
        }
}

// и вызов:
$row 0;
echo 
print_tree($result$row);

// get the number of rows in the resultset 
$rows pg_num_rows($result); 
echo 
"There are currently $rows records in the database.";
// close database connection 
pg_close($connection); 
?>

Я вывел списком id,

Я вывел списком id, parent_id... У меня получился структурированный список по типу
1
1.1
1.2
1.3
2
3
...

Возможно ли сделать этот список типа tree? То есть, показывалось бы
1
2
3
Но при нажатии на 1 - получалось
1
1.1
1.2
1.3
2
3
?????

С помощью CSS

Хорошо, пол дела уже сделано : )
Вы получили структурированные (вложенные) списки.
Превратить их в меню любого вида (горизонтальные/вертикальные/раскрывающиеся/выпадающие) можно с помощью CSS. Сам список при этом менять будет не нужно!
См. пример здесь.
Объяснения и "учебники" по CSS-меню можно поискать в google.

Сделал менюшку (Ура!

Сделал менюшку (Ура! Получилось. Спасибо всем за помощь). Теперь при выборе пункта меню - получается такая ссылка:
http://docum/table2.php?id=3&id_parent=0
При переходе на которую - страница не найдена.
Я так понимаю - мне нужно создать еще страницу, гду в запросe SELECT отлавливать id и id_parent. Подскажите, нужно ли как то обозначать эти переменные, или просто сделать страницу с таблицой, где в SELECT будет прописано id=*** id_parent=***??

Проще

Наверное проще в дереве меню хранить адреса страниц.
Тогда в функции print_tree, где выводится элемент списка сразу делать нужную ссылку:

<?php...
    echo 
"<li><a href='{$row['address']}'>{$row['description']}</a>
    ...
?>

где address в БД это строка вида "host.ru/path/document?param1=???&param2=..." - путь к страничце со всеми необходимыми параметрами

Так пойдет?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023