Joomla跨越不同组件的分页

时间:2012-10-08 08:57:15

标签: joomla pagination

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

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

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

3 个答案:

答案 0 :(得分: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;
    }

目前这似乎工作得很好。但请在实际网站上实施之前进行测试

答案 1 :(得分:1)

要防止编辑核心文件,但效果仅限于您的扩展名(因此其他扩展程序可能会在错误的页面加载,而不是您的加载),并且如果您的模型扩展为modellist,请覆盖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。开始here

答案 2 :(得分:0)

这是一个老问题,但我和OP有同样的问题,但在我的情况下使用Joomla 3.4.3。

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

如果您将limitstart=0放入网址,则会为该网页重新启动分页,这样就解决了菜单之间的问题。

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

  1. 我只是在一些菜单中需要这个,所以我把一个CSS类放入了 菜单链接(编辑菜单,然后在"链接类型"选项卡中放置CSS "链接CSS样式"中的类在我的情况下,它是" video-area"(没有引号)。
  2. 添加覆盖(将模块添加到模板的html文件夹中, 在我的情况下,它是菜单模块,所以这是一个添加的问题 mod_menu文件夹:templatefolder/html/mod_menu
  3. 在模块的组件部分的覆盖中     (default_component.php),检查我们是否有CSS类,if     所以,将额外的查询添加到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;

  4. 那就是它!它解决了我的问题,甚至分页链接都有额外的查询:)

    BONUS :请注意我有&limit=12,这会将页面的限制更改为每页12,而不需要任何额外的代码!(之前,我有一个很多代码实现这一点,并通过添加到菜单,它计算正确的页码和总数,并筛选查询,漂亮的Joomla!)