忍者ブログ
[PR]
×

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



2024/11/24 12:04 |
Symfony1.4 11日目その6
前回の続き

さて、ひとつの求人は30日経ったら見えなくなるという機能をだいぶ昔実装しました。
とりあえず、実際これが動作しているか確認してみましょう。

/lib/test/JobeetTestFunctional.class.php
1
2
3
4
5
6
7
8
9
10
11
<?php
  $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
<?php
    /*
     * フォーム、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
<?php
    /*
     * 表示期限延長
     * */
    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
<?php
  $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


2011/02/28 22:22 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






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



<<今週の実績 2011/03/06 | HOME | 買ったものリスト 2011/02/27>>
忍者ブログ[PR]