Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Как избежать перекресного вложения разделов


Автор: OPG 20.8.2005, 22:22
Имеются две функции. Вопросы о том, что все можно реализовать с помощью одной функции добавив еще
одну переменную, сейчас не поднимаются.

Таблица такова:

idSection:nameSection:idParent

, где idParent идентификатор родительского раздела

У меня два вопроса.
Данные функции являются немного переделанными примерами одной функции со статьи весьма распросранненой в инете.
Первый вопрос:
Зачем нужна переменная $lvl?
Второй вопрос более насущный:
Существует панель администрирования сайта.
В левой колонке выводится дерево
ShowTreeParentSection(0,0);
В правой колонке выводится дерево
ShowTreeChildSection(0,0);

При вкладывании разделов юзер в левой колонке отмечает радиокнопку родительского раздела, а в правой
дочернего. Т.е. приходят две переменные idSectionParent и idSectionChild. Как написать функцию ,
которая проверяет пересеченное вложение разделов?

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

Кстати, с осени буду жить в Москве, и очень понравилось начинание о встречахsmile))
<?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
Так. Поясни малость задачу, что ты понимаешь под перекрестностью.
ЗЫ:
Цитата(OPG @ 20.8.2005, 23:22)
Зачем нужна переменная $lvl?

Судя по всему 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
А можно спросить как эта тема относится к форуму "Профессиональная разработка"?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)