发新话题
打印

老外写的zend framework(zf)分页程序

老外写的zend framework(zf)分页程序

source:http://www.developpez.net/forums/showthread.php?t=392877

1. ajouter

Citationsql .= " SQL_CALC_FOUND_ROWS ";  
à la ligne 133 dans zend/db/select.php (soit ajouter $_partsInit = array(self::SQL_CALC_FOUND_ROWS => false,) et les méthod dans une class héritage. mais je trouve que ça ne gène pas toujour faire SQL_CALC_FOUND_ROWS dans une requete select.)

2. Modèle
Code :
class Album extends Zend_Db_Table
{
protected $_name = 'album';

        //get le total nombre de résultat
public function getNombre()
{
  $res = $this->_db->fetchRow("SELECT FOUND_ROWS() as total_nombre;");
  return $res["total_nombre"];
}
}
3. Controleur
Code :
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
  $this->view->page_title = "Albums";
  $Album = new Album();
  $page =  (int)$this->_request->getParam('page', 0);
  $where = array();//à ajouter
  $sortby = 'title';//à modifier

  $this->view->albums = $Album->fetchAll($where,$sortby,NUM_PAR_PAGE,$page*NUM_PAR_PAGE)->toArray();

  $pagination = new Custom_Pagination($Album->getCountQuery(),$this->_request);

  $this->view->pagination = $pagination->render();
}
}

NUM_PAR_PAGE est un const,le nombre des résultats par page

4.View (smarty)
Citation:<table>
{section name=album loop=$albums}
<tr bgcolor="#FFFFFF">
<td align="center">{$albums[album].title}</td>
<td align="center">{$albums[album].artist}</td>
</tr>
{/section}
</table>
{$pagination}  
5. class Custom_Pagination
Code :
class Custom_Pagination
{
    private $total_page;
    private $total_nombre;
    private $page_courante;
    private $_request;

function __construct($total_nombre,$request)
    {
      $this->_request = clone $request;
      $this->page_courante = $this->_request->getParam("page");
  $this->total_page = ceil($total_nombre/NUM_PAR_PAGE);
  $this->total_nombre = $total_nombre;
    }
      
    function render()
    {
                //à ajouter les pages précédentes, suivantes .......
  $html = '';
  if($this->total_page > 1)
  {
   for($i=0;$i<$this->total_page;$i++)
   {
    if($i>0)$html.= "/";
    $this->_request->setParam("page",$i);
    $html.= '<a href="'.$this->rebuildUrl().'">'.($i+1).'</a>';
   }
  }
  return $html;
    }
      
    // reconstruire l'URL /album/index/index/page/1,/album/index/index/page/2,...
    //à améliorer. j'ai essayé $this->_request->setParam("page", $num_page); mais $this->_request->getRequestUri ne chage pas, si autre méthod?
    function rebuildUrl()
    {
      $url = $this->_request->getBaseUrl();
      $params = $this->_request->getParams();
      $url .="/".$params["module"];
      $url .="/".$params["controller"];
      $url .="/".$params["action"];
      foreach ( $params as $key=>$value)
      {
       if(!in_array($key,array("module","controller","action")))
       $url.="/".$key."/".$value;
      }
      return $url;
    }
}

autres solutions ??

TOP

发新话题