Под-категории

Статус
В этой теме нельзя размещать новые ответы.

StirolXXX

Постоялец
Регистрация
11 Июн 2006
Сообщения
80
Реакции
38
Доброго времени суток!

Есть таблица:

Код:
CREATE TABLE `categories` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `sort` int(10) NOT NULL default '0',
  `name` varchar(30) NOT NULL default '',
  `image` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;

В ней данные такие:

Код:
INSERT INTO `categories` (`id`, `sort`, `name`, `image`) VALUES 
  (1, 10, 'Приложения ISO', 'appzpciso.gif'),
  (2, 20, 'Приложения PDA', 'appzpda.gif'),
  (3, 30, 'Приложения AUDIO', 'appzaudio.gif'),
  (4, 40, 'Приложения MISC', 'appzmisc.gif');

Я хочу добавить в таблицу parent поле (т.е родительская категорий).

Как потом из получившейся таблицы сделать уже массив с подкатегориями? Уровень вложенности нужен не ограниченный (данные в таблицу при вводе будут проветрятся насчет вечной рекурсии).

PHP
 
для всех сначало устанавливаешь parent = 0, затем берешь допустим "Приложения PDA" и присваиваешь его parent = 1.
Получишь вторую вложенность. Если надо подкатегорию для "Приложения PDA", то для записи дочернего ставишь родителем id "Приложения PDA".

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

Другой вариант запихать всю инфу о категориях в $_SESSION.

Если интересует код могу набросать с рекурсией...но придётся оптимизировать.
 
Набросай плиз :) А я если что закину массив в кеш :)

Добавлено через 46 минут
Блин, получилось КАК-ТО.

Вот как-бы теперь в один запрос?

PHP:
function get_tree($parent_id = 0) {
	$out = array();
	$query = "SELECT * FROM categories2 WHERE pid = '$parent_id' ORDER BY id, pid";
	$result = sql_query($query);
	while ($row = mysql_fetch_array($result)) {
		$subcats = get_tree($row['id']);
		$out[] = array(
			'id' => $row['id'],
			'pid' => $row['pid'],
			'name' => $row['name'],
			'subdata' => (!empty($subcats) ? $subcats : ''),
		);
	}
	return $out;
}

CREATE TABLE `categories2` (
`id` int(10) unsigned NOT NULL auto_increment,
`pid` int(10) unsigned NOT NULL default '0',
`sort` int(10) NOT NULL default '0',
`name` varchar(30) NOT NULL default '',
`image` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
 
Новая информация по теме:

Есть скрипт, что генерирует вот такой-вот массив:

$id => array($id, $pid, $name, $subdata)

Пояснения ключей:
id - номер категории
pid - номер родительской категории
name - название категории
subdata - массив наподобие того что выше если у категории есть ветки, иначе просто пустое значение

[more]
Код:
Array
(
    [4] => Array
        (
            [id] => 4
            [pid] => 1
            [name] => Жанр
            [subdata] => Array
                (
                    [10] => Array
                        (
                            [id] => 10
                            [pid] => 4
                            [name] => Драма
                            [subdata] => 
                        )

                    [11] => Array
                        (
                            [id] => 11
                            [pid] => 4
                            [name] => Комедия
                            [subdata] => 
                        )

                    [12] => Array
                        (
                            [id] => 12
                            [pid] => 4
                            [name] => Боевик
                            [subdata] => 
                        )

                    [13] => Array
                        (
                            [id] => 13
                            [pid] => 4
                            [name] => Фильм-катастрофа
                            [subdata] => 
                        )

                )

        )

    [14] => Array
        (
            [id] => 14
            [pid] => 1
            [name] => Носитель
            [subdata] => Array
                (
                    [15] => Array
                        (
                            [id] => 15
                            [pid] => 14
                            [name] => DVD
                            [subdata] => Array
                                (
                                    [26] => Array
                                        (
                                            [id] => 26
                                            [pid] => 15
                                            [name] => DVD-5
                                            [subdata] => 
                                        )

                                    [27] => Array
                                        (
                                            [id] => 27
                                            [pid] => 15
                                            [name] => DVD-9
                                            [subdata] => 
                                        )

                                )

                        )

                    [16] => Array
                        (
                            [id] => 16
                            [pid] => 14
                            [name] => BluRay
                            [subdata] => 
                        )

                )

        )

    [17] => Array
        (
            [id] => 17
            [pid] => 1
            [name] => Год выпуска
            [subdata] => Array
                (
                    [18] => Array
                        (
                            [id] => 18
                            [pid] => 17
                            [name] => < 1970
                            [subdata] => 
                        )

                    [19] => Array
                        (
                            [id] => 19
                            [pid] => 17
                            [name] => < 1980
                            [subdata] => 
                        )

                    [20] => Array
                        (
                            [id] => 20
                            [pid] => 17
                            [name] => < 1990
                            [subdata] => 
                        )

                    [21] => Array
                        (
                            [id] => 21
                            [pid] => 17
                            [name] => < 2000
                            [subdata] => 
                        )

                    [22] => Array
                        (
                            [id] => 22
                            [pid] => 17
                            [name] => < 2005
                            [subdata] => 
                        )

                    [23] => Array
                        (
                            [id] => 23
                            [pid] => 17
                            [name] => 2006
                            [subdata] => 
                        )

                    [24] => Array
                        (
                            [id] => 24
                            [pid] => 17
                            [name] => 2007
                            [subdata] => 
                        )

                    [25] => Array
                        (
                            [id] => 25
                            [pid] => 17
                            [name] => 2008
                            [subdata] => 
                        )

                )

        )

)
[/more]

Сам скрипт:
[more]
Код:
function subcat_filter($search, $key = 'pid') {
    static $subcats;
    $filtered = array();
    if (!$subcats) {
        $res = sql_query('SELECT * FROM categories2 ORDER BY id, pid') or sqlerr(__FILE__,__LINE__);
        while ($cat = mysql_fetch_array($res))
            $subcats[] = $cat;
    }
    foreach ($subcats as $cat)
        if ($cat[$key] == $search)
            $filtered[] = $cat;
    return $filtered;
}

function get_tree($parent_id = 0) {
    $tree = array();
    $cats = subcat_filter($parent_id);
    foreach ($cats as $cat) {
        $subcats = get_tree($cat['id']);
        $tree[$cat['id']] = array(
            'id' => $cat['id'],
            'pid' => $cat['pid'],
            'name' => $cat['name'],
            'subdata' => (!empty($subcats) ? $subcats : ''),
        );
    }
    return $tree;
}

$categories = get_tree(1);
print_r($categories);
die;
[/more]

Потом надо массив обработать уже таким образом что-бы на выходе было именно вот такое:

Код:
<span style="cursor: pointer;" onclick="javascript: show_hide('c4')">
    <img border="0" src="pic/plus.gif" id="picc4" title="Показать">&nbsp;<b>Жанр</b>
</span>

В такую конструкцию заключается категория у которой subdata не пустой где:
c4 - c$id т.е символ "c" и далее номер категории.

Далее после этого идет вот такой вывод:

Код:
<span id="sc4" style="display: none;">
    <input type="checkbox" name="subcat[]" id="subcat10" value="10" /><label for="subcat10">Драма</label><br />
    <input type="checkbox" name="subcat[]" id="subcat11" value="11" /><label for="subcat11">Комедия</label><br />
    <input type="checkbox" name="subcat[]" id="subcat12" value="12" /><label for="subcat12">Боевик</label><br />
    <input type="checkbox" name="subcat[]" id="subcat13" value="13" /><label for="subcat13">Фильм-катастрофа</label><br />
</span>

Где sc - sc$id той категории ветви которой обрабатываем.

Ну и далее ясно тоже:
for="subcat10" где subcat10 - subcat$id уже текущщей категории (не родительской)
value="10" где 10 - $id тек категории.

[more]
HTML:
<script language="javascript" type="text/javascript" src="show_hide.js"></script>
<span style="cursor: pointer;" onclick="javascript: show_hide('c4')">
    <img border="0" src="pic/plus.gif" id="picc4" title="Показать">&nbsp;<b>Жанр</b>
</span><br />
<span id="sc4" style="display: none;">
    <input type="checkbox" name="subcat[]" id="subcat10" value="10" /><label for="subcat10">Драма</label><br />
    <input type="checkbox" name="subcat[]" id="subcat11" value="11" /><label for="subcat11">Комедия</label><br />
    <input type="checkbox" name="subcat[]" id="subcat12" value="12" /><label for="subcat12">Боевик</label><br />
    <input type="checkbox" name="subcat[]" id="subcat13" value="13" /><label for="subcat13">Фильм-катастрофа</label><br />
</span>
<span style="cursor: pointer;" onclick="javascript: show_hide('c14')">
    <img border="0" src="pic/plus.gif" id="picc14" title="Показать">&nbsp;<b>Носитель</b>
</span><br />
<span id="sc14" style="display: none;">
    <span style="cursor: pointer;" onclick="javascript: show_hide('c15')">
        <img border="0" src="pic/plus.gif" id="picc15" title="Показать">&nbsp;<b>DVD</b>
    </span><br />
    <span id="sc15" style="display: none;">
        <input type="checkbox" name="subcat[]" id="subcat26" value="26" /><label for="subcat26">DVD-5</label><br />
        <input type="checkbox" name="subcat[]" id="subcat27" value="27" /><label for="subcat27">DVD-9</label><br />
    </span>
    <input type="checkbox" name="subcat[]" id="subcat16" value="16" /><label for="subcat16">BluRay</label><br />
</span>
<span style="cursor: pointer;" onclick="javascript: show_hide('c17')">
    <img border="0" src="pic/plus.gif" id="picc17" title="Показать">&nbsp;<b>Год выпуска</b>
</span><br />
<span id="sc17" style="display: none;">
    <input type="checkbox" name="subcat[]" id="subcat18" value="18" /><label for="subcat18">&lt; 1970</label><br />
    <input type="checkbox" name="subcat[]" id="subcat19" value="19" /><label for="subcat19">&lt; 1980</label><br />
    <input type="checkbox" name="subcat[]" id="subcat20" value="20" /><label for="subcat20">&lt; 1990</label><br />
    <input type="checkbox" name="subcat[]" id="subcat21" value="21" /><label for="subcat21">&lt; 2000</label><br />
    <input type="checkbox" name="subcat[]" id="subcat22" value="22" /><label for="subcat22">&lt; 2005</label><br />
    <input type="checkbox" name="subcat[]" id="subcat23" value="23" /><label for="subcat23">2006</label><br />
    <input type="checkbox" name="subcat[]" id="subcat24" value="24" /><label for="subcat24">2007</label><br />
    <input type="checkbox" name="subcat[]" id="subcat25" value="25" /><label for="subcat25">2008</label><br />
</span>
[/more]

Собственно вопрос такой - я пробовал сделать обработку после этого но были баги. Не мог-бы кто-нить написать уже готовый код что делает такой вывод, а дальше я сам уже доделаю и если что - поправлю баги?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху