Форум русской поддержки Joomla!® CMS
28.07.2017, 21:01:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Основной курс по Joomla
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Не отрабатывает условие LIMIT в sql-запросе в методе модели getListQuery ()

 (Прочитано 110 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Inoken
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 29


« : 13.06.2017, 13:05:58 »

Добрый день. В методе модели разрабатываемого компонента getListQuery формирую запрос к базе данных:

Код:
$query->select("*");
$query->from ("#__com_table");
$query->where ("{$where_condition}");
if ($order_query_part) {$query->order("" . $order_query_part); }
$query->setLimit("" . $menu_params->get('displayed_items_number'));

Заданное в настройках компонента (либо пункта меню) количество элементов для отображения извлекатеся и подставляется в метод формирования условия LIMIT - setLimit (). При отображении пункта меню в пользовательской части сайта setLimit() никак не влияет на количество выводимых на страницу элементов, как будто его нет в запросе. Распечатывая запрос посредством:

Код:
echo $query->__toString(); exit ();

в браузере вижу запрос, в котором присутствует условие LIMIT с актуальным значением параметра настройки количества оторажаемых элементов на странице. Данный запрос выполняю через вкладку SQL базы данных Joomla в phpMyAdmin и количество выводимых на экран выбранных из таблицы строк соответствует указанному в LIMIT-e количеству результатов.

Подскажите, пожалуйста, почему он не работет должным образом в Joomla, в чём может быть причина?
« Последнее редактирование: 13.06.2017, 13:32:40 от Inoken » Записан
robert
Профи
********

Репутация: +380/-14
Offline Offline

Пол: Мужской
Сообщений: 4167


« Ответ #1 : 13.06.2017, 13:38:05 »

Потому что OFFSET и LIMIT задаются позже в JModelList::getItems()
Код
$this->cache[$store] = $this->_getList($this->_getListQuery(), $this->getStart(), $this->getState('list.limit'));
Соответственно, вам нужно задать их в сессии посредством $this->setState('list.start') и $this->setState('list.limit').
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +375/-4
Offline Offline

Пол: Мужской
Сообщений: 2814



« Ответ #2 : 13.06.2017, 14:38:14 »

Добавьте в модели такое:
Код
protected function populateState( $ordering = null, $direction = null ){
parent::populateState( $ordering, $direction );
$this->setState( 'list.limit', 20 );
}
Записан
Inoken
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 29


« Ответ #3 : 13.06.2017, 21:30:29 »

добавил вызов метода setState('list.limit', 'значение_из_настроек') в методе getListQuery (), всё заработало. Aleks.Denezh, а чем обусловлен вызов setState в методе populateState ()?!
Записан
robert
Профи
********

Репутация: +380/-14
Offline Offline

Пол: Мужской
Сообщений: 4167


« Ответ #4 : 13.06.2017, 21:49:07 »

Метод populateState() автоматически заполняет состояние модели и вызывается при первом вызове метода getState(), а параметры состояния модели используются не только getListQuery(), но и многими другими методами.
Вы умеете код читать, так его читайте - это занимает не так много времени, во всяком случае, успеете за время ожидания очередного ответа.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +375/-4
Offline Offline

Пол: Мужской
Сообщений: 2814



« Ответ #5 : 13.06.2017, 22:53:27 »

добавил вызов метода setState('list.limit', 'значение_из_настроек') в методе getListQuery (), всё заработало. Aleks.Denezh, а чем обусловлен вызов setState в методе populateState ()?!
Не совсем понял вопрос, метод setState как бы вы сами вызываете )
а метод populateState в вашей модели это банально переопределение метода в родительском классе JModelList который в дебрях себя его и вызывает!
Записан
Inoken
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 29


« Ответ #6 : 14.06.2017, 10:01:38 »

благодарю вас за ответы, с назначением метода populateState() всё прояснилось.
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet