[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Построение дерева страниц и разделов.
htaccess
Доброго вам времени суток! Ломаю голову над очередной и возможно ерундою.
Вот скрипт :
<!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=windows-1251" />
<
title>Документ без названия</title>
</
head>
<
body>
<?php
$link = mysql_connect('localhost', 'root', '');
mysql_query("SET character_set_client = cp1251");
mysql_query("SET character_set_connection = cp1251");
mysql_query("SET character_set_results = cp1251");
mysql_select_db('mycms', $link);
#
$sql_get_hdrs = mysql_query("SELECT id, title FROM site_pages WHERE owner_id IS NULL");
#
while ($assoc_pgs = mysql_fetch_assoc($sql_get_hdrs)) {//W1 start l1
$id_pgs = $assoc_pgs['id'];
$title_pgs = $assoc_pgs['title'];
#
echo '<b><label style="color:#09F;">'.$title_pgs.'</label></b><br />';
#
# #
#

while ($e3 != 404) {//W3 start l2
$sql_get_child = mysql_query("SELECT id, title, level FROM site_pages WHERE owner_id = '$id_pgs'");
$count_get_chld = mysql_num_rows($sql_get_child);
#
if ($count_get_chld > 0) {
while ($assoc_chlds = mysql_fetch_assoc($sql_get_child)) {//W2 start l3
$id_chld = $assoc_chlds['id'];
$title_chld = $assoc_chlds['title'];
echo ' '.$title_chld.'<br />';
$sql_get_ch2 = mysql_query("SELECT id, title, level FROM site_pages WHERE owner_id = '$id_chld'");
$count_get_ch2 = mysql_num_rows($sql_get_ch2);
if ($count_get_ch2 > 0) {
while ($assoc_ch2 = mysql_fetch_assoc($sql_get_ch2)) {//W4 start l4
$title_ch2 = $assoc_ch2['title'];
$id_ch2 = $assoc_ch2['id'];
echo '  '.$title_ch2.'<br />';
$sql_get_ch3 = mysql_query("SELECT id, title, level FROM site_pages WHERE owner_id = '$id_ch2'");
$count_get_ch3 = mysql_num_rows($sql_get_ch3);
if ($count_get_ch3 > 0) {
while ($assoc_ch3 = mysql_fetch_assoc($sql_get_ch3)) {//W5 start l5
$title_ch3 = $assoc_ch3['title'];
$id_ch3 = $assoc_ch3['id'];
echo '   '.$title_ch3.'<br />';
$sql_get_ch4 = mysql_query("SELECT id, title, level FROM site_pages WHERE owner_id = '$id_ch3'");
$count_get_ch4 = mysql_num_rows($sql_get_ch4);
if ($count_get_ch4 > 0) {
while ($assoc_ch4 = mysql_fetch_assoc($sql_get_ch4)) {//W6 start l6
$title_ch4 = $assoc_ch4['title'];
echo '    '.$title_ch4.'<br />';
}//W6 end
}
}
//W5 end
}
}
//W4 end
}
}
//W2 end
break;
} else {
break;
}
#
}//W3 end
}//W1 end



#

@mysql_close($link);
?>
</body>
</
html>


Вот дамп БД :

-- phpMyAdmin SQL Dump
-- version 3.2.0.1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Nov 14, 2010 at 02:06 PM
-- Server version: 5.5.0
-- PHP Version: 5.3.3

SET SQL_MODE=
"NO_AUTO_VALUE_ON_ZERO";

--
-- Database: `mycms`
--

-- --------------------------------------------------------

--
-- Table structure for table `site_pages`
--

CREATE TABLE IF NOT EXISTS `site_pages` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` text NOT NULL,
`content` text,
`owner_id` int(11) DEFAULT NULL,
`level` int(11) DEFAULT '1',
`updated` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=11 ;

--
-- Dumping data for table `site_pages`
--

INSERT INTO `site_pages` (`id`, `title`, `content`, `owner_id`, `level`, `updated`) VALUES
(1, 'Главная страница', 'Главная страница О_о^^', NULL, 1, '2010-11-12 10:06:42'),
(2, 'Новости', 'Пыщь пыщь новости хдд', 1, 2, '2010-11-13 13:52:59'),
(3, 'Объявления', 'Объявить да хдд ололо пыщь пыщь', 1, 2, '2010-11-13 11:16:54'),
(4, 'Форум', 'Форумэ ололо хддд !11111', NULL, 1, '2010-11-13 11:17:30'),
(5, 'Обсуждения', 'Царапэ атец11111', 4, 2, '2010-11-13 11:18:44'),
(6, 'Голосование', 'Пыщь голосэ', 4, 2, '2010-11-13 13:34:58'),
(7, 'Флудильня', 'Флудэ хдд ололололоол', 4, 2, '2010-11-13 13:41:59'),
(8, '13.11.2010 Пцц туплю да', '!1111', 2, 3, '2010-11-13 14:43:14'),
(9, 'Часть 1', 'выавыа', 8, 4, '2010-11-14 14:52:35'),
(10, 'х1', 'ололо', 9, 5, '2010-11-14 15:00:16');


Суть скрипта состоит в следующем :

Получаем из базы список страниц, если поле owner_id пустое - значит это заголовок, под ним выводим его дочерние поля.
owner_id - это идентификатор поля, под который должно располагаться это поле(родитель).
id - идентификатор поля.
title - заголовок.
level - уровень.

Нужно вывести все эти строки и построить дерево каталогов. Скрипт работает, дерево создаётся, но если вдруг вложенность будет просто огромная, то не стану же я добавлять до бесконечности циклы и отправлять запросы к бд в миллион строк, а строки могут записаны в базе не по порядку.
Со вчерашнего дня ломаю голову, помогите упростить, пожалуйста).



Спустя 14 минут, 46 секунд (14.11.2010 - 16:36) Sanchopansa написал(а):
<?php
$arr = array(
array(
'name_r' => 'Категория 1',
'id' => 1,
'parent' => 0
),
array(
'name_r' => 'Категория 2',
'id' => 2,
'parent' => 0
),
array(
'name_r' => 'Категория 3',
'id' => 3,
'parent' => 0
),
array(
'name_r' => 'Подкатегория 1',
'id' => 4,
'parent' => 1
),
array(
'name_r' => 'Подкатегория 2',
'id' => 5,
'parent' => 1
),
array(
'name_r' => 'Подкатегория 3',
'id' => 6,
'parent' => 3
),
array(
'name_r' => 'Подподкатегория 4',
'id' => 7,
'parent' => 6
),
array(
'name_r' => 'Подподкатегория 5',
'id' => 8,
'parent' => 4
)
);

function getTree($arr, $parent = 0, $rotation = 0)
{
$space = '';
$tmp_rot = $rotation;
while ($tmp_rot)
{
$space .= '-';
$tmp_rot--;
}
foreach ($arr as $cat){
if ($cat['parent'] == $parent)
{
echo $space.$cat['name_r'] . "\n\r";
getTree(&$arr, $cat['id'], $rotation+1);
}
}
}


getTree($arr);

?>

вот подумай над этим

Спустя 3 минуты, 8 секунд (14.11.2010 - 16:39) walters написал(а):
ты выбрал самые длинные пути? зачем едешь в центр на трамвае когда пешком короче и быстрее?

Спустя 7 минут, 52 секунды (14.11.2010 - 16:47) htaccess написал(а):
Цитата (walters @ 14.11.2010 - 13:39)
ты выбрал самые длинные пути? зачем едешь в центр на трамвае когда пешком короче и быстрее?

Ну чтож, подскажите или дайте самокат)

Спустя 1 минута, 19 секунд (14.11.2010 - 16:48) htaccess написал(а):
Цитата (Sanchopansa @ 14.11.2010 - 13:36)
<?php
$arr = array(
array(
'name_r' => 'Категория 1',
'id' => 1,
'parent' => 0
),
array(
'name_r' => 'Категория 2',
'id' => 2,
'parent' => 0
),
array(
'name_r' => 'Категория 3',
'id' => 3,
'parent' => 0
),
array(
'name_r' => 'Подкатегория 1',
'id' => 4,
'parent' => 1
),
array(
'name_r' => 'Подкатегория 2',
'id' => 5,
'parent' => 1
),
array(
'name_r' => 'Подкатегория 3',
'id' => 6,
'parent' => 3
),
array(
'name_r' => 'Подподкатегория 4',
'id' => 7,
'parent' => 6
),
array(
'name_r' => 'Подподкатегория 5',
'id' => 8,
'parent' => 4
)
);

function getTree($arr, $parent = 0, $rotation = 0)
{
$space = '';
$tmp_rot = $rotation;
while ($tmp_rot)
{
$space .= '-';
$tmp_rot--;
}
foreach ($arr as $cat){
if ($cat['parent'] == $parent)
{
echo $space.$cat['name_r'] . "\n\r";
getTree(&$arr, $cat['id'], $rotation+1);
}
}
}


getTree($arr);

?>

вот подумай над этим

Спасибо, испробую)

Спустя 5 минут, 34 секунды (14.11.2010 - 16:53) htaccess написал(а):
Но ведь там все не по порядку будет, скрин из базы прикрепил в первом посте.

Спустя 2 часа, 30 минут, 43 секунды (14.11.2010 - 19:24) Sanchopansa написал(а):
<?php

function
getTree($arr, $parent = 0, $rotation = 0)
{
$space = '';
$tmp_rot = $rotation;
while ($tmp_rot)
{
$space .= '-';
$tmp_rot--;
}
foreach ($arr as $cat){
if ($cat['owner_id'] == $parent)
{
if($cat['owner_id'] === null)
{
$cat['title'] = '<h1>' . $cat['title'] . '</h1>';
}
echo $space.$cat['title'] . "<br />";
getTree(&$arr, $cat['id'], $rotation+1);
}
}
}

$result = mysql_query("SELECT * FROM site_pages ORDER BY id ASC");
$arr = array();
while ($row = mysql_fetch_assoc($result))
{
$arr[] = $row;
}

getTree($arr, null);

Вот короче сделай так и на выходе получишь такое дерево
Цитата
Главная страница

-Новости
--13.11.2010 Пцц туплю да
---Часть 1
----х1
-Объявления

Форум

-Обсуждения
-Голосование
-Флудильня

Спустя 2 часа, 52 минуты, 17 секунд (14.11.2010 - 22:16) htaccess написал(а):
Цитата (Sanchopansa @ 14.11.2010 - 16:24)
<?php

function
getTree($arr, $parent = 0, $rotation = 0)
{
$space = '';
$tmp_rot = $rotation;
while ($tmp_rot)
{
$space .= '-';
$tmp_rot--;
}
foreach ($arr as $cat){
if ($cat['owner_id'] == $parent)
{
if($cat['owner_id'] === null)
{
$cat['title'] = '<h1>' . $cat['title'] . '</h1>';
}
echo $space.$cat['title'] . "<br />";
getTree(&$arr, $cat['id'], $rotation+1);
}
}
}

$result = mysql_query("SELECT * FROM site_pages ORDER BY id ASC");
$arr = array();
while ($row = mysql_fetch_assoc($result))
{
$arr[] = $row;
}

getTree($arr, null);

Вот короче сделай так и на выходе получишь такое дерево
Цитата
Главная страница

-Новости
--13.11.2010 Пцц туплю да
---Часть 1
----х1
-Объявления

Форум

-Обсуждения
-Голосование
-Флудильня

Конечно работает, спасибо) Пробую.
Быстрый ответ:

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