| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Для профи > Как избежать перекресного вложения разделов |
| Автор: OPG 20.8.2005, 22:22 |
| Имеются две функции. Вопросы о том, что все можно реализовать с помощью одной функции добавив еще одну переменную, сейчас не поднимаются. Таблица такова: idSection:nameSection:idParent , где idParent идентификатор родительского раздела У меня два вопроса. Данные функции являются немного переделанными примерами одной функции со статьи весьма распросранненой в инете. Первый вопрос: Зачем нужна переменная $lvl? Второй вопрос более насущный: Существует панель администрирования сайта. В левой колонке выводится дерево ShowTreeParentSection(0,0); В правой колонке выводится дерево ShowTreeChildSection(0,0); При вкладывании разделов юзер в левой колонке отмечает радиокнопку родительского раздела, а в правой дочернего. Т.е. приходят две переменные idSectionParent и idSectionChild. Как написать функцию , которая проверяет пересеченное вложение разделов? После некоторого раздумья с задачей конечно справлюсь, но мне сдавать заказ в понедельник. Все написано, кроме вот этого данного вопроса. Очень прошу сообщество помочь. На другие форумы даже не обращаюсь, т.к. опыт показывает, если не помогут здесь, то в других форумах подавно делать нечего... Кстати, с осени буду жить в Москве, и очень понравилось начинание о встречах <?php function ShowTreeParentSection($idParent, $lvl) { include_once "connect.php"; global $lvl; $lvl++; $query="select idSection, nameSection, idParent from section where idParent='$idParent' order by nameSection"; $result=mysql_query($query); if (mysql_num_rows($result) > 0) { echo("<ol>\n"); while ( $row = mysql_fetch_array($result) ) { $id1 = $row[0]; echo("<ol>\n"); echo("<input type=\"radio\" name=\"idSectionParent\" value=\"$id1\">$row[1] \n"); echo("</ol>\n"); ShowTreeParentSection($id1, $lvl); $lvl--; } echo("</ol>\n"); } } function ShowTreeChildSection($idParent, $lvl) { include_once "connect.php"; global $lvl; $lvl++; $query="select idSection, nameSection, idParent from section where idParent='$idParent' order by nameSection"; $result=mysql_query($query); if (mysql_num_rows($result) > 0) { echo("<ol>\n"); while ( $row = mysql_fetch_array($result) ) { $id1 = $row[0]; echo("<ol>\n"); echo("<input type=\"radio\" name=\"idSectionChild\" value=\"$id1\">$row[1] \n"); echo("</ol>\n"); ShowTreeChildSection($id1, $lvl); $lvl--; } echo("</ol>\n"); } } ?> |
| Автор: Mal Hack 21.8.2005, 00:39 | ||
| Так. Поясни малость задачу, что ты понимаешь под перекрестностью. ЗЫ:
Судя по всему level - уровень тобишь. У тебя этого нет, |
| Автор: OPG 21.8.2005, 12:36 |
| Сам понимаю, что уровень. Но и в примере, такового нет. Зачем? Вот ссылка на оригинал http://activex.net.ru/docs/tree.shtml. Теперь перекресное вложение. Предположим имеются разделы 1, 2, 3. Юзер вкладывает в 1 - 2, в 2-3, а в 3-1. Получается функция зацикливается, и вообще при большом количестве разделов юзер может такого намешать, что придется писать в админке службу, которая устанавливает в ноль все разделы, а юзер начинает с нуля строить структуру сайта. Проще говоря, если такое может произойти, то обязательно произойдет, и бороться с этим необходимо на уровне вкладывания разделов. Т.е. как я понимаю, должна иметься рекурсивная функция, которая проверяет всю ветку раздела и проверяет наличие двух одинаковых id. Если таковые имеются, то выход и предупреждение. |
| Автор: Mal Hack 21.8.2005, 13:47 |
| Я так понимаю само дерево ты строишь. Как мне кажется тут надо сделать тоже. Получить все ПОДкатегории для той категории у которой ты хочешь изменить. И посмотреть, есть ли в полученных категориях категория в которую ты хочешь переместить категорию. Если есть, т.е. 1ниже по уровню к 3, значит ошибка. Т.е. если куда переносишь - ниже по уровню, то нельзя. Если выше, то можно. |
| Автор: IZ@TOP 21.8.2005, 18:28 |
| А можно спросить как эта тема относится к форуму "Профессиональная разработка"? |