その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
$maxとlimitメソッドを追加しただけです。
この状態でリロードすると、カテゴリ毎の最大表示件数が10件になります。
テンプレートから呼び出しを行うときに、最大表示件数を追加します。
apps/frontend/modules/job/templates/indexSuccess.php
最大表示件数をテンプレートに直書きしてしまうのはよろしくないので、デフォルト値をapp.ymlに持たせ、テンプレートから呼び出すようにしましょう。
config/app.yml
apps/frontend/modules/job/templates/indexSuccess.php
デフォルトの10件がmax_jobs_on_homepageの5件で上書きされ、カテゴリ毎の最大表示件数が5件になります。
さて、上記のようにチュートリアルではテンプレートの呼び出し側でデフォルト値を取得していますが、ここはgetActiveJobsに実装するのが意味的に正しいと思うんだがどうだろう。こんなかんじで。
lib/model/doctrine/JobeetCategory.class.php
さて、一覧では非表示にすることができた期限切れの求人ですが、↓のようにjob_show_user:ルーティングに直通でアクセスすると普通に見えてしまいます。
http://symfony.localhost/frontend_dev.php/job/a/b/3/c
実際は何度も作り直しているのでid=3は無いと思いますが、データベースから直接確認して行ってみてください。
その表示する部分のロジックはどんなだったか確認してみます。
apps/frontend/modules/job/actions/actions.class.php
なんだこれ。
ああ、昨日意味がわからんと投げたやつでしたか。
とりあえずこのURLはrouting.ymlのjob_show_userにひっかかるので、job_show_user:options:にmethod_for_queryを追加します。
apps/frontend/config/routing.yml
JobeetJobTableに該当のメソッドを追加します。
lib/model/doctrine/JobeetJobTable.class.php
すると上記のURLで、期限が切れた求人は見えなくなりました。
めでたしめでたし。
……そのaってどこから来たの?
method_for_queryって何?
これを一日一時間で終わらせろとかどう考えても無理。
十分な時間なんて何処にもねえよ。
Symfonyの記事一覧
チュートリアルは最初に表示の上限を設定するようになっていますが、こちらでは先にその下のフィクスチャから行います。
フィクスチャは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
|
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
|
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.ymlのjob_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
トラックバック
トラックバックURL: