VirtueMart 3.8.8
Google не давал результатов, поэтому я пишу сюда свое решение.
Как воспроизвести:
На странице товаров в категории, если у вас мало товаров, выбираете последнюю страницу и меняете количество товаров для отображения получаете ноль отображаемых товаров.
Ошибку видно даже на официальной демо virtuemart:
http://demo.virtuemart.net/pagination?start=24&limit=60Мне в голову пришла только идея обнулять параметр
limitstart при изменении
limit.
// через ssh находим файл с javascript
$ fgrep -rl display-number components/com_virtuemart/
components/com_virtuemart/views/category/tmpl/default.php
...
// находим там, что метод рендера селекта. Называется он getResultsCounter
$ fgrep -r getResultsCounter .
...
./administrator/components/com_virtuemart/helpers/vmpagination.php: public function getResultsCounter()
...
В файле находим строчки
if(empty($limits) or !is_array( $limits )) {
if($this->_perRow === 1) $this->_perRow = 5;
$limits[$this->_perRow*5] = JHtml::_( 'select.option', JRoute::_( $link.'&limit='.$this->_perRow*5, false ), $this->_perRow*5 );
$limits[$this->_perRow*10] = JHtml::_( 'select.option', JRoute::_( $link.'&limit='.$this->_perRow*10, false ), $this->_perRow*10 );
$limits[$this->_perRow*20] = JHtml::_( 'select.option', JRoute::_( $link.'&limit='.$this->_perRow*20, false ), $this->_perRow*20 );
$limits[$this->_perRow*50] = JHtml::_( 'select.option', JRoute::_( $link.'&limit='.$this->_perRow*50, false ), $this->_perRow*50 );
}
if(!array_key_exists( $this->limit, $limits )) {
$limits[$this->limit] = JHtml::_( 'select.option', JRoute::_( $link.'&limit='.$this->limit, false ), $this->limit );
ksort( $limits );
}
$selected = JRoute::_( $link.'&limit='.$selected, false );
$js = 'onchange="window.top.location.href=this.options[this.selectedIndex].value.slice(0,
this.options[this.selectedIndex].value.lastIndexOf(\'/\'))"';
И обнуляем в них limitstart
if(empty($limits) or !is_array( $limits )) {
if($this->_perRow === 1) $this->_perRow = 5;
$limits[$this->_perRow*5] = JHtml::_( 'select.option', JRoute::_( $link.'&'.$this->prefix.'limitstart=0&limit='.$this->_perRow*5, false ), $this->_perRow*5 );
$limits[$this->_perRow*10] = JHtml::_( 'select.option', JRoute::_( $link.'&'.$this->prefix.'limitstart=0&limit='.$this->_perRow*10, false ), $this->_perRow*10 );
$limits[$this->_perRow*20] = JHtml::_( 'select.option', JRoute::_( $link.'&'.$this->prefix.'limitstart=0&limit='.$this->_perRow*20, false ), $this->_perRow*20 );
$limits[$this->_perRow*50] = JHtml::_( 'select.option', JRoute::_( $link.'&'.$this->prefix.'limitstart=0&limit='.$this->_perRow*50, false ), $this->_perRow*50 );
}
if(!array_key_exists( $this->limit, $limits )) {
$limits[$this->limit] = JHtml::_( 'select.option', JRoute::_( $link.'&limit='.$this->limit, false ), $this->limit );
ksort( $limits );
}
$selected = JRoute::_( $link.'&'.$this->prefix.'limitstart=0&limit='.$selected, false );
B теперь при изменении количества товаров для отображения мы всегда переходим на первую страницу