Russian TYPO3 community

Russian TYPO3 community (http://forum.typo3.ru/index.php)
-   TypoScript практикум (http://forum.typo3.ru/forumdisplay.php?f=27)
-   -   Собираем все записи дочерних узлов (http://forum.typo3.ru/showthread.php?t=5760)

Sergey M Nikitin 16.01.2008 18:48

[solved] Собираем все записи дочерних узлов
 
Представим что есть каталог вида при этом вложенность у него переменная

Код:

+ Узел 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
    }
  }
}

PHP код:

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

Цитата:

Сообщение от void (Сообщение 17128)
Ну зачем изобретать велосипед, если в tslib_cObj есть метод getTreeList ?

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


Часовой пояс GMT +4, время: 15:25.

Работает на vBulletin® версия 3.8.1.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot