【问题标题】:Joomla pagination across different components跨不同组件的 Joomla 分页
【发布时间】:2012-09-28 12:06:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: joomla pagination


    【解决方案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;
        }
    

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

    【讨论】:

    • 我不建议编辑核心 Joomla 文件。它可能会破坏其他功能或在更新期间被覆盖。
    • 是的,核心黑客攻击可能是致命的,但我要如何确保这将在整个站点范围内有效,而不仅仅是在我的组件中。
    • 除了编辑核心 Joomla 文件之外,您还可以将其做成一个插件,这也将占整个网站。
    【解决方案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。开始here

    【讨论】:

      【解决方案3】:

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

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

      如果在 URL 中输入limitstart=0,则该页面的分页将重新开始,这样就解决了菜单之间的问题。

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

      1. 我只是在一些菜单中需要这个,所以我在 菜单链接(编辑菜单,并在“链接类型”选项卡中,放置 CSS “Link CSS Style”字段中的类),在我的例子中是" 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;

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

      奖励:注意我有&amp;limit=12,这将分页限制更改为每页12,没有任何额外的代码!,(之前,我有很多代码实现这一点,并通过将其添加到菜单中,它会计算正确的页码和总数,并过滤查询,好一个 Joomla!)

      【讨论】:

        猜你喜欢
        • 2014-10-31
        • 2012-06-23
        • 2014-06-19
        • 1970-01-01
        • 2015-06-25
        • 1970-01-01
        • 1970-01-01
        • 2014-03-06
        • 1970-01-01
        相关资源
        最近更新 更多