前回の続き。
さて、ひとつの求人は30日経ったら見えなくなるという機能をだいぶ昔実装しました。
とりあえず、実際これが動作しているか確認してみましょう。
/lib/test/JobeetTestFunctional.class.php
>php test/functional/frontend/jobActionsTest.php
> 3.55 - Expired Job
# get /job/new
# post /job
# put /job/ab6567fd4b5095bc8762729cc8244c2bfb79a0a9/publish
# get /job/a/a/3774/a
ok 1 - status code is 404
記事を投稿して公開後、公開期限を過去にセットして見ようとしたら404になりました、というテストです。
setExpiresAt('NOW')とか指定したいんだけどどうすればいいんだ?
この終わってしまった記事、もうすぐ終了する記事に対し、公開期限延長を行うボタンを追加してみましょう。
仕様としては、期限切れ5日以内、あるいは期限切れになった記事に管理画面からアクセスした際に「公開期限延長」リンクを用意し、押したら期限が30日延長されるというものになります。
まずルーティングを追加。
apps/frontend/config/routing.yml
object_actionsにextendを追加しました。
/job/:token/extendにPUTメソッドでアクセスするとjobモジュールのextendアクションが起動します。
apps/frontend/modules/job/actions/actions.class.php
JobeetJob::extend()を呼ぶようにしたので中身を実装します。
lib/model/doctrine/JobeetJob.class.php
頼むから'NOW() + INTERVAL '.(int)sfConfig::get('app_active_days').' DAY 'って書かせてくれ。
以上で設定が完了したはずです。
確認のためには記事を投稿し、公開期限を色々いじくって、リンクが正しく出るか、押したらきちんと動作するかといった検証が必要となります。
面倒なのでテストコードで試してみましょう。
/test/functional/frontend/jobActionsTest.php
そして実行
>php test/functional/frontend/jobActionsTest.php
> 3.6 - A job validity cannot be extended before the job expires soon
# get /job/new
# post /job
# put /job/cb4f932d526ca6a672713df4b7bcdcffaa415eed/publish
# put /job/cb4f932d526ca6a672713df4b7bcdcffaa415eed/extend
ok 1 - status code is 404
> 3.7 - A job validity can be extended when the job expires soon
# get /job/new
# post /job
# put /job/7fe018cc4866ac53cd6272a4ab6e9acd94e4a5e2/publish
# put /job/7fe018cc4866ac53cd6272a4ab6e9acd94e4a5e2/extend
ok 2 - page redirected to http://localhost/index.php/job/sensio-labs/atlanta-usa
/4086/foo5
ok 3
1..3
# Looks like everything went fine.
めでたし。
まあどうせ結局最終的にはデザイン確認用にブラウザから見ないといけないんですがね。
さて、ひとつの求人は30日経ったら見えなくなるという機能をだいぶ昔実装しました。
とりあえず、実際これが動作しているか確認してみましょう。
/lib/test/JobeetTestFunctional.class.php
1
2
3
4
5
6
7
8
9
10
11
|
$browser->info(' 3.55 - Expired Job')->
createJob(array('position' => 'FOO5','is_public'=>true), true)
->getJobByPosition('FOO5')->setExpiresAt(date('Y-m-d H:i;s'))->save();
$browser->get(sprintf('/job/a/a/%s/a',
$browser->getJobByPosition('FOO5')->getId()))
->with('response')->begin()->
isStatusCode(404)->
end()
;
|
>php test/functional/frontend/jobActionsTest.php
> 3.55 - Expired Job
# get /job/new
# post /job
# put /job/ab6567fd4b5095bc8762729cc8244c2bfb79a0a9/publish
# get /job/a/a/3774/a
ok 1 - status code is 404
記事を投稿して公開後、公開期限を過去にセットして見ようとしたら404になりました、というテストです。
setExpiresAt('NOW')とか指定したいんだけどどうすればいいんだ?
この終わってしまった記事、もうすぐ終了する記事に対し、公開期限延長を行うボタンを追加してみましょう。
仕様としては、期限切れ5日以内、あるいは期限切れになった記事に管理画面からアクセスした際に「公開期限延長」リンクを用意し、押したら期限が30日延長されるというものになります。
まずルーティングを追加。
apps/frontend/config/routing.yml
1
2
3
4
5
6
7
|
job:
class: sfDoctrineRouteCollection
options:
model: JobeetJob
column: token
object_actions: { publish: PUT, extend: PUT }
requirements: { token: \w+ }
|
object_actionsにextendを追加しました。
/job/:token/extendにPUTメソッドでアクセスするとjobモジュールのextendアクションが起動します。
apps/frontend/modules/job/actions/actions.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/*
* フォーム、Extendリンクを押したら期限延長
* */
public function executeExtend(sfWebRequest $request){
$request->checkCSRFProtection();
//ルート取得
$job = $this->getRoute()->getObject();
//extend実行
$this->forward404Unless($job->extend());
//ワンタイムセッション
$this->getUser()->setFlash('notice', sprintf(
'Your job validity has been extended until %s.',
date('m/d/Y', strtotime($job->getExpiresAt()))
));
$this->redirect('job_show_user', $job);
}
|
JobeetJob::extend()を呼ぶようにしたので中身を実装します。
lib/model/doctrine/JobeetJob.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/*
* 表示期限延長
* */
public function extend(){
//期限切れor期限切れ間近でなければアウト
if (!$this->expiresSoon()){ return false; }
//期限延長
$this->setExpiresAt(date('Y-m-d', time() +
86400 * sfConfig::get('app_active_days')));
$this->save();
return true;
}
|
頼むから'NOW() + INTERVAL '.(int)sfConfig::get('app_active_days').' DAY 'って書かせてくれ。
以上で設定が完了したはずです。
確認のためには記事を投稿し、公開期限を色々いじくって、リンクが正しく出るか、押したらきちんと動作するかといった検証が必要となります。
面倒なのでテストコードで試してみましょう。
/test/functional/frontend/jobActionsTest.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
|
$browser->info(' 3.6 - A job validity
cannot be extended before the job expires soon')->
createJob(array('position' => 'FOO4'), true)->
call(sprintf('/job/%s/extend',
$browser->getJobByPosition('FOO4')->getToken())
, 'put', array('_with_csrf' => true))->
with('response')->begin()->
isStatusCode(404)->
end()
;
$browser->info(' 3.7 - A job validity
can be extended when the job expires soon')->
createJob(array('position' => 'FOO5'), true)
;
$job = $browser->getJobByPosition('FOO5');
$job->setExpiresAt(date('Y-m-d'));
$job->save();
$browser->
call(sprintf('/job/%s/extend', $job->getToken()),
'put', array('_with_csrf' => true))->
with('response')->isRedirected()
;
$job->refresh();
$browser->test()->is(
$job->getDateTimeObject('expires_at')->format('y/m/d'),
date('y/m/d', time() + 86400 * sfConfig::get('app_active_days')));
|
そして実行
>php test/functional/frontend/jobActionsTest.php
> 3.6 - A job validity cannot be extended before the job expires soon
# get /job/new
# post /job
# put /job/cb4f932d526ca6a672713df4b7bcdcffaa415eed/publish
# put /job/cb4f932d526ca6a672713df4b7bcdcffaa415eed/extend
ok 1 - status code is 404
> 3.7 - A job validity can be extended when the job expires soon
# get /job/new
# post /job
# put /job/7fe018cc4866ac53cd6272a4ab6e9acd94e4a5e2/publish
# put /job/7fe018cc4866ac53cd6272a4ab6e9acd94e4a5e2/extend
ok 2 - page redirected to http://localhost/index.php/job/sensio-labs/atlanta-usa
/4086/foo5
ok 3
1..3
# Looks like everything went fine.
めでたし。
まあどうせ結局最終的にはデザイン確認用にブラウザから見ないといけないんですがね。
PR
トラックバック
トラックバックURL: