現在Programmingカテゴリには有効な求人が32件ありますが、カテゴリページでも先頭10件しか表示されず、続きを見ることができません。
早速ページング処理してみます。
まずapp.ymlに1ページあたりの表示件数を記述。
config/app.yml
チュートリアルではapps/frontend/config/app.ymlに書くようになっていますがどちらでもいいです。
apps/frontend/modules/category/actions/actions.class.php
sfDoctrinePagerがページャーオブジェクトです。
setQuery()でクエリオブジェクトを突っ込むとページング処理を行ってくれます。
JobeetCategory::getActiveJobsQuery()はまだ無いので作成します。
lib/model/doctrine/JobeetCategory.class.php
やってることはJobeetCategory::getActiveJobs()とほぼ同じで、実際にクエリを実行してしまうかクエリオブジェクトをそのまま持ってくるかの違いしかありません。
ということでリファクタリングできます。
lib/model/doctrine/JobeetCategory.class.php
JobeetCategory::getActiveJobsQuery()はクエリオブジェクトをそのまま返し、countActiveJobs()は取得できる件数を返し、getActiveJobs()は実際にその内容を取得して返します。
最後にテンプレートを更新。
ページング関連を追加します。
apps/frontend/modules/category/templates/showSuccess.php
なんだこのややこしいテンプレートは。
こんな訳の解らないものを出して「ロジックとデザインの分離が出来た!」とか言ってる場合じゃないと思うんだが。
こんなの絶対デザイナーには触れない。
あとどうでもいいけどチュートリアルのテンプレはFirstpageにtitleが無い。
やってることを順に解説すると、まずsfDoctrinePager::haveToPaginate()でページングの必要があるかどうか判断。
その後は、1ページ目へのリンク、前のページへのリンク、各ページへの順番リンク、次のページへのリンク、最後のページへのリンクを順に書いているだけです。
ちなみにsfDoctrinePager::getLinks()で返ってくるのは単なる数値の配列です。
非常に残念なのがリンクを自力で書かなければならないこと。
Pear::PagerやCakePHP、Zend_Paginatorといった主なページャーはここらへんを自動でやってくれるので、これらに比べると使い勝手の悪さが目立ちます。
せっかくのフルスタックフレームワークなんだからurl_for('category', $pager->next())くらいやってほしかった。
てーかそこらへんリファレンスで何一つ解説されてないとか酷すぎる。
Symfonyの記事一覧
早速ページング処理してみます。
まずapp.ymlに1ページあたりの表示件数を記述。
config/app.yml
1
2
|
all:
max_jobs_on_category: 20
|
チュートリアルではapps/frontend/config/app.ymlに書くようになっていますがどちらでもいいです。
apps/frontend/modules/category/actions/actions.class.php
1
2
3
4
5
6
7
8
9
10
11
|
public function executeShow(sfWebRequest $request){
$this->category = $this->getRoute()->getObject();
$this->pager = new sfDoctrinePager(
'JobeetJob',
sfConfig::get('app_max_jobs_on_category')
);
$this->pager->setQuery($this->category->getActiveJobsQuery());
$this->pager->setPage($request->getParameter('page', 1));
$this->pager->init();
}
|
sfDoctrinePagerがページャーオブジェクトです。
setQuery()でクエリオブジェクトを突っ込むとページング処理を行ってくれます。
JobeetCategory::getActiveJobsQuery()はまだ無いので作成します。
lib/model/doctrine/JobeetCategory.class.php
1
2
3
4
5
6
|
public function getActiveJobsQuery(){
$q = Doctrine_Query::create()
->from('JobeetJob j')
->where('j.category_id = ?', $this->getId());
return Doctrine::getTable('JobeetJob')->addActiveJobsQuery($q);
}
|
やってることはJobeetCategory::getActiveJobs()とほぼ同じで、実際にクエリを実行してしまうかクエリオブジェクトをそのまま持ってくるかの違いしかありません。
ということでリファクタリングできます。
lib/model/doctrine/JobeetCategory.class.php
1
2
3
4
5
6
7
|
public function getActiveJobs($max = 10){
$q = $this->getActiveJobsQuery()->limit($max);
return $q->execute();
}
public function countActiveJobs(){
return $this->getActiveJobsQuery()->count();
}
|
JobeetCategory::getActiveJobsQuery()はクエリオブジェクトをそのまま返し、countActiveJobs()は取得できる件数を返し、getActiveJobs()は実際にその内容を取得して返します。
最後にテンプレートを更新。
ページング関連を追加します。
apps/frontend/modules/category/templates/showSuccess.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
use_stylesheet('jobs.css')
slot('title', sprintf('Jobs in the %s category', $category->getName()))
<div class="category">
<div class="feed">
<a href="">Feed</a>
</div>
<h1> echo $category </h1>
</div>
include_partial('job/list', array('jobs' => $pager->getResults()))
if ($pager->haveToPaginate()):
<div class="pagination">
<a href=" echo url_for('category', $category) ?page=1">
<img src="/images/first.png" alt="First page" title="First page" />
</a>
<a href=" echo url_for('category', $category) ?page= echo $pager->getPreviousPage() ">
<img src="/images/previous.png" alt="Previous page" title="Previous page" />
</a>
foreach ($pager->getLinks() as $page):
if ($page == $pager->getPage()):
echo $page
else:
<a href=" echo url_for('category', $category) ?page= echo $page "> echo $page </a>
endif;
endforeach;
<a href=" echo url_for('category', $category) ?page= echo $pager->getNextPage() ">
<img src="/images/next.png" alt="Next page" title="Next page" />
</a>
<a href=" echo url_for('category', $category) ?page= echo $pager->getLastPage() ">
<img src="/images/last.png" alt="Last page" title="Last page" />
</a>
</div>
endif;
<div class="pagination_desc">
<strong> echo $pager->getNbResults() </strong>
jobs in this category
if ($pager->haveToPaginate()):
- page <strong> echo $pager->getPage() / echo $pager->getLastPage() </strong>
endif;
</div>
|
なんだこのややこしいテンプレートは。
こんな訳の解らないものを出して「ロジックとデザインの分離が出来た!」とか言ってる場合じゃないと思うんだが。
こんなの絶対デザイナーには触れない。
あとどうでもいいけどチュートリアルのテンプレはFirstpageにtitleが無い。
やってることを順に解説すると、まずsfDoctrinePager::haveToPaginate()でページングの必要があるかどうか判断。
その後は、1ページ目へのリンク、前のページへのリンク、各ページへの順番リンク、次のページへのリンク、最後のページへのリンクを順に書いているだけです。
ちなみにsfDoctrinePager::getLinks()で返ってくるのは単なる数値の配列です。
非常に残念なのがリンクを自力で書かなければならないこと。
Pear::PagerやCakePHP、Zend_Paginatorといった主なページャーはここらへんを自動でやってくれるので、これらに比べると使い勝手の悪さが目立ちます。
せっかくのフルスタックフレームワークなんだからurl_for('category', $pager->next())くらいやってほしかった。
てーかそこらへんリファレンスで何一つ解説されてないとか酷すぎる。
Symfonyの記事一覧
PR
トラックバック
トラックバックURL: