ページング・ソーティング機能

ZF-Exではページング機能やソーティング機能を使用しています。

ページングについて

ページングやソーティングを行うためには、ルーティング設定が行われている必要があります。ただし、初期状態ではadminモジュールにしか設定されていません。また、adminモジュール中でもこれらが利用可能なのはindexアクションのみとなります。他のアクションでページングやソーティング機能を使用したい場合、それに合わせてルータを設定する必要があります。

ページングのURL

ページングのURLは下記の通りです。

http://mydomain.com/site/admin/(controller)/page/1/

controller名の後ろにpage/(ページ番号)/とする事でそのページ番号を指定します。URLにページの指定がない場合、つまりデフォルトの場合は1ページ目を取得します。

ページングの情報の設定

ページングを設定するには、AppController::_setPaginator($model, $cond, $order, $current_page)メソッドを呼び出します。次のように記述する事で設定が可能です。なお、ここではソーティングのための処理もあわせて記載してあります。

$model = new AppModel();
$cond = $model->makeSearchCondition($this->_search_word);
$order = $model->makeSearchOrder($this->_search_order);
$current_page = $this->getRequest()->getParam('page');
$this->_setPaginator($model, $cond, $order, $current_page);

ページング処理にはZend Paginatorを使用しています。ビュー画面で使用可能なプロパティもZend Paginatorのプロパティに準じます。ビュー画面で利用可能なプロパティは下記ページを参照下さい。

http://framework.zend.com/manual/ja/zend.paginator.html

ビューファイル上ではページングのページ表記は次のファイル上で行っています。実際に記入されているサンプルとして、下記のファイルを参照ください。

  • application
    • modules
      • admin
        • views
          • elements
            • pagination_control.tpl
<{if $pages->pageCount}>
<!--  start paging..................................................... -->
<table border="0" cellpadding="0" cellspacing="0" id="paging-table">
<tr>
<td>
    <{if $pages->current != $pages->first}>
    <a href="<{$helper->pageUrl($pages->first, $search_order)}>" class="page-far-left"></a>
    <a href="<{$helper->pageUrl($pages->previous, $search_order)}>" class="page-left"></a>
    <{/if}>
    <div id="page-info"><strong>Results <{$pages->firstItemNumber|escape}>-<{$pages->lastItemNumber|escape}> of <{$pages->totalItemCount|escape}>
     | Page <strong><{$pages->current|escape}></strong> / <{$pages->pageCount|escape}></div>
    <{if $pages->current != $pages->last}>
    <a href="<{$helper->pageUrl($pages->next, $search_order)}>" class="page-right"></a>
    <a href="<{$helper->pageUrl($pages->last, $search_order)}>" class="page-far-right"></a>
    <{/if}>
</td>
</tr>
</table>
<!--  end paging................ -->
<{/if}>

 

ページングを行うためのビューヘルパーを用意してあります。次のように指定する事でページを指定したURLが出力されます。

<{$helper->pageUrl($page_number, $search_order)}>

$page_numberには対象のページ番号が入ります。上記のサンプルにもあるように、こちらは通常Zend Paginatorのプロパティにより指定します。

ソーティングについて

ソーティングもページングと同様、ルーティング設定が行われている必要があり、adminモジュールにのみ設定されています。

ソーティングのURL

ソーティングのURLは下記の通りです。

http://mydomain.com/site/admin/(controller)/page/1/(order_sort)/(order_direction)/

(order_sort)にはソートの対象となるキーが入ります。キーとして有効な値は次の通りです。

  • メンバ変数$fieldsにて定義されているフィールドのキー名
  • 主キー。デフォルトならばid
  • create_date、及びupdate_date。これらの値を使用しないモデルの場合は無効

(order_direction)にはascまたはdescが入ります。ascであれば昇順、descであれば降順となります。ソーティングを設定する時、URL中にはページングのページ指定も必要です。

(order_sort)及び(order_direction)が上記の条件で有効な値の場合にソーティングの条件が変更されます。条件を満たさない場合、あるいはURL中にソーティング条件が含まれない場合はメンバ変数$_default_orderの値が使用されます。

ソーティングの情報の設定

ソーティングを行うためのビューヘルパーを用意してあります。次のように書く事でそのリンクが出力されます。

<{$helper->sortLink('Id', (order_sort), $pages->current, $search_order, $asc_class = '', $desc_class = '')}>

第一引数に表示名、第二引数に(order_sort)が入ります。第三引数と第四引数は現在のページやソーティング条件であるため、同じ変数名で記述して下さい。$asc_classと$desc_classには、そのソート条件がアクティブである時にaタグに追加されるクラス名を入力します。このクラスにより昇順や降順を示す矢印の画像を表示する事を想定しています。指定がない場合はデフォルトでascはsort_asc、descはsort_descが設定されます。そのため、この引数はデフォルト以外のクラス名を指定する時のみ入力します。サンプル中ではcssファイルに次のように記述しており、アクティブである場合に矢印が表示されるようになっています。

.sort_asc{
	background: url(../../images/admin/table/table_sort_arrow_asc.gif) right no-repeat;
}

.sort_desc{
	background: url(../../images/admin/table/table_sort_arrow_desc.gif) right no-repeat;
}