因为分页使用getUserStateFromRequest
方法来获取limit
andlimitstart
变量,所以我遇到了一个问题,当我从一个组件导航到另一个组件时,我会看到一条没有找到项目的消息。
澄清一下,我有一个产品组件,其中列出了 3 页的产品。然后我有一个包含 2 页分支信息的分支组件。因此,如果我导航到产品列表中的第三页,然后转到分支组件,则不会显示任何内容。
有谁知道如何阻止这种情况发生?有什么办法可以清除会话数据?
因为分页使用getUserStateFromRequest
方法来获取limit
andlimitstart
变量,所以我遇到了一个问题,当我从一个组件导航到另一个组件时,我会看到一条没有找到项目的消息。
澄清一下,我有一个产品组件,其中列出了 3 页的产品。然后我有一个包含 2 页分支信息的分支组件。因此,如果我导航到产品列表中的第三页,然后转到分支组件,则不会显示任何内容。
有谁知道如何阻止这种情况发生?有什么办法可以清除会话数据?
为了防止编辑核心文件,但效果仅限于您的扩展(因此其他扩展可能会加载到错误的页面,但不是您的),如果您的模型扩展了模型列表,请覆盖该getStart()
方法:
public function getStart()
{
$store = $this->getStoreId('getstart');
$input = JFactory::getApplication()->input;
$start = $limitstart = $input->getInt('limitstart', 0);
$this->setState('list.start', $limitstart); // maybe redundant
$limit = $this->getState('list.limit');
$total = $this->getTotal();
if ($start > $total - $limit)
{
$start = max(0, (int) (ceil($total / $limit) - 1) * $limit);
}
// Add the total to the internal cache.
$this->cache[$store] = $start;
return $this->cache[$store];
}
如果您想要一个适用于系统范围和所有扩展的解决方案,您应该能够使用插件中的实现覆盖 modellist。从这里开始。
我最终做的是,在 library/joomla/application/application.php 文件的第 624 行中,我添加了以下几行
$this->setUserState('option','default');
$curr_comp = JRequest::getCmd( 'option' );;
if($this->getUserState('option') != $curr_comp)
{
$this->setUserState($option . 'limitstart',0);
$this->setUserState('option',$curr_comp);
}
所以整个函数读取这个,
public function getUserStateFromRequest($key, $request, $default = null, $type = 'none')
{
$this->setUserState('option','default');
$curr_comp = JRequest::getCmd( 'option' );
if($this->getUserState('option') != $curr_comp)
{
$this->setUserState($option . 'limitstart',0);
$this->setUserState('option',$curr_comp);
}
$cur_state = $this->getUserState($key, $default);
$new_state = JRequest::getVar($request, null, 'default', $type);
// Save the new value only if it was set in this request.
if ($new_state !== null)
{
$this->setUserState($key, $new_state);
}
else
{
$new_state = $cur_state;
}
return $new_state;
}
目前这似乎工作正常。但请在实际站点上实施之前进行测试
这是一个老问题,但我只是遇到了与 OP 相同的问题,但在我的情况下是 Joomla 3.4.3。
经过大量挖掘和测试,我发现了一个不涉及任何插件或核心更改的解决方案:
如果您limitstart=0
输入 URL,该页面的分页将重新启动,这解决了菜单之间的问题。
实现这一点的方法可以是使用 javascript,也可以通过覆盖菜单模块,我选择了覆盖:
"
video-area"
(不带引号)。html
模板的文件夹中,在我的情况下它是菜单模块,所以只需添加 mod_menu 文件夹templatefolder/html/mod_menu
:)在模块(default_component.php
)的组件部分的覆盖中,检查我们是否有 CSS 类,如果有,将额外的查询添加到 URL(我编辑过case 0
):
case 0: $paginationLinks = ""; if(isset($class) && strpos($class, '
video-area') !== false){ $paginationLinks =
"?limitstart=0&limit=12"; } ?><a <?php echo $class; ?>href="<?php
echo $item->flink; ?><?php echo $paginationLinks;?>" <?php echo
$title; ?>><span><?php echo $linktype; ?></span></a><?php break;
而已!它解决了我的问题,甚至分页链接都有额外的查询:)
奖励:请注意,我有&limit=12
,这将分页限制更改为12
每页,没有任何额外的代码!,(之前,我有很多代码来实现这一点,通过将其添加到菜单中,它会计算正确的页码和总计,并过滤查询,不错的 Joomla!)