Symfonyに挑戦12「Jobeet 6日目」

6日目: モデルの詳細

トップページ表示用のプログラムを修正

トップページに表示するJobリストを「作成日が過去30日以内のものだけ」表示するように。

  1. jobeet/apps/frontend/modules/job/actions/actions.class.phpを変更

【覚書】

  • Criteria()という機能を使ってデータベースにアクセス。
  • $criteria->add(〜)でデータベースから取得する情報を絞り込む。

MySQLクエリのログファイル

データベースにアクセスしたSQL文のログを確認できる所。

  1. jobeet/log/frontend_dev.logファイル
  2. http://jobeet.local/frontend_dev.php/でアクセスしたときに上に表示されるツールバー内の右端(ドラム缶のようなアイコン)をクリックすると表示される。

Jobに有効期限を付ける。

Jobの作成日から30日後の日付を、Jobが作成されたときに自動で保存するようにする。

  1. jobeet/lib/model/JobeetJob.phpを変更

【覚書】

  • データをデータベースに保存するときに、なにか自動で処理したいときはモデルクラスのsaveクラスを拡張するといい。
  • isNew()メソッドはータベースにオブジェクトがまだシリアライズされていないときtrueを返し、それ以外は false を返す。

トップページに表示するJobリストを有効期限が生きているものだけにする

さっき修正したExpiresAtフィールドを参照して、現在の日付よりExpiresAtが新しいモノだけを表示するように。

  1. jobeet/apps/frontend/modules/job/actions/actions.class.phpを変更

フィクスチャに期限切れのJobデータを追加する

ブラウザから投稿しても期限切れのデータは追加できないので、フィクスチャを使ってデータベースに期限切れJobデータをつっこむ。

  1. jobeet/data/fixtures/020_jobs.ymlを変更
  2. ターミナルを開いて、propel:data-loadを実行
Mac:~ kaneda$ cd ~/Sites/jobeet
Mac:~ kaneda$ /Applications/xampp/xamppfiles/bin/php symfony propel:data-load
  1. ブラウザを開いてhttp://jobeet.local/にアクセス。追加したJobが表示されなかったらOK。

有効期限日数を設定ファイルで変更できるようにする。

app.ymlに初期設定項目を追加。

  1. jobeet/apps/frontend/config/app.ymlを変更
  2. jobeet/lib/model/JobeetJob.phpの30の所を変更

【覚書】

  • app.ymlはアプリケーションのグローバル設定を書く所
  • app.ymlに設定した項目はプログラムから参照できるが、参照側で項目名の頭に「app_」という接頭辞を付ける必要がある。

今まで書いたプログラムは間違い。実はモデルレイヤーというところに書くんだ(なんだそれ)

Jobリストを取得するために、アクション内でCriteriaを使って書いていたプログラムをJobeetJobPeer.phpに移動する。

  1. jobeet/lib/model/JobeetJobPeer.phpにプログラム追加
  2. jobeet/apps/frontend/modules/job/actions/actions.class.phpを変更
  3. ついでにjobeet/lib/model/JobeetJobPeer.phpのgetActiveJobsにソート機能を追加。

【覚書】

  • データベースからデータを読み込むプログラムは○○Peerというファイル名のファイル内に書くべき。
  • $criteria->addDescendingOrderByColumnでソート条件を指定できる。

Jobをカテゴリに基づいて表示されるようにする

アクションクラスから、カテゴリー一覧関数を呼び出し、カテゴリー一覧関数からそのカテゴリに属するJob一覧を取得出来るように変更。トップページのテンプレートもカテゴリを表示するように変更。

  1. jobeet/lib/model/JobeetCategoryPeer.phpにgetWithJobs関数を追加。
  2. jobeet/apps/frontend/modules/job/actions/actions.class.phpを変更
  3. jobeet/apps/frontend/modules/job/templates/indexSuccess.phpを変更
  4. jobeet/lib/model/JobeetCategory.phpを変更
  5. jobeet/lib/model/JobeetJobPeer.phpを変更

トップページのJob一覧の表示件数を制限する

  1. jobeet/lib/model/JobeetCategory.phpを変更
  2. jobeet/apps/frontend/modules/job/indexSuccess.phpの14行目を変更。
  3. jobeet/apps/frontend/config/app.ymlにmax_jobs_on_homepage項目を追加。

サンプルのデータをはめていないので、表示の確認は出来ない。次にサンプルデータをつっこむ。

サンプルデータを動的に生成する

ymlにもプログラムが書けるらしい。

  1. jobeet/data/fixtures/020_jobs.ymlの一番下にPHPプログラムを追加
  2. ターミナルを開いて、propel:data-loadを実行
Mac:~ kaneda$ cd ~/Sites/jobeet
Mac:~ kaneda$ /Applications/xampp/xamppfiles/bin/php symfony propel:data-load

すごい。Jobが増えた。

  1. jobeet/apps/frontend/config/app.ymlのmax_jobs_on_homepageを100にしてみる。

表示件数が増えた。

でもよく見るとJobのタイトルが変。調べるて見たところ020_jobs.ymlファイルの文字コードが間違っているのが原因で、改行コードがうまく働いていなかった。020_jobs.ymlファイルの文字コードUTF-8に変換して再度propel:data-loadするとうまくいった。

【覚書】

  • サンプルデータの投入はfixturesを使うんだ。
  • ymlファイルはUTF-8で保存。

有効期限切れのページにアクセスしたときに404ページを表示する

まず、phpMyAdminをブラウザで開いて、jobeetデータベースに移動し、SQLタブをクリックして、テキストエリアに、

SELECT id, token FROM jobeet_job WHERE expires_at < NOW()

をコピペして「実行する」ボタンを押す。すると1行だけ結果が表示されるので、その行のidカラムの数字を下のアドレスの「ID」の所に書いてブラウザでアクセス。
http://jobeet.local/frontend_dev.php/job/sensio-labs/paris-france/ID/web-developer-expired
するとJobページが表示される。これを404ページが表示されるように変更する。

  1. jobeet/apps/frontend/config/routing.ymlのjob_show_userを変更
  2. jobeet/lib/model/JobeetJobPeer.phpにdoSelectActive関数を追加
  3. 再度http://jobeet.local/frontend_dev.php/job/sensio-labs/paris-france/ID/web-developer-expiredにアクセス。

「404 | Not Found | sfError404Exception」のページが表示されればOK。