2014-02-09 43 views
1

我已經在組件前端列表模板中成功實現了分頁框。然而,當我嘗試設置上市項目的限制,它不會工作,我不知道什麼是錯過了。Joomla分頁

在如default.php模型

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; 
    } 

的意見/ 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); 
} 
} 

<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> 

希望有人能幫到 謝謝!

+0

你可以嘗試echo $ this-> getState('limitstart');死();在你的getData()方法?我想知道它是否得到了正確的價值。 – di3sel

+0

您使用的是Joomla的哪個版本? –

+0

Joomla 3.2,我正在構建我自己的組件 – Soya

回答

4

限制還需要在查詢中使用,以限制顯示在您所在頁面上的記錄數量。通常,這可以在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. 重命名_buildQuerygetListQuery

  2. 幾乎刪除模型中的所有其他函數,因爲Joomla擁有JModelList中的所有函數,它們的功能基本相同。

  3. 更新您的視圖,以這樣的:在JViewLegacy類將調用模型(具有相同的名稱作爲視圖)

    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); 
    } 
    } 
    

$this->get()和運行模式,與get啓動的方法其次是任何字在功能,所以$this->get('Pagination')調用模型getPagination函數。

同樣,您在模型中添加的所有功能都已存在於libraries/legacy/model/list.php中,所以請使用它們!

+0

非常感謝。這對我來說非常有用。謝謝! – Soya