簡體   English   中英

Joomla分頁

[英]Joomla Pagination

我已經在組件前端列表模板中成功實現了分頁框。 但是,當我嘗試設置列表項的限制時,它將不起作用,我想知道錯過了什么。

在模型中

  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>

希望有人能幫助您!

這些限制也需要在查詢中使用,以限制顯示到您所在頁面的記錄數。 通常,這可以在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->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->get()將調用模型(與視圖名稱相同),並運行該模型的方法,該方法以get開頭,后跟函數中的任何單詞,因此$this->get('Pagination')調用模型的getPagination函數。

同樣,您要在模型中添加的所有功能都已經存在於libraries/legacy/model/list.php ,因此只需使用它們即可!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM