忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/05/27 03:49 |
Symfony-7日目その3
現在Programmingカテゴリには有効な求人が32件ありますが、カテゴリページでも先頭10件しか表示されず、続きを見ることができません。
早速ページング処理してみます。

まず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
<?php use_stylesheet('jobs.css') ?>
 
<?php slot('title', sprintf('Jobs in the %s category', $category->getName())) ?>
 
<div class="category">
  <div class="feed">
    <a href="">Feed</a>
  </div>
  <h1><?php echo $category ?></h1>
</div>
 
<?php include_partial('job/list', array('jobs' => $pager->getResults())) ?>
 
<?php if ($pager->haveToPaginate()): ?>
  <div class="pagination">
    <a href="<?php echo url_for('category', $category) ?>?page=1">
      <img src="/images/first.png" alt="First page" title="First page" />
    </a>
 
    <a href="<?php echo url_for('category', $category) ?>
      ?page=<?php echo $pager->getPreviousPage() ?>">
      <img src="/images/previous.png" alt="Previous page" title="Previous page" />
    </a>
 
    <?php foreach ($pager->getLinks() as $page): ?>
      <?php if ($page == $pager->getPage()): ?>
        <?php echo $page ?>
      <?php else: ?>
        <a href="<?php echo url_for('category', $category) ?>
          ?page=<?php echo $page ?>"><?php echo $page ?></a>
      <?php endif; ?>
    <?php endforeach; ?>
 
    <a href="<?php echo url_for('category', $category) ?>
      ?page=<?php echo $pager->getNextPage() ?>">
      <img src="/images/next.png" alt="Next page" title="Next page" />
    </a>
 
    <a href="<?php echo url_for('category', $category) ?>
      ?page=<?php echo $pager->getLastPage() ?>">
      <img src="/images/last.png" alt="Last page" title="Last page" />
    </a>
  </div>
<?php endif; ?>
 
<div class="pagination_desc">
  <strong><?php echo $pager->getNbResults() ?></strong>
     jobs in this category
  <?php if ($pager->haveToPaginate()): ?>
    - page <strong><?php echo $pager->getPage() ?>
                  /<?php echo $pager->getLastPage() ?></strong>
  <?php endif; ?>
</div>

なんだこのややこしいテンプレートは。
こんな訳の解らないものを出して「ロジックとデザインの分離が出来た!」とか言ってる場合じゃないと思うんだが。
こんなの絶対デザイナーには触れない。
あとどうでもいいけどチュートリアルのテンプレはFirstpageにtitleが無い。

やってることを順に解説すると、まずsfDoctrinePager::haveToPaginate()でページングの必要があるかどうか判断。
その後は、1ページ目へのリンク、前のページへのリンク、各ページへの順番リンク、次のページへのリンク、最後のページへのリンクを順に書いているだけです。
ちなみにsfDoctrinePager::getLinks()で返ってくるのは単なる数値の配列です。


非常に残念なのがリンクを自力で書かなければならないこと。
Pear::PagerCakePHPZend_Paginatorといった主なページャーはここらへんを自動でやってくれるので、これらに比べると使い勝手の悪さが目立ちます。
せっかくのフルスタックフレームワークなんだからurl_for('category', $pager->next())くらいやってほしかった。

てーかそこらへんリファレンスで何一つ解説されてないとか酷すぎる。


Symfonyの記事一覧
PR


2010/01/18 22:36 | Comments(0) | TrackBack(1) | PHP

トラックバック

トラックバックURL:
PHPに限らずアプリケーションの開発において非常に重要なプロセスがテストです。 テストを行わずに作成できるアプリケーションなど存在しません。 非常に重要で、金も期間もかかるのがテストフェーズなのですが、残念ながら世間ではたいしたものだとは思われていません。 まあ私もテスト苦手なんですが。 というわけでSymfonyにはプログラムのテストを行うライブラリが予め用意されています。 まずはユニットテストを行ってみましょう。 ユニットテストはひとつの関数、一つのメソッドが想定通りに動...
弱小PHPerの憂鬱 | 2010/01/22 23:36

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<9時間9人9の扉 プレイ日記3 | HOME | 買ったものリスト 2010/01/17>>
忍者ブログ[PR]