Как в модели ограничить количество выводимых материалов для каждой категории?

  • 12 Ответов
  • 585 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

fbr

  • Живу я здесь
  • ******
  • 1274
  • 140
Привет!
Копаюсь в модуле. Задача из нескольких категорий вывести одинаковое количество материалов.

Пытался через модель в helper.php - никак ((

Код: php
...
$model->setState('list.limit', 100);
$model->setState('list.select', 'a.id, a.title, a.alias, a.introtext, a.catid' );
$model->setState('filter.category_id', $params->get('catid', array()));
...

Как задать лимит вывода для каждой категории? Например 10.

Гуглил, думал, решения не нашел ... Устал тупить.
Или стандартно не решается? Отказаться от Joomla-API и писать запрос в рукопашную? (честно, не силен ..)

*

Aponte

  • Осваиваюсь на форуме
  • ***
  • 122
  • 0
Так посмотри как сделано в стандартном модуле, там же есть количество материалов.
Просто добавить туда фильтр по категориям

*

fbr

  • Живу я здесь
  • ******
  • 1274
  • 140
В стандартном модуле задается лимит на общее количество записей.
А мне нужен лимит в каждой категории

*

Taatshi

  • Support Team
  • *****
  • 4779
  • 452
Тут дело не в АПИ. Если Вы придумаете такую структуру запроса к БД, чтоб Вам подошла - перевести на АПИ будет раз плюнуть. Сначала словами напишите как должен выглядеть запрос. Структуру запроса. Логику.

Думаю, нужно писать несколько запросов - к каждой категории, и потом их объединять в один. Если количество категорий не известно заранее - в цикле.
« Последнее редактирование: 05.09.2015, 10:59:40 от Taatshi »
ВЕРСТКА, САЙТЫ ПОД КЛЮЧ, УДАЛЕНИЕ ВИРУСОВ, МИГРАЦИЯ НА JOOMLA 3  /  ОТЗЫВЫ 
Минимальная ставка за платные услуги 1000 рэ Связь: telegram - Taatshi, почта - Taatshi на яндексе.

*

fbr

  • Живу я здесь
  • ******
  • 1274
  • 140
Вот такое решение с переменными нашел в интернете:
Код: sql
set @num := 0, @type := '';

select type, variety, price, @num
from fruits
where
   (@num := if(type = @type, @num + 1, 1)) is not null
   and (@type := type) is not null
   and (@num <= 2);

+--------+----------+-------+------+
| type   | variety  | price | @num |
+--------+----------+-------+------+
| apple   | gala       |  2.79 | 1    |
| apple   | fuji        |  0.24 | 2    |
| orange | valencia |  3.59 | 1    |
| orange | navel     |  9.36 | 2    |
| pear    | bradford |  6.05 | 1    |
| pear    | bartlett   |  2.14 | 2    |
| cherry | bing       |  2.55 | 1    |
| cherry | chelan     |  6.33 | 2    |
+--------+----------+-------+------+


Вывод
Интересно, как это будет выглядеть при использовании апи Joomla

*

Aleks.Denezh

  • Практически профи
  • *******
  • 2785
  • 376
Вот такое решение с переменными нашел в интернете:
Интересно, как это будет выглядеть при использовании апи Joomla
Да обычно будет выглядеть
Спойлер
[свернуть]

 вот только на просторах интернета пишут о больших проблемах в производительности в запросах которые используют IF ELSE
« Последнее редактирование: 05.09.2015, 13:58:06 от Istaan »
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

fbr

  • Живу я здесь
  • ******
  • 1274
  • 140
Подскажите, пожалуйста, как это упрощенно выглядело бы с использованием

$model->setState()

или

$query = $db->getQuery(true)
        ->select(array())
        ... ;

*

robert

  • Профи
  • ********
  • 4002
  • 371
Не совсем понял тему, но IMHO, можно попробовать через foreach выводить каждую категорию.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

fbr

  • Живу я здесь
  • ******
  • 1274
  • 140
Тема простая: есть массив $list, содержащий материалы из разных категорий
Количество определено в $model->setState('list.limit', 20);
Сортировку задал по catId, publish_up

Предположим, категорий 5, в первой категории 15 материалов, во второй 5
Запрос к БД вернет только 2 категории из 5
В foreach прогонять поздно ...
Нужно на уровне запроса задать лимит для каждой категории
Можно, конечно, лимит сделать с запасом 1000 ... Но это как-то расточительно)

Может я логику Неправильно построил?
Подскажете как, плз))
« Последнее редактирование: 05.09.2015, 15:15:55 от fbr »

*

robert

  • Профи
  • ********
  • 4002
  • 371
Если у вас модуль и нет необходимости в JPagination, то я бы просто сделал свой запрос в БД с использованием UNION.
Если вы хотите использовать Joomla API (в данном случае метод getItems(), я подозреваю), то можно попробовать прогонять через foreach, как я писал выше, но не результат запроса, а массив ID нужных категорий, каждый раз задать нужный лимит и получить нужное количество материалов конкретной категории. Это предположение, не проверял еще, но думаю, что должно сработать.

P.S. Проверил, работает.
« Последнее редактирование: 05.09.2015, 21:34:25 от robert »
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

robert

  • Профи
  • ********
  • 4002
  • 371
Вот рабочий код
Код: php-brief
$model=JModelLegacy::getInstance('Articles','ContentModel');
$items=array();
$cats2lims=array('8'=>'2','2'=>'3');
foreach($cats2lims as $cat=>$lim){
$model->setState('filter.category_id',$cat);
$model->setState('list.limit',(int)$lim);
$subitems=$model->getItems();
$items=array_merge($items,$subitems);
}
Выводит 2 материала из категории 8 и 3 - из категории 2, $items и есть ваша $list.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Aleks.Denezh

  • Практически профи
  • *******
  • 2785
  • 376
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

robert

  • Профи
  • ********
  • 4002
  • 371
О ужас )
:(

P.S. Istaan, все-таки почему этот код навел на вас такой ужас? Уточню, я это делал в view компонента с целью выводить на каждой странице по 2 материала из категории 8 и 3 - из категории 2.
« Последнее редактирование: 06.09.2015, 11:36:58 от robert »
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.