PDA

Просмотр полной версии : Собираем все записи дочерних узлов


Sergey M Nikitin
16.01.2008, 18:48
Представим что есть каталог вида при этом вложенность у него переменная


+ Узел 1
+-+ Узел 2
+- Узел 3
+ Узел N


Можно ли как-то средствами TS сделать (без USER func) в CONTENT либо RECORDS собрать все записи дочерних узлов, другими словами чтобы в узле 1 возваращались все записи с PID 1,2,3 узла, во втором 2,3 и т.д., в следствии того что вложенность у нас не известной величины то вариант pidInList.cObject = CONTENT (и выборка всех узлов с pidInList = this не подходит) так как надо двигатся бесконечно в низ по дереву, а не на один уровень.

Если реализоовать через USER то сталкиваюсь с такой проблемой что одним запросом к базе выбрать все дочернии узлы не реально (либо я еще не придумал такой запрос) приходиться рекурсивно проверять все узлы - приводит к тому что количество выборок более чем 3 уровня становятся в кол-ве всех узлов - что не есть гуд ... тормоза ... может все таки можно как то грамотно составить запрос к базе ?

У кого есть решение плииз помогите !

Pavel Antonov
16.01.2008, 18:59
Никак. Что бы сделать грамотный запрос, сначала должна быть грамотная структура базы данных, чего в структуре БД TYPO3 нет в реализации деревьев.

Делайте кучу запросов... сама TYPO3 так же делает при построении HMENU.

Sergey M Nikitin
17.01.2008, 16:07
Функция возвращает список всех дочерних узлов для pidInList в CONTENT

smCntnt = CONTENT
smCntnt{
table = smTable
select{
pidInList.cObject = USER
pidInList.cObject{
userFunc = user_commonfuns->childNodes
}
}
}


class user_commonfuns extends tslib_pibase{
//getChilds properties
var $uidList = array();
var $uidCheckList = array();

function arrayToCommaList($arr,$sep = ","){
foreach ($arr as $v){
$result .= $v.",";
}
$result = rtrim($result,",");
return $result;
}

//Call from TS user_commonfuns->childNodes
function childNodes($conf,$content){
global $TSFE;
$this->uidCheckList[] = $TSFE->id;
$this->getChilds();
return $this->arrayToCommaList($this->uidList);
}

function getChilds(){
$curUid = array_pop($this->uidCheckList);
$this->uidList[] = $curUid;

$query = "SELECT uid FROM pages WHERE pid = ".$curUid." AND deleted <> 1 AND hidden <> 1";
$res = $GLOBALS['TYPO3_DB']->sql(TYPO3_db, $query);
while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)){
$tempUids[] = $row['uid'];
$this->uidCheckList[] = $row['uid'];
}
if(count($this->uidCheckList) != 0){
$this->getChilds();
}
}
}

void
17.01.2008, 22:31
Ну зачем изобретать велосипед, если в tslib_cObj есть метод getTreeList ?

Pavel Antonov
17.01.2008, 22:47
Ну зачем изобретать велосипед, если в tslib_cObj есть метод getTreeList ?

Да можно обойтись и одним HMENU, собрать строку id очень просто.