Подскажите как решить задачку. Необходимо вывести структурное меню (типа 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);
?>
то для вывода меню - нужно написать следующее ->?????
Нет. Для вывода нужно написать другое.
Этот запрос нужно подставить в строку
$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(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);
?>
- - -
Народ, ну помогите же вывести эту менюшку. Уже перепробовал наверное все что мог. Недостаточно у меня пока знаний....
Беру код такой, и ни фига не получается.... :'( :
<?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);
?>
Я вывел списком 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=???¶m2=..." - путь к страничце со всеми необходимыми параметрами
Так пойдет?