忍者ブログ
[PR]
×

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



2017/05/27 13:18 |
Symfony-6日目その3
その2で終わるかと思ってたらその3だよ。
 
チュートリアルは最初に表示の上限を設定するようになっていますが、こちらでは先にその下のフィクスチャから行います。
フィクスチャはYAMLでデータベースの中身を書いとけば下記コマンドでデータベースに内容を登録できるよ、というものです。
>php symfony doctrine:data-load

で、実はYAMLファイル内にPHPコードを書くことができます。

まずチュートリアルのjobs.ymlフィクスチャをコピーし、これまでの3つのjob_sensio_labs、job_extreme_sensio、expired_jobの下に追加。
上記コマンドを実行。
データベースを覗いてみると、さくっと34件のレコードが作成されています。
ブラウザから覗いてみると、期限切れになっていないレコードがだだーと33件表示されるはずです。

求人件数が100件とか1000件になったら非常に困るので、表示上限とページング処理が必要となります。
とりあえず表示上限を追加しましょう。
といっても単にLIMIT句を追加するだけですが。

lib/model/doctrine/JobeetCategory.class.php
1
2
3
4
5
6
7
public function getActiveJobs($max = 10){
  $q = Doctrine_Query::create()
    ->from('JobeetJob j')
    ->where('j.category_id = ?', $this->getId())
    ->limit($max);
  return Doctrine::getTable('JobeetJob')->getActiveJobs($q);
}

$maxとlimitメソッドを追加しただけです。
この状態でリロードすると、カテゴリ毎の最大表示件数が10件になります。

テンプレートから呼び出しを行うときに、最大表示件数を追加します。

apps/frontend/modules/job/templates/indexSuccess.php
1
  <?php foreach ($category->getActiveJobs(10) as $i => $job): ?>

最大表示件数をテンプレートに直書きしてしまうのはよろしくないので、デフォルト値をapp.ymlに持たせ、テンプレートから呼び出すようにしましょう。

config/app.yml
1
2
3
all:
  active_days:          30
  max_jobs_on_homepage: 5

apps/frontend/modules/job/templates/indexSuccess.php
1
2
3
<?php foreach ($category->getActiveJobs(
   sfConfig::get('app_max_jobs_on_homepage')) as $i => $job):
?>

デフォルトの10件がmax_jobs_on_homepageの5件で上書きされ、カテゴリ毎の最大表示件数が5件になります。


さて、上記のようにチュートリアルではテンプレートの呼び出し側でデフォルト値を取得していますが、ここはgetActiveJobsに実装するのが意味的に正しいと思うんだがどうだろう。こんなかんじで。

lib/model/doctrine/JobeetCategory.class.php
1
2
3
4
5
6
7
8
public function getActiveJobs($max = null){
  if(!$max){$max=sfConfig::get('app_max_jobs_on_homepage');}
  $q = Doctrine_Query::create()
    ->from('JobeetJob j')
    ->where('j.category_id = ?', $this->getId())
    ->limit($max);
  return Doctrine::getTable('JobeetJob')->getActiveJobs($q);
}

さて、一覧では非表示にすることができた期限切れの求人ですが、↓のようにjob_show_user:ルーティングに直通でアクセスすると普通に見えてしまいます。
http://symfony.localhost/frontend_dev.php/job/a/b/3/c
実際は何度も作り直しているのでid=3は無いと思いますが、データベースから直接確認して行ってみてください。

その表示する部分のロジックはどんなだったか確認してみます。

apps/frontend/modules/job/actions/actions.class.php
1
2
3
public function executeShow(sfWebRequest $request){
  $this->job = $this->getRoute()->getObject();
}

なんだこれ。
ああ、昨日意味がわからんと投げたやつでしたか。
とりあえずこのURLはrouting.ymljob_show_userにひっかかるので、job_show_user:options:method_for_queryを追加します。

apps/frontend/config/routing.yml
1
2
job_show_user:
  options: { model: JobeetJob, type: object, method_for_query:  retrieveActiveJob }

JobeetJobTableに該当のメソッドを追加します。

lib/model/doctrine/JobeetJobTable.class.php
1
2
3
4
public function retrieveActiveJob(Doctrine_Query $q){
  $q->andWhere('a.expires_at > NOW()');
  return $q->fetchOne();
}

すると上記のURLで、期限が切れた求人は見えなくなりました。
めでたしめでたし。

……そのaってどこから来たの?
method_for_queryって何?


これを一日一時間で終わらせろとかどう考えても無理。
十分な時間なんて何処にもねえよ。


Symfonyの記事一覧
PR


2010/01/08 22:40 | Comments(0) | TrackBack(1) | PHP

トラックバック

トラックバックURL:
十分な時間なんてなかったので何もせずに7日目スタート。 まず、カテゴリ宛へのリンクでやってきた場合のルーティングを定義します。 apps/frontend/config/routing.yml 1 2 3 4 5 category: url: /category/:slug ...
弱小PHPerの憂鬱 | 2010/01/11 20:18

コメント

コメントを投稿する






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



<<コメントを掲載せずにエア罵倒:DAKINI | HOME | ここまで読解力の歪んでる人を見たことはあんまりない:DAKINI>>
忍者ブログ[PR]