Как в ТДС определить кол-во элементов текущей группы?

#
Как в ТДС определить кол-во элементов текущей группы?
Прошу помощи с решением тривиальной задачи.

Как в ТДС оперделить кол-во элементов по ID текущей группы?
Задача в том, что я хочу реализовать вывод элементов из всех подгрупп ниже по иерархии при условии, если кол-во элементов текущей группы равно 0.

Например:
Категория 1 (0 элементов)
подкатегория 1_1 (3 элемента)
подкатегория 1_2 (0 элементов)
- подкатегория 2_1 (4 элемента)...

При просмотре Категории 1 нужно выбрать все элементы, что ниже (подкатегория 1_1, подкатегория 1_2, подкатегория 2_1...)
При просмотре подкатегории 1_1 выводить только ее элементы
При просмотре подкатегории 1_2 выводить все, что ниже (подкатегория 2_1...)

Сам запрос выборки из подкатегорий, в принципе, напишу, но не знаю как организовать проверку на кол-во элементов в группе.

Встречал решение для 5ку от г-на Котова, но оно основано на полной выборке всего дерева или его части с последующей проверкой наличия элементов силами xsl, что не очень красиво на мой взгляд (постоянная выгрузка полного xml даже если элементы есть в текущем разделе..)

Может как-то можно одним метобом получить кол-во элемнтов текущей группы прямо в php?

Зарание спасибо!
#
Re: Как в ТДС определить кол-во элементов текущей группы?
С проверками разобрался, получил все id групп всех дочерних элементов. Теперь пытаюсь получить все элементы, у которых id группы попадает в массив, который я получил, но ничего не выводится. Смотрю сгенеренный запрос, а там informationsystem_group_id = 1!


        $Informationsystem_Controller_Show->group($arr); // передаем массив полученных дочерних id групп

        $Informationsystem_Controller_Show->informationsystemItems()
            ->queryBuilder()
            //->where('informationsystem_items.informationsystem_group_id', 'IN', $arr) // пробовал и так - пофигу  
            ->clearOrderBy()
            ->orderBy('informationsystem_items.id', 'ASC');


Подскажите почему нет реакции на массив групп? Запрос работает если указать ->group(FALSE) или ->group((int)ID)...
#
Re: Как в ТДС определить кол-во элементов текущей группы?
Фух.. решил все проблемы, реализовал то, что задумал.
Чтобы заработало условие
->where('informationsystem_items.informationsystem_group_id', 'IN', $arr)
в queryBuilder'е
пришлось сперва сказать
$Informationsystem_Controller_Show->group(FALSE);

А вот передача сюда массива ID групп так и не заработала (хотя где-то в доке встречал упоминание, про то, что можно передать массив ID групп)

В итоге заработалтакой вариант:

       // Передаем в метод ID текущей группы и получаем массив ID'ков всех дочерних групп
       $arr = getChildsRecursive($Informationsystem_Controller_Show->group);
      
       //$Informationsystem_Controller_Show->group($arr);
       // Убираем ограничение по одной группе (хз почему недостаточно передать сюда просто массив групп, по доке можно - на деле не пашет)
       $Informationsystem_Controller_Show->group(FALSE);

       //$Informationsystem_Controller_Show->group($arr);

       $Informationsystem_Controller_Show->informationsystemItems()
            ->queryBuilder()
            ->where('informationsystem_items.informationsystem_group_id', 'IN', $arr)
            ->clearOrderBy()
            ->orderBy('informationsystem_items.id', 'DESC');


Хотел еще добавить limit(20). В xml пришло <limit>20</limit>, но выборка получилась вся. Как получить только 20 элементов? Что нужно добавить в запрос? Может необходимо что-то наподобе "clearOrderBy"?
Модератор
#
Re: Как в ТДС определить кол-во элементов текущей группы?
Valette писал(а):
А вот передача сюда массива ID групп так и не заработала (хотя где-то в доке встречал упоминание, про то, что можно передать массив ID групп)

Такой возможности нет, массив Вы можете передавать в queryBuilder() как значение для where()
#
Re: Как в ТДС определить кол-во элементов текущей группы?
HostCMS писал(а):
Такой возможности нет, массив Вы можете передавать в queryBuilder() как значение для where()

Да, я так и поступил, просто тут http://www.hostcms.ru/documentation/guide/modules/informationsystem/tags/ (про метки) сказано:

"group($id) — принимает идентификатор информационной группы или массив идентификаторов;"
Я и подумал, что для Informationsystem_Controller_Show() реализовано также. Спасибо за опровержение моих мыслей

А с limit'ом не подскажете как быть?
Подставляю ->limit(20), а приходят в xml всеравно все что есть...
Модератор
#
Re: Как в ТДС определить кол-во элементов текущей группы?
Valette,
Может Вы limit() после show() вызываете? Покажите целиком код.
#
Re: Как в ТДС определить кол-во элементов текущей группы?
Ну, например вот так пробовал:

$Informationsystem_Controller_Show
    ->xsl(
        Core_Entity::factory('Xsl')->getByName($xslName)
    )
    ->groupsMode('all')
    ->itemsProperties(TRUE)
    ->groupsProperties(TRUE)
    ->limit(20)
    ->show();

В xml-то выбирается 20 элементов - тут все верно, но далее происходят странности...

Дело в том, что оно в xml приходит как значение, которое используется для условия выводить или нет ссылки на следующие страницы
<xsl:if test="total &gt; 0 and limit &gt; 0">
и тем самым становится непонятен вообще смысл limit(), ибо по-сути, оно выполняет тоже самое, что и items_on_page. Я предпологал, что если задать limit в запросе, то в xml придут данные с учетом ограничений Т.е. total будет равен макс. выбранному кол-ву элементов. Если в системе всего 51 элемент, то поставив limit(в 40) я расчитывал получить в xml total = 40, сгенерить 1 страницу и ссылку на следующую (исходя из формулы total/items_on_page...) А по факту имеем сейчас total = томуже кол-ву, что и без указания limit(), а сам limit работает как ограничение по элементам на странице..

Проправьте меня если это не так, но в xsl-шаблон в раздел пагинации я до сегодня руки не запускал свои...

Проблему я решил заменой значения "ОтображатьСсылкиНаСледующиеСтраницы" на 0 когда это нужно.
Модератор
#
Re: Как в ТДС определить кол-во элементов текущей группы?
Valette писал(а):
А по факту имеем сейчас total = томуже кол-ву, что и без указания limit(), а сам limit работает как ограничение по элементам на странице..

total на то и называется total, чтобы хранить общее количество элементов для отображения.
Авторизация