We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 20607
    • 18 Posts
    Иногда полезно и самому подумать smiley!
    Слегка допилил и вышло примерно вот что:
    <?php
    $id = isset($docid) ? $docid : $modx->documentIdentifier;
    $d = isset($depth) ? $depth : 0;
    $fs = isset($fields) ? $fields: 0;
    $da = $modx->getChildIds($id, $d); 
    $df = $modx->getDocuments($da,$fields=($fs)); 
    return (count($da) - count($df));
    ?>

    [[ChildCounter? &docid=`15` &depth=`3` &fields=`isfolder`]]
    Данный вызов выведет только документы, не являющиеся родителями (папками).
    Нужные для вывода дополнительные параметры (unpublished, showinmenu и т.п.) указываем при необходимости в $fields через запятую.
    • попробовал smiley у меня если в папке нет вложенных документов пишет (-1)
        http://modx.im - Russian community
        http://extras.evolution-cms.com - Repository for Evolution
        • 20607
        • 18 Posts
        Quote from: dmi3y at Mar 09, 2009, 12:19 PM

        попробовал smiley у меня если в папке нет вложенных документов пишет (-1)


        угу... Видимо таким образом если пустой документ, то он учитывается сам и отсюда отрицательное значение. Можно просто сделать проверку, если значение <0, то оно нулевое. Может быть кто-нибудь что-то более универсальное задумает?
          • 15286
          • 79 Posts
          [[ChildCounter? &docid=`15` &depth=`3` &fields=`isfolder`]]
          Данный вызов выведет только документы, не являющиеся родителями (папками).
          Нужные для вывода дополнительные параметры (unpublished, showinmenu и т.п.) указываем при необходимости в $fields через запятую.

          Как посчитать документы являющиеся папками? Антипод - isfolder. И каким образом можно Посчитать документы отмеченные для отображения в меню (свойство hidemenu (1 или 0))? Очень надо.
            • 28300
            • 60 Posts
            Пол года прошло, а ошибки в сниппете никто не исправил.
            Сниппет при вызове
            [[ChildCounter? &docid=`15` &depth=`3` &fields=`isfolder`]]
            считает разницу между количеством дочерних документов папки &docId и количеством документов, дочерних &docId, у которых pablic=isfolder, т.е. одновременно опубликованных и являющихся папками или неопубликованных и не являющихся папками.

            Пример рабочего сниппета:
            <?php
            $docid = isset($docid) ? intval($docid) : $modx->documentIdentifier;
            $depth = isset($depth) ? intval($depth) : 0;
            $isfolder = isset($isfolder) ? intval($isfolder): 0;
            $published = isset($published) ? intval($published): 1;
            $davailable = $modx->getChildIds($docid, $depth); 
            $dcount = $modx->getDocuments($davailable, $published, 0, 'id', 'isfolder='.$isfolder); 
            return count($dcount);
            ?>


            Параметры:
            &dicId, &depth - как в оригинале.
            &isfolder - 0 или 1. По умолчанию 0. Если 1 - вернёт количество папок, если 1 - количество документов НЕ папок.
            &published - 0 или 1. По умолчанию 1.
              • 23146
              • 0 Posts
              И я свои 5 копеек может кому пригодится...

              дело в том. что для товаров(или элементов каталога) как правило используется шаблон отличный от родительского по ряду причин.

              вот я и подумал зачем мне считать папки или не папки...
              лучше я буду считать только те дочерние у которых шаблон товаров.
              Таким образом получится всегда точное количество товаров в каталоге.

              вот сниппет
              <?php
              $id = isset($docid) ? $docid : $modx->documentIdentifier;
              $d = isset($depth) ? $depth : 0;
              $published = isset($published) ? $published: 1;
              $tpl= isset($tpl) ? $tpl: 1;
              
              $da = $modx->getChildIds($id, $d);
              
              $count=0;
              
              foreach ($da as $key){
                 $txt = $modx->getDocument($key,'template',$published);
                 if($txt['template'] == $tpl){$count++;}
              }
              
              return $count;
              ?>
              


              пример вызова в чанке Wayfinder:
              [[ChildCounter? &docid=`[+wf.docid+]`&depth=`2`&tpl=`8`]]


              для текущего пункта меню покажет количество дочерних, опубликованных, с ИД шаблона 8, и глубиной поиска 2
                • 28300
                • 60 Posts
                getDocument посылает запрос к БД при каждом вызове. Ваш код очень сильно будет напрягать MySQL-сервер.
                Лучше модифицировать код примерно так:
                <?php
                $docid = isset($docid) ? intval($docid) : $modx->documentIdentifier;
                $depth = isset($depth) ? intval($depth) : 0;
                $isfolder = isset($isfolder) ? intval($isfolder): 0;
                $tpl = isset($tpl) ? $tpl: -1;
                $published = isset($published) ? intval($published): 1;
                $davailable = $modx->getChildIds($docid, $depth);
                
                $where = ($tpl > 0) ? 'template='.$tpl : 'isfolder='.$isfolder;
                $dcount = $modx->getDocuments($davailable, $published, 0, 'id', $where); 
                return count($dcount);
                ?>


                В этом случае параметры:
                &dicId, &depth - как в оригинале.
                &isfolder - 0 или 1. По умолчанию 0. Если 1 - вернёт количество папок, если 1 - количество документов НЕ папок.
                &published - 0 или 1. По умолчанию 1.
                &tpl - если указан, то возвращает количество документов с шаблоном id которого равен &tpl
                  • 23146
                  • 0 Posts
                  спасибо большое.

                  действительно у меня было больше 3000 запросов к базе на этой странице.(по кол-ву документов)

                  в вашем варианте около 100.

                  подскажите как модифицировать что бы было неважно папка это или нет. есть такие товары, что у них еще и дочерние.

                  Мне нужен только шаблон.
                  если ид совпадает тогда считаем.
                    • 28300
                    • 60 Posts
                    В последнем варианте, если указан шаблон, то поле isfolder игнорируется. Если шаблон тоже не важен, то модифицируйте так, чтобы в $where передавалась пустая строка
                      • 23146
                      • 0 Posts
                      моих начальных знаний на понимание строки $where не хватило.

                      но считает сейчас не правильно.

                      Вот моя структура:

                      Каталог авто
                      -AC 7
                      -Acura 7
                      --CL  7
                      ---Машинка первая  8
                      --EL 7
                      ---Машинка вторая  8
                      --Integra 7
                      -Alfa Romeo 7
                      --145 7
                      --CZ 7
                      --Sport Vagon 7
                      


                      цифрами я отметил id шаблонов
                      Нужно напротив Acura вывести количество автомобилей(без марок, только доки с шаблоном ’8’ )

                      вызываю в row чанке Wayfindera
                      [[ChildCounter? &docid=`[+wf.docid+]`&depth=`2`&tpl=`8`]]

                      В результатах вижу:

                      AC 1
                      Acura 2
                      Alfa Romeo 0
                      


                      то есть в альфе и акуре считает правильно, а для АС моделей нет и показывает "1".

                      что не так подскажете?

                      мой вариант считал правильно, но криво конечно по кол-ву запросов