Разделы

  
 

[evo] вытащить ID документов определенного уровня вложенности

Добрый день, возникла потребность тащить докменты с конкретного уровня вложенности. Стандартный метод getChildIds тащат с 1 по заданный уровень.

В итоге благодаря SSDTyphon, появились два снипета:

1) Тащит только id документов из базы и выдает их через ","
<?php
if(!isset($id)) $id = 2;
if(!isset($level)) $level = 1;

if ($level > 1){
    $tblsc = $modx->getFullTableName('site_content');
    $access = "AND lvl{$level}.deleted=0 AND lvl{$level}.published=1";
    $inner = '';
    for ($i = $level-1; $i > 0; --$i){
        $nextlvl = $i+1;
        $inner .= "INNER JOIN $tblsc AS lvl{$i} ON lvl{$nextlvl}.parent=lvl{$i}.id AND lvl{$i}.deleted=0 AND lvl{$i}.published=1 ";
    }
    $sql = "SELECT lvl{$level}.id FROM $tblsc AS lvl{$level} " . $inner . "WHERE lvl1.parent=$id $access;";
    $res = $modx->db->query($sql);

    $children = array();
    while($childId = $modx->db->getValue($res)){
        $children[] = $childId;
    }
}
else{
    $children = $modx->getChildIds($id, 1);
}

return implode(',', $children);
?>


2) По сути аналог $modx->getDocuments(), где в $id заданы все документы уровня, поменяв строчку $child[] = $v['id']; на любую нужную, можно легко вытащить нужные поля документов. Можно менять SQL запрос, тогда можно ограничивать выборку еще сильнее.

<?php
if(!isset($id)) $id = 2;
if(!isset($level)) $level = 5;

if($level>2) {   
    
if(!function_exists('LevelChildren')){
        function LevelChildren($docId, $levels){
          global $modx;
          $tblsc = $modx->getFullTableName('site_content');
          $access = "AND lvl{$levels}.deleted=0 AND lvl{$levels}.published=1";
          $inner = '';
          for ($i = $levels-1; $i > 1; --$i){
            $nextlvl = $i+1;
            $inner .= "INNER JOIN $tblsc AS lvl{$i} ON lvl{$nextlvl}.parent=lvl{$i}.id AND lvl{$i}.deleted=0 AND lvl{$i}.published=1 ";
          }
          $sql = "SELECT lvl{$levels}.* FROM $tblsc AS lvl{$levels} " .
             $inner .
             "WHERE lvl2.parent=$docId $access;";
          $res = $modx->db->query($sql);
          $res = $modx->db->makeArray($res);
          foreach($res as $v) {
                    $child[] = $v['id'];
                    }

        return implode(",",$child);
}

}
    $levelID = LevelChildren($id,$level);
    return $levelID;
}
else { return '';}
?>


Вызов: [[getLevelChild&? &id = `2`&level = `5`]]

id — ID родителя. level = `5` — уровень относительно родителя (учитывая, что родитель на 1 уровне, а не 0)

Оригинал тут

ПС изначально использовал для той же цели конструкцию:

$array1 = $modx->getChildIds($parent,$depth);
$array2 = $modx->getChildIds($parent,$depth-1);
$childParents = array_diff($array1, $array2);

API - getChildIds

метод имеет синтаксис:
Array getChildIds(mixed $id[, int $depth[, array $children]]); 

неясно что такое третий параметр $children. при дебагинге ничего не выводит.
может кто знает? (желательно с примером)
  • 0
  • 19 января 2011, 11:14
  • iAlex
  • 2