Zend Frameworkでページナビゲーションを作成する

私が非常に若かった頃、Zend_paginatorが何であり、実際Zendが何であるかを知りませんでした。

ページナビゲーションの作成は私にとってだけの問題ではなく、少なくとも日常的で厄介な職業でした。 しかし、ZFを勉強していたとき、素晴らしいことがわかりました。 それでは、少し理解しましょう。



基礎として、以前に書かれた記事を取り上げそれに基づいてページナビゲーション付きのゲストブックを作成しようとします。



データベースから始めましょう:

簡単にするために、id、name、messageの3つのフィールドのみを取ります

そのようなダンプが判明します:

CREATE TABLE `guestbook` (

`id` int(11) NOT NULL auto_increment,

`name` varchar(16) default NULL,

`message` text,

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;







ディレクトリ構造

このような構造があります。

新しいものからは、my_pagination.phtmlのみがここに表示されます。これは、「ナビゲーション」のビューを含むヘルパーファイルですが、それについてもう少し詳しく説明しています。



Guestbook.phpファイルには、作業するテーブルの指示が含まれています。

/application/models/Guestbook.php

<?php

class Guestbook extends Zend_Db_Table

{

protected $_name = 'guestbook';

}









IndexControllerファイルには、indexAction、addAction、およびinitの3つのメソッドが含まれています。

/application/controllers/IndexController.php

<?php

class IndexController extends Zend_Controller_Action

{

function indexAction(){

$gb = new Guestbook();

$num = 10;

$page = $this->_getParam('page');

if($page<1 or empty($page)){$page = 1;}

$select = $gb->select()->from('guestbook',array('count'=>'COUNT(*)'))->order('id DESC ');

$total = $this->view->table = $gb->fetchRow($select)->toArray();

$start = $page*$num-$num;

$select = $gb->select()->from('guestbook')->order('id DESC ')->limit($start,$num);

$result = $this->view->table = $gb->fetchAll($select)->toArray();

$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_array($result));

$paginator->setCurrentPageNumber($this->_getParam($page));

$paginator->setItemCountPerPage($num);

$paginator->setView($this->view);

Zend_View_Helper_PaginationControl::setDefaultViewPartial('/my_pagination.phtml');

$this->view->paginator = $paginator;

}

function addAction(){

if($this->_request->isPost()){

$filter = new Zend_Filter_StripTags();

$name = trim($filter->filter($this->_request->getPost('name')));

$message = trim($filter->filter($this->_request->getPost('message')));

if(!empty($name) && !empty($message)){

$data = array(

'name' => $name,

'message' => $message

);

$gb = new Guestbook();

$gb->insert($data);

$this->_redirect('/');

}

} else $this->view->errorMessage = " , .";

}

function init(){

Zend_Loader::loadClass('Zend_Filter_StripTags');

Zend_Loader::loadClass('Guestbook');

Zend_Loader::loadClass('Zend_Paginator');

Zend_Loader::loadClass('Zend_Paginator_Adapter_array');

Zend_Loader::loadClass('Zend_View_Helper_PaginationControl');

}

}









addActionメソッドとinitメソッドは考慮されません。すべてが平凡だからです。 indexActionに興味があります。これについてさらに詳しく検討します。

$gb = new Guestbook();

$num = 10;

$page = $this->_getParam('page');

if($page<1 or empty($page)){$page = 1;}

$select = $gb->select()->from('guestbook',array('count'=>'COUNT(*)'))->order('id DESC ');

$total = $this->view->table = $gb->fetchRow($select)->toArray();

$start = $page*$num-$num;

$select = $gb->select()->from('guestbook')->order('id DESC ')->limit($start,$num);

$result = $this->view->table = $gb->fetchAll($select)->toArray();











$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_array($result));





アダプタで$ paginatorオブジェクトを作成します。



$paginator->setCurrentPageNumber($page)





ここで、現在のページの番号を設定します。これは、パラメーターとしてリンクに渡されます(/インデックス/ページ/ <ページ番号>)。



$paginator->setView($this->view);





私たちが持っているビューはこのアクションを使用するビューであるため、paginatorのビューを設定します。$ this-> viewと記述します。



$paginator->setItemCountPerPage($num);





1ページに投稿数を設定します。 デフォルトでは、すでに10になっています(ここでは例として行われています)。



Zend_View_Helper_PaginationControl::setDefaultViewPartial('/my_pagination.phtml');

$this->view->paginator = $paginator;






ここにヘルパーファイルを含め、ページネータを心に渡します。 index.phtmlファイルでは、この$ this-> paginatorのようにアクセスできます。



/application/scripts/index/index.phtml

<?php

if (count($this->paginator)): ?>

<?php foreach ($this->paginator as $item):?>

<?= $item['name']; ?><br>

<?= $item['message']; ?>

<?php endforeach; ?>

<?php endif; ?>



<?= $this->paginationControl($this->paginator, 'Sliding', '/my_pagination.phtml'); ?>






/application/scripts/index/index.phtml

<?php

if (count($this->paginator)): ?>

<?php foreach ($this->paginator as $item):?>

<?= $item['name']; ?><br>

<?= $item['message']; ?>

<?php endforeach; ?>

<?php endif; ?>



<?= $this->paginationControl($this->paginator, 'Sliding', '/my_pagination.phtml'); ?>









ここを除いて、ここで異常なものはありません:

<?= $this->paginationControl($this->paginator, 'Sliding', '/my_pagination.phtml'); ?>





スライディングの代わりに、次のパラメーターがここにあります。



$ this-> paginatorオブジェクトとページネーター-3番目のパラメーターはファイルmy_pagination.phtmlへのパスを指定します。

おおよその形式は次のとおりです。



/application/scripts/my_pagination.phtml

<?php

if ($this->pageCount): ?>

<?php if (isset($this->previous)): ?>

< Previous |

<?php else: ?>

< Previous |

<?php endif; ?>

<?php foreach ($this->pagesInRange as $page): ?>

<?php if ($page != $this->current): ?>

<?= $page; ?> |

<?php else: ?>

<?= $page; ?> |

<?php endif; ?>

<?php endforeach; ?>

<?php if (isset($this->next)): ?>

><?php else: ?>

<?php endif; ?>

<?php endif; ?>







$this->pageCount — $this->previous — $this->current — $this->next —

<a href="<?=$this->url(array('page' => $this->next)); ?>">>

, url(), , .



, , . , , Zend Framework.








/application/scripts/my_pagination.phtml

<?php

if ($this->pageCount): ?>

<?php if (isset($this->previous)): ?>

< Previous |

<?php else: ?>

< Previous |

<?php endif; ?>

<?php foreach ($this->pagesInRange as $page): ?>

<?php if ($page != $this->current): ?>

<?= $page; ?> |

<?php else: ?>

<?= $page; ?> |

<?php endif; ?>

<?php endforeach; ?>

<?php if (isset($this->next)): ?>

><?php else: ?>

<?php endif; ?>

<?php endif; ?>







$this->pageCount — $this->previous — $this->current — $this->next —

<a href="<?=$this->url(array('page' => $this->next)); ?>">>

, url(), , .



, , . , , Zend Framework.











All Articles