私が非常に若かった頃、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();
- ここで、GuestBookクラスのオブジェクトを取得します。
- ページに希望する投稿数を設定し、
- ページ番号を取得します
- ページは1未満または空白にできません。
- 投稿数を選択
- 制限のある投稿の選択を開始する場所を計算する
- 私たちが計算した$ startから目的のページまでのidでソートされたすべてのレコードを選択します。 同時に、取得したものを配列の結果に変換します。
$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.
/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.
/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.