Вложенность

Создание неограниченной вложенности разделов форума, зц, каталога...
Сложно ли это? Конечно же нет! Для этого нам понадобится создать 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>/';
}
}

Ну вот и все, дальше сами, своим ходом, юзайте на здоровье :)
Теги:
Вложенность
Похожие новости:
Добавлено: 16 Мая 2018 14:51:34 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...