[***РЕШЕНО***] Как найти ID дочерниx ресурсов всех уровней с 'isfolder' => 1 и 'published' => 1 ?

$parentId = 100;
$childs = $modx->getChildIds($parentId,10,array('context' => 'web'));
Выводит массив всех id дочерних ресурсов, у которых главный родитель имеет id:100.

Как получить id всех дочерних опубликованных ресурсов контейнеров?
Дмитрий
24 декабря 2019, 19:27
modx.pro
1
1 791
0

Комментарии: 6

Алексей Соин
25 декабря 2019, 07:07
+1
можно через pdoResources

$parentId = 100;
$childs = $modx->runSnippet('pdoResources',array(
    'parents' => $parentId,
    'returnIds' => 1,
    'limit' => 0
));
там по умолчанию параметры стоят 'isfolder' => 1 и 'published' => 1
    Дмитрий
    25 декабря 2019, 15:36
    +1
    $parentId = 100;
    $childs = $modx->runSnippet('pdoResources',array(
        'parents' => $parentId,
        'returnIds' => 1,
        'limit' => 0
    ));
    return $childs;
    В консоли выдает вот что:
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «ASC»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «DESC»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «ASC»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «DESC»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «is equal to»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «is not equal to»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «less than»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «less than or equal to»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «greater than or equal to»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «is empty»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «is not empty»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «is null»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «is in array»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «is between»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «System default»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: "-1 (relative to site_url)"
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «full (absolute, prepended with site_url)»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «abs (absolute, prepended with base_url)»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «http (absolute, forced to http scheme)»
    [2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
    Language string not found: «https (absolute, forced to https scheme)»
    53,41,42,43,46,51,50,44

    SQL time: 0,0008 s
    SQL queries: 5
    PHP time: 0,0184 s
    Total time: 0,0192 s
    Memory: 0 MB
    если выключить ошибки, то выдает:
    53,41,42,43,46,51,50,44
    не все ресурсы, а кроме того некоторые НЕ контейнеры
      Алексей Соин
      25 декабря 2019, 15:47
      0
      $parentId = 100;
      $childs = $modx->runSnippet('pdoResources',array(
          'parents' => $parentId,
          'returnIds' => 1,
          'limit' => 0,
          'where' => '{"isfolder:=":1}'
      ));
      return $childs;
      так выведет только контейнеры
        Дмитрий
        25 декабря 2019, 16:02
        +1
        Благодарю!
        Да, так выводит контейнеры, но также и кучу(DEBUG @ /… Как от них избавиться?
        Кроме того 5 SQL queries. Total time в районе 0,02 s
        Если убрать кучу(DEBUG @ /..., то как одно из решений очеь даже нормальное!

        В общем сделал вот так. Публикую, может кому пригодится! Делал сам, так как нигде не нашел подобного универсального решения.
        Если можно как-то улучшить, то буду признателен за публикацию примера с улучшением.

        Вот сам код.
        //получение массива ВСЕХ дочерних ресурсов контейнеров	
                $parentId = 100;// id ресурса, у которого ищем потомков
        		$childIds= $modx->getChildIds($parentId,10,array('context' => 'web'));
        		$res = array();
        		$q = $modx->newQuery('modResource', array('modResource.id:IN' => $childIds, 'isfolder' => 1, 'published' => 1));
        		$q->select('id');
        		if ($q->prepare() && $q->stmt->execute()) {
        			while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
        				$res[] = $row['id'];
        			}
        		}
        		$childIds = $res; // получаем массив с id дочерних опубликованных ресурсов контейнеров всех уровней
        Так всего SQL queries: 1

        Выводит все дочерние опубликованные ресурсы контейнеры всех уровней
        Array
        (
        [0] => 41
        [1] => 42
        [2] => 43
        [3] => 46
        )

        SQL time: 0,0001 s
        SQL queries: 1
        PHP time: 0,0104 s
        Total time: 0,0106 s
        Memory: 0 MB
          Алексей Соин
          25 декабря 2019, 16:11
          0
          мне кажется в коде опечатка, сначала идет срочка:
          $childIds= $modx->getChildIds($parentId,10,array('context' => 'web'));
          затем:
          $childIds = $res;
          первая, наверное, лишняя?
            Дмитрий
            25 декабря 2019, 16:30
            0
            нет, это не опечатка, это я уже из рабочего кода с сайта взял часть, которая отвечает за вывод id опубликованных дочерних ресурсов контейнеров… там далее по коду нужна переменная $childIds

            Если чисто для тестирования в консоли, то тогда так:
            //получение массива ВСЕХ дочерних ресурсов контейнеров	
                    $parentId = 100;// id ресурса, у которого ищем потомков
            		$childIds= $modx->getChildIds($parentId,10,array('context' => 'web'));
            		$res = array();
            		$q = $modx->newQuery('modResource', array('modResource.id:IN' => $childIds, 'isfolder' => 1, 'published' => 1));
            		$q->select('id');
            		if ($q->prepare() && $q->stmt->execute()) {
            			while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
            				$res[] = $row['id'];
            			}
            		}
            		 
            print '<pre>';
            print_r($res);// получаем массив с id дочерних опубликованных ресурсов контейнеров всех уровней
            print '</pre>';
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    6