【问题标题】:Joomla PaginationJoomla 分页
【发布时间】:2014-03-06 18:40:09
【问题描述】:

我已经在一个组件前端列表模板中成功实现了分页框。但是,当我尝试设置列表项的限制时,它不起作用,我想知道错过了什么。

在模型中

  var $_total = null;

  /**
   * Pagination object
   * @var object
   */
  var $_pagination = null;


  function __construct(){

    parent::__construct();

    $mainframe = JFactory::getApplication();

    // Get pagination request variables
    $limit = $mainframe->getUserStateFromRequest('global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int');
    $limitstart = JRequest::getVar('limitstart', 0, '', 'int');

    // In case limit has been changed, adjust it
    $limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0);

    $this->setState('limit', $limit);
    $this->setState('limitstart', $limitstart);
  }


     function _buildQuery(){
         $query = ' SELECT * '
                 . ' FROM #__event '
                 .'Where published = 1'
            ;

         return $query;
    }

      function getData() {
    // if data hasn't already been obtained, load it
            if (empty($this->_data)) {
            $query = $this->_buildQuery();
            $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit'));    
            }
            return $this->_data;
      }


    function getTotal(){
    // Load the content if it doesn't already exist
        if (empty($this->_total)) {
        $query = $this->_buildQuery();
        $this->_total = $this->_getListCount($query);       
        }
        return $this->_total;
     }

    function getPagination(){
     // Load the content if it doesn't already exist
        if (empty($this->_pagination)) {
        jimport('joomla.html.pagination');
        $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit') );
        }
        return $this->_pagination;
    }

在views/view.html.php(本文档的完整版)中

 class EventViewListing extends JViewLegacy
{ 
// Overwriting JView display method
function display($tpl = null) 
{

            $model= & JModelLegacy::getInstance('Event','EventModel');
            $pagination = $model->getPagination();
            $this->assignRef('pagination',   $pagination);



  $JDoc =& JFactory::getDocument();
  $db = JFactory::getDBO();

  $sql = "SELECT * FROM #__event WHERE published = 1 ORDER BY id DESC";
  $db->setQuery($sql);
  $rows = $db->loadObjectList();


  $sql2 = "SELECT * FROM #__user_usergroup_map WHERE group_id = 5 or group_id = 8";
  $db->setQuery($sql2);
  $rows2 = $db->loadObjectList();


   $this->assignRef('rows',$rows);
   $this->assignRef('rows2',$rows2);


 //  $JDoc->setTitle('  ');

    // Display the view
    parent::display($tpl);
}
}

在default.php中

<form action="<?php echo JRoute::_('index.php?option=com_event'); ?>" method="post" name="adminForm">


<?php echo $this->pagination->getListFooter(); ?>
<input type="submit" name="submit" value="GO!"  /> 
</form>

希望有人能帮忙 谢谢!

【问题讨论】:

  • 你能尝试回显 $this->getState('limitstart');死();在你的 getData() 方法中?我想知道它是否得到正确的值。
  • 您使用的是什么版本的 Joomla?
  • Joomla 3.2,我正在构建自己的组件
  • 这是网址,index.php?option=com_event&limitstart=0,我可以选择限制数量并点击'go'更新限制,但listing item数量不会改变,我客人的查询可能是错误的。
  • 那么是分页显示错误还是页面上显示的项目数量错误或者您无法导航到第二页?

标签: php joomla pagination


【解决方案1】:

还需要在查询中使用限制来限制显示到您所在页面的记录数。通常这可以在 setQuery 函数中完成,它允许第二个和第三个参数设置限制大小和开始位置。

  $sql = "SELECT * FROM #__event WHERE published = 1 ORDER BY id DESC";
  $db->setQuery($sql, $model->getState('limitstart'), $model->getState('limit'));
  $rows = $db->loadObjectList();


  // I'm not sure what this query is for, but since it probably isn't supposed to be limited to a set number of items, don't update it's setQuery call.
  $sql2 = "SELECT * FROM #__user_usergroup_map WHERE group_id = 5 or group_id = 8";
  $db->setQuery($sql2);
  $rows2 = $db->loadObjectList();

我认为这可以解决您遇到的问题。


话虽如此,你有许多小问题让你更难做到这一点,或者只是使用过时的做法:

 $limitstart = JRequest::getVar('limitstart', 0, '', 'int');

使用 JRequest::getVar() 已被弃用,并且可能在 Joomla 的未来版本中被删除。而是使用这个:

 $limitstart = JFactory::getApplication()->input->get('limitstart', 0, 'INT');

请注意,参数略有变化。这使用不同的类来解析应用程序的输入。

$this->assignRef('rows',$rows);

以上内容不再需要(据我了解,仅在 PHP4 中需要)。相反,只需执行$this-&gt;rows = $rows;

最后,最大的问题是您并没有真正使用 Joomla 的帮助。

您的模型应该只是从 JModelList 类扩展而来,因为您正在尝试创建事件列表。如果您从该类扩展并正确命名您的函数,Joomla 将完成大部分工作:

  1. _buildQuery 重命名为getListQuery

  2. 几乎删除了模型中的所有其他函数,因为 Joomla 在 JModelList 中的所有函数都在做基本相同的事情。

  3. 更新你的观点:

    class EventViewListing extends JViewLegacy
    { 
    // Overwriting JView display method
    function display($tpl = null) 
    {
    
      $JDoc = JFactory::getDocument();
      $db = JFactory::getDBO();
    
      $this->pagination = $this->get('Pagination');
      $this->rows = $this->get('Items');
    
      $sql2 = "SELECT * FROM #__user_usergroup_map WHERE group_id = 5 or group_id = 8";
      $db->setQuery($sql2);
      $this->rows2 = $db->loadObjectList();
    
      //  $JDoc->setTitle('  '); 
    
         // Display the view
         parent::display($tpl);
     }
     }
    

JViewLegacy 类中的$this-&gt;get() 将调用模型(与视图同名)并运行该模型的方法,该方法以get 开头,后跟函数中的任何单词,因此$this-&gt;get('Pagination') 调用模型getPagination函数。

同样,您在模型中添加的所有功能都已经存在于libraries/legacy/model/list.php 中,所以只需使用它们!

【讨论】:

  • 非常感谢。这对我来说是非常有用的信息。谢谢!
猜你喜欢
  • 2013-03-11
  • 2012-10-02
  • 2011-03-25
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
相关资源
最近更新 更多