5

因为分页使用getUserStateFromRequest方法来获取limitandlimitstart变量,所以我遇到了一个问题,当我从一个组件导航到另一个组件时,我会看到一条没有找到项目的消息。

澄清一下,我有一个产品组件,其中列出了 3 页的产品。然后我有一个包含 2 页分支信息的分支组件。因此,如果我导航到产品列表中的第三页,然后转到分支组件,则不会显示任何内容。

有谁知道如何阻止这种情况发生?有什么办法可以清除会话数据?

4

3 回答 3

1

为了防止编辑核心文件,但效果仅限于您的扩展(因此其他扩展可能会加载到错误的页面,但不是您的),如果您的模型扩展了模型列表,请覆盖该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。从这里开始。

于 2013-12-31T01:09:39.413 回答
1

我最终做的是,在 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;
    }

目前这似乎工作正常。但请在实际站点上实施之前进行测试

于 2012-10-08T11:45:05.560 回答
0

这是一个老问题,但我只是遇到了与 OP 相同的问题,但在我的情况下是 Joomla 3.4.3。

经过大量挖掘和测试,我发现了一个不涉及任何插件或核心更改的解决方案:

如果您limitstart=0输入 URL,该页面的分页将重新启动,这解决了菜单之间的问题。

实现这一点的方法可以是使用 javascript,也可以通过覆盖菜单模块,我选择了覆盖:

  1. 我只是在一些菜单中需要这个,所以我在菜单链接中放置了一个 CSS 类(编辑菜单,并在“链接类型”选项卡中,将 CSS 类放在“链接 CSS 样式”字段中),在我的例子中是是" video-area"(不带引号)。
  2. 添加覆盖(将模块添加到html模板的文件夹中,在我的情况下它是菜单模块,所以只需添加 mod_menu 文件夹templatefolder/html/mod_menu:)
  3. 在模块(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!)

于 2015-08-18T11:05:07.157 回答