Renny
Новичок
MaterializedPath
Пишу простенький класс для работы с деревом методом MaterializedPath. Хочу потом выложить у себя на сайте, для свободного доступа и здесь, в Wiki.
Пишу, здесь тк надеюсь, что писать буду не один, и что меня поправят, где необходимо, то есть напишем вместе, совместными усилиями.
Необходимо создать методы:
1 - Выдача данных о ноде, по ее номеру
2 - Добавление ноды
3 - Удаление ноды и всех ее потомков
4 - Редактирование данных ноды
5 - Выдать список(массив) всех непосредственных потомков заданной ноды
6 - Выдать массив всех потомков заданной ноды (если задать 0, то выведется все дерево целиком)
7 - Перемищение ноды в пределах одного родителя
8 - ...
И так начало:
SQL_PREFIX - это префикс для таблиц в базе данных, он берется из файла конфигурации.
parents - это строка вида ' 1/5/12/78/234 ', где числа это номера родительских элементов, последнее число - это ID прямого предка, то есть непосредственного родителя.
LAST MODIFIED 03.02.2006 13:40
Пишу простенький класс для работы с деревом методом MaterializedPath. Хочу потом выложить у себя на сайте, для свободного доступа и здесь, в Wiki.
Пишу, здесь тк надеюсь, что писать буду не один, и что меня поправят, где необходимо, то есть напишем вместе, совместными усилиями.
Необходимо создать методы:
1 - Выдача данных о ноде, по ее номеру
2 - Добавление ноды
3 - Удаление ноды и всех ее потомков
4 - Редактирование данных ноды
5 - Выдать список(массив) всех непосредственных потомков заданной ноды
6 - Выдать массив всех потомков заданной ноды (если задать 0, то выведется все дерево целиком)
7 - Перемищение ноды в пределах одного родителя
8 - ...
И так начало:
SQL_PREFIX - это префикс для таблиц в базе данных, он берется из файла конфигурации.
parents - это строка вида ' 1/5/12/78/234 ', где числа это номера родительских элементов, последнее число - это ID прямого предка, то есть непосредственного родителя.
LAST MODIFIED 03.02.2006 13:40
PHP:
class MaterializedPath{
var $tbl_prefix;
var $col_id;
var $col_top;
var $col_parents;
var $col_order;
function MaterializedPath($tbl_prefix='',$col_arr='')
{
if($tbl_prefix=='')
{
$this->tbl_prefix = "_nodes";
}
else
{
$this->tbl_prefix = "_".$tbl_prefix;
}
if($col_arr=='')
{
$this->col_id='n_id';
$this->col_top='n_top';
$this->col_parents='n_par';
$this->col_order='n_ord';
}
else
{
$this->col_id=$col_arr['id'];
$this->col_top=$col_arr['top'];
$this->col_parents=$col_arr['par'];
$this->col_order=$col_arr['ord'];
}
}
function GetNodeInfo($id)
{
$result=mysql_query("select ".$this->col_top.",".$this->col_parents.",".$this->col_order." from ".SQL_PREFIX.$this->tbl_prefix." where ".$this->col_id."=$id");
if(mysql_num_rows($result)>0)
{
$res=mysql_fetch_array($result);
$node_info=array(
"id"=>$res[$this->col_id],
"top"=>$res[$this->col_top],
"par"=>$res[$this->col_parents],
"ord"=>$res[$this->col_order]);
}
else
{
$node_info=false;
}
return $node_info;
}
function AddNode($parent_id=0)
{
//error_a - viborka max znachenija ne udalas
//error_b - ne naidena noda s id==$parent_id
//error_c - ne udalos dobavit nodu
//error_d - ne ustanovlen tip AUTO_INCREMENT u polja id
//error_z - nepravilnii vhodjashii parametr!
if(!is_numeric($parent_id)) $new_node='error_z';
else
{
if($parent_id==0) //esli $parent_id==0 to znachit nado dobavit nodu v koren
{
$max_result=mysql_query("select MAX(".$this->col_order.") from ".SQL_PREFIX.$this->tbl_prefix." where ".$this->col_top."=$parent_id");
if(!$max_result) $new_node='error_a';
else
{
if(mysql_num_rows($max_result)>0)
{
$max=mysql_fetch_array($max_result);
$order=$max['MAX('.$this->col_order.')']+1;
}
else $order=1;
$new_parents='0';
}
}
else
{
$parent_result=mysql_query("select ".$this->col_parents." from ".SQL_PREFIX.$this->tbl_prefix." where ".$this->col_id."=$parent_id");
if(mysql_num_rows($parent_result)>0)
{
$parents=mysql_fetch_array($parent_result);
$max_result=mysql_query("select MAX(".$this->col_order.") from ".SQL_PREFIX.$this->tbl_prefix." where ".$this->col_top."=$parent_id");
if(!$max_result) $new_node='error_a';
else
{
if(mysql_num_rows($max_result)>0)
{
$max=mysql_fetch_array($max_result);
$order=$max['MAX('.$this->col_order.')']+1;
}
else $order=1;
$new_parents=$parents[$this->col_parents]."/".$parent_id;
}
}
else $new_node='error_b';
}
if(!isset($new_node)) //esli ne proizoshla oshibka
{
$add_result=mysql_query("insert into ".SQL_PREFIX.$this->tbl_prefix." (".$this->col_top.",".$this->col_parents.",".$this->col_order.") values ($parent_id,'$new_parents',$order)");
if(!$add_result) $new_node='error_c';
else $new_node=mysql_insert_id();
if($new_node==0)$new_node='error_d';
}
}
return $new_node;
}
//vozvrashaem massiv neposredstvennih potomkov ili nomer oshibki
function GetKids($parent_id)
{
// 0 - bad parameter
// 1 - mysql_error
// 2 - no kids
if(!ctype_digit($parent_id)) $tree=0; //bad parametr
$result=mysql_query("select ".$this->col_id.",".$this->col_top.",".$this->col_parents.",".$this->col_order." from ".SQL_PREFIX.$this->tbl_prefix." where ".$this->col_top."=$parent_id order by ".$this->col_order);
if(!$result) $tree=1;
else
{
$num=mysql_num_rows($result);
if($num!=0)
{
$tree=array();
while($res=mysql_fetch_array($result))
{
$tree[]=array("id"=>$res[$this->col_id],"top"=>$res[$this->col_top],"par"=>$res[$this->col_parents],"ord"=>$res[$this->col_order]);
}
}
else $tree=2;
}
return $tree;
}
}
Может, тебе стоит для начала написать сравнительную таблицу - что чем лучше, а что чем хуже?