Создание неограниченной вложенности разделов форума, зц, каталога...
Сложно ли это? Конечно же нет! Для этого нам понадобится создать 1 дополнительное поле в таблице с разделами.
Рассмотрим на примере загруз - центра
#PHP
<?php
/* Создадим таблицу */
CREATE TABLE `categories` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`id_cat` int(11) DEFAULT '0' NOT NULL,
PRIMARY KEY (`id`),
KEY `id_cat` (`id_cat`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
/*
id - идентификатор категории
name - названия категории
id_cat - доминирующая категория
*/
Что будет содержать поле id_cat? Ответ: id категории, в которую вложена категория с указанным id.
Создадим небольшой скрипт для вывода категорий:
#PHP
<?php
// главная страница зц(index.php):
$res=mysql_query('SELECT id,name FROM categories WHERE id_cat=0'); // получаем список главных категорий
while($m=mysql_fetch_assoc($res)){ // выводим их в цикле
echo '<a href="cat.php?id='.$m['id'].'">'.$m['name'].'</a><br/>';
}
// страница с выводом списка файлов(cat.php):
if(isset($_GET['id']) and is_numeric($_GET['id'])){ // проверяем, передан ли id скрипту, и является ли он целым числом
$id=intval($_GET['id']);
}else{exit('Неверный id');}
echo 'Путь к категории: '.cat_print($id); // печатаем полный список категорий до указанной категории
// функцию cat_print разберем чуть позже
$res=mysql_query('SELECT id,name FROM categories WHERE id_cat='.$id); // получаем список категорий, у которых id_cat равен переданному id
while($m=mysql_fetch_assoc($res)){ // выводим их в цикле
echo '<a href="cat.php?id='.$m['id'].'">'.$m['name'].'</a><br/>';
}
// если есть в категории файлы, то выводим их ниже списка категорий
echo '<hr />';
$res=mysql_query('SELECT * FROM files WHERE categories='.$id);
while($m=mysql_fetch_assoc($res)){ // вывод списка файлов и категорий, в которых он находится
echo '<a href="file.php?id='.$m['id'].'">'.$m['filename'].'</a> (Категория: '.cat_print($m['categories']).')<br/>';
}
Например, есть 4 категории:
#TEXT
Картинки (id 1, id_cat 0) // эта категория главная
Машинки (id 2, id_cat 1) // эта категория вложена в категорию "Картинки"
Для компов (id 3, id_cat 2) // эта категория вложена в категорию "Машинки"
Для телефонов (id 4, id_cat 2) // эта категория вложена в категорию "Машинки"
С этим разобрались. Едем дальше.
Как нам вывести полный список категорий, в которой находится файл или вложенная категория?
К сожалению, тут не обойтись без рекурсии, т.к. mysql ее не поддерживает.
#PHP
<?php
function cat($id){ // создаем функцию, которая вытащит из базы все категории и подкатегории по переданному ей id
$return=array(); // создаем массив, в который будем записывать категории
$m=mysql_query('SELECT * FROM categories WHERE id='.$id); // вытаскиваем имя категории, для переданного id
if(mysql_num_rows($m)){ // проверяем, есть ли она в базе
$m=mysql_fetch_assoc($m); // если есть, создаем массив
$return[]=array($m['id'],$m['name']); // заносим в массив id категории как ключ массива,и имя категории как значение массива
if($m['id_cat']){ // проверяем, есть ли у категории доминирующие категории
$return=array_merge($return,cat($m['id_cat'])); // если есть, то запускаем функцию заново, но уже с id домирующей категории, и полученный результат соединяем с уже имеющимся
}
}
return $return;
}
function cat_print($id){ // основная функция, которую мы будем применять
$print=cat($id); // получаем список категорий в виде массва
$print=array_reverse($print); // переворачиваем массив, чтобы категории выводились начиная с главных
for($i=0,$s=sizeof($print);$i<$s;$i++){ // выводим их в цикле
echo '<a href="cat.php?id='.$print[$i][0].'">'.$print[$i][1].'</a>/';
}
}
Ну вот и все, дальше сами, своим ходом, юзайте на здоровье :)