Меню типа tree в PHP из PostgreSQL

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Kukaramba
проходил мимо
Сообщения: 8
Зарегистрирован: 2010-05-03 17:50:30

Меню типа tree в PHP из PostgreSQL

Непрочитанное сообщение Kukaramba » 2010-05-03 17:57:42

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

Древовидный список
Есть запрос, вида:

Код: Выделить всё

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body><?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(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 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); 
?></body></html>

[/html]
Знаю, что запрос на вывод древовидного построения таблиц имеет вид:

Код: Выделить всё

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;


для вывода

Код: Выделить всё

[php]<?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]
Тему взял отсюда: http://postgresql.ru.net/manual/queries-with.html
Помогите сделать эту менюшку. Я уже весь интернет облазил.... :( :( :(

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
ADRE
майор
Сообщения: 2641
Зарегистрирован: 2007-07-26 8:53:49
Контактная информация:

Re: Меню типа tree в PHP из PostgreSQL

Непрочитанное сообщение ADRE » 2010-05-03 18:05:28

1) можно сделать массив из всех таблиц, потом foreach или while соответственно вытягивать нужное - минимум забпросов к бд
2) сделать один цыкл через главные категории, а потом каждым запросом вытягивать по айдишнику родителя нужное
3) набрать в google: создание древовидного меню на php
//del

Kukaramba
проходил мимо
Сообщения: 8
Зарегистрирован: 2010-05-03 17:50:30

Re: Меню типа tree в PHP из PostgreSQL

Непрочитанное сообщение Kukaramba » 2010-05-03 18:27:22

Я нашел информацию. Вот только беда в одном. Я знаю как получить меню в SQL запросе в PostgreSQL. Знаю как выполнить подключение к базе через PHP. Но вот связать это не могу. По поводу погуглить - уже. Код, представленный выше и есть последствие поиска через гугл.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Меню типа tree в PHP из PostgreSQL

Непрочитанное сообщение ProFTP » 2010-05-04 6:35:11

ваш вопрос про PostgreSQL?

в PostgreSQL есть дополнение для работы с деревом на уровне хранилица, можете погуглить... еще есть NestedSet и т.д. и т.п.

я так понял что вы спрашвиаете вывод с php?
нужно вывести родителей вверх до конца дерева... в ближайшей ветке в которой находиться данная ветка вывести все под ветки?? (т.к. на lissyara.su)
я бы вывел все подветкии вверх до конца дерева, а ближайщие ветки одинм запросом... (+ добавил бы псевдо кэширование, например, memcache)

или нужно вывести все дерево со всем ветками в виде иерархии?

я не знаю что такое:

Код: Выделить всё

depth, path, cycle
тут довольно странно:

Код: Выделить всё

                    print_tree($res, $row, $lvl+1);  -- рекурсивно выводим поддерево текущего узла
т.е. просто увеличивается вверх...

ну так а что не получается?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Kukaramba
проходил мимо
Сообщения: 8
Зарегистрирован: 2010-05-03 17:50:30

Re: Меню типа tree в PHP из PostgreSQL

Непрочитанное сообщение Kukaramba » 2010-05-04 10:45:28

Ну не получается - он не выдает ничего. Или просто белый экран, или ошибка.... Проблема в коде, только я не могу ее исправить....

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Меню типа tree в PHP из PostgreSQL

Непрочитанное сообщение ProFTP » 2010-05-04 12:04:01

если не полчается, то я бы попробовал другие варианты, напрмиер я не знаю какая отладка у вас то, что не выводиться и почему белый экран...

(если не получиться сделать, то дай доступ - попробую сделать как нибудь в свободное время...)
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Kukaramba
проходил мимо
Сообщения: 8
Зарегистрирован: 2010-05-03 17:50:30

Re: Меню типа tree в PHP из PostgreSQL

Непрочитанное сообщение Kukaramba » 2010-05-04 12:31:18

Все же где то здесь не правильно идет....


Взял я код, но у меня таблицы зовутся - id и id_parent
Плюс, как выводить? Через echo??

Код: Выделить всё

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);
Есть еще вариант:

Код: Выделить всё

$tree = array(0 => null); 
$root =& $tree[0]; 
foreach($data as $node) { 
  if(!isset($tree[$node["parent_id"]])) { 
    $tree[$node["parent_id"]] = array(); 
  } 
  $tree[$node["parent_id"]][$node["id"]] =& $tree[$node["id"]]; 
} 
print_r($root);
Помогите поднастроить под мой случай (id, id_parent)
В первые делаю такое. Очень нужно.

Kukaramba
проходил мимо
Сообщения: 8
Зарегистрирован: 2010-05-03 17:50:30

Re: Меню типа tree в PHP из PostgreSQL

Непрочитанное сообщение Kukaramba » 2010-05-04 13:20:05

В общем суть вопроса такая - что нужно написать в tablica.php чтобы у меня получилась структура типа tree....

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Меню типа tree в PHP из PostgreSQL

Непрочитанное сообщение ProFTP » 2010-05-05 5:55:14

Kukaramba писал(а):В общем суть вопроса такая - что нужно написать в tablica.php чтобы у меня получилась структура типа tree....
1) http://forum.lissyara.su/viewtopic.php?f=17&t=25132

2) с парент id я делал на перле + кэширование http://search.cpan.org/~bjeps/DBIx-Tree-1.9/Tree.pm , и еще есть готовые классы nested set на php и на perl и т.д. и т.п.
на php, я делал просто комиентарии в виде дерева перебрать и вывести...

и вообще это изобретение велосипеда, которого изобрели давно!
http://www.google.com.ua/#hl=uk&q=paren ... 00b7f05e8a

3)

Изображение

Код: Выделить всё

<?php 
include( "dbopen.php" ); 

function ShowTree($ParentID, $lvl) { 

global $link; 
global $lvl; 
$lvl++; 

$sSQL="SELECT id,title,pid FROM catalogue WHERE pid=".$ParentID." ORDER BY title";
$result=mysql_query($sSQL, $link);

if (mysql_num_rows($result) > 0) {
echo("<UL>\n");
while ( $row = mysql_fetch_array($result) ) {
$ID1 = $row["id"];
echo("<LI>\n");
echo("<A HREF=\""."?ID=".$ID1."\">".$row["title"]."</A>"."  \n");
ShowTree($ID1, $lvl); 
$lvl--;
}
echo("</UL>\n");
}

}

ShowTree(0, 0); 

mysql_close($link); 

?> 
Изображение

http://www.codenet.ru/webmast/php/tree.php
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Kukaramba
проходил мимо
Сообщения: 8
Зарегистрирован: 2010-05-03 17:50:30

Re: Меню типа tree в PHP из PostgreSQL

Непрочитанное сообщение Kukaramba » 2010-05-05 8:18:22

Взял код

Код: Выделить всё

function ShowTree($ParentID, $lvl) { 

global $link; 
global $lvl; 
$lvl++; 

$sSQL = "SELECT id,subject,parent_id FROM project WHERE parent_id=".$ParentID." ORDER BY subject";
$result = pg_query($sSQL, $link) or die("Error in query: $sSQL.
" . pg_last_error($link));;

if (pg_num_rows($result) > 0) {
echo("<UL>\n");
while ($row = pg_fetch_array($result) ) {
$ID1 = $row["id"];
echo("<LI>\n");
echo("<A HREF=\""."?ID=".$ID1."\">".$row["title"]."</A>"."  \n");
ShowTree($ID1, $lvl); 
$lvl--;
}
echo("</UL>\n");
}

}

ShowTree(0, 0); 

echo $result;
Но на выходе получаю:
Error in query: SELECT id,subject,parent_id FROM project WHERE parent_id=0 ORDER BY subject.

Kukaramba
проходил мимо
Сообщения: 8
Зарегистрирован: 2010-05-03 17:50:30

Re: Меню типа tree в PHP из PostgreSQL

Непрочитанное сообщение Kukaramba » 2010-05-05 12:36:16

Все получилось! Спасибо!
Хотелось бы задать еще вопрос: как можно сделать менюшку с выподающим списком. Как в проводнике. Нажимаем на элемент и видим что внутри...

Kukaramba
проходил мимо
Сообщения: 8
Зарегистрирован: 2010-05-03 17:50:30

Re: Меню типа tree в PHP из PostgreSQL

Непрочитанное сообщение Kukaramba » 2010-05-05 15:41:19

Я вывел списком 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
?????

Аватара пользователя
ADRE
майор
Сообщения: 2641
Зарегистрирован: 2007-07-26 8:53:49
Контактная информация:

Re: Меню типа tree в PHP из PostgreSQL

Непрочитанное сообщение ADRE » 2010-05-13 17:38:26

выпдающие список можно выдрать их shopcms =) там довольно просто java + css + html. В интернет много пример на это тему, особенно любят ишак номер 6 особоиндуиский.
//del