« ONEDARI BOYS | メイン

symfony修行日記

2008年01月31日

サイズと値段に数字しか入らないようにする

おっとsymfony修行日記の時間が空いてしまった。 もうすぐ完成なので頑張る。 商品のサイズと値段は当然数字だけしか受け付けないようにしたい。 そんなのもValidatorで簡単にできます。

2008年01月17日

アップロードできるファイルを画像だけに制限する

画像はアップロードできるようになりましたが、現状では画像以外のファイルもアップロードできてしまいます。 でもご安心を。symfonyのValidatorはYAMLに記述するだけでファイルタイプのチェックまで簡単に行えてしまいます。 apps/admin/modules/product/validate/update.ymlに以下のように記述します。

画像をアップロードできるようにする

productテーブルには商品画像を登録できるように、image1、image2、image3というカラムを用意してありました。 ということで、ファイルをアップロードできるようにします。 まず、apps/admin/modules/product/templates/editSuccess.phpをmultipart対応にします。 <?php echo form_tag('product/update') ?> を

2008年01月09日

商品一覧画面に検索フォームを追加する

商品一覧画面に検索フォームを追加してみます。 apps/admin/modules/product/templates/listSuccess.phpに検索フォームを追加。 <?php echo form_tag('product/search') ?> <table>

2008年01月07日

選んだカテゴリをDBに保存できるようにする

前回エントリまでの修正だと、セレクトボックスでカテゴリを選んでもDBには登録されない! なので、今回は登録・削除できるようにします。 apps/admin/modules/product/actions/actions.class.phpのexecuteUpdateに以下のコードを追加。 $joined_category = array();

商品登録画面にカテゴリを表示する

色に関しては外部キーを設定していたおかげで、scaffoldingで商品登録画面にプルダウンが表示されたけど、カテゴリに関しては外部キーを設定していないので、自前で実装してやる必要があります。 なので、apps/admin/modules/product/templates/editSuccess.phpにこういうのを追加。 <td> <?php echo select_tag('category_id[]', objects_for_select(

2007年12月21日

登録者と更新者が自動で入るようにする

created_byとupdated_byもcolor_idと同様に外部キーが張られているおかげで、プルダウンから選べるようになっています。 しかし! この2つの値は商品登録時と更新時に、現在ログインして操作しているユーザーのユーザーIDが自動で値が入るようにしたいのです。 ということで、まずはapps/admin/lib/myUser.class.phpの修正。

いよいよ商品の登録

ユーザ、色、カテゴリの管理ができるようになったら、次はいよいよ商品です。 例によってpropel-generate-crudすると、一覧表示画面、編集画面を作ってくれます。 schema.ymlでcolor_idと指定していたことで、自動で外部キーが張られています。 同様に、created_byとupdated_byにも外部キーが張られています。

2007年12月18日

サブカテゴリも一覧表示できるようにする

前回のエントリで親カテゴリ、子カテゴリの登録はできるようになりました。 でも、今のところ一覧画面では親カテゴリしか表示されません。 これを、親カテゴリの下にサブカテゴリの一覧が表示されるような画面に変えたいところです。 listSuccess.phpを

カテゴリを登録できるようにする

さて、次はカテゴリ周り。 カテゴリも基本的な部分はpropel-generate-crudで実装できますが、colorとはちがい、親カテゴリ-子カテゴリのように階層構造にしたいと思っています。 そのため、parent_id というカラムを用意しています。 まず、一覧表示をカスタマイズ。 parent_idが0のレコードを親カテゴリと判断することにします。

2007年12月13日

AJAXに挑戦してみる (3)

ビューの変更が終わったら次はコントローラーに手を付けます。 form_remote_tagでcolor/replaceアクションを呼ぶようにしたので、コントローラーにexecuteReplaceメソッドを追加します。 public function executeReplace() { if ($this->getRequest()->getMethod() == sfRequest::POST)

AJAXに挑戦してみる (2)

AJAXで更新できるようにするには form_tag ではなく form_remote_tag ヘルパーを使えばいいみたいです。 参考:symfony アドベントカレンダー 10日目: Ajaxフォームの変更

AJAXに挑戦してみる (1)

今の作りだと色の名前を変更する際は色名をクリックして編集画面に遷移するわけですが、 編集できる項目が色名しかないので、いちいち画面を変更するのも無駄だなと思います。 色名をクリックするとテキストボックスに変わってそこで変更してしまいたい。 ということで、checkpadを参考に挑戦してみます。

routingを変更する

ソートは実装できたけれど、URLが http://server.name/admin/color/sort/color_name/order/ascend/page/2 のように非常に長ったらしいので、URLをもうちょっとかっこ良くすることにします。

2007年12月11日

ソートを実装する

ページャーの次はソートです。 色名や、登録日時、更新日時でソートできるようにするのです。 まずはlib/model/ColorPeer.phpを変更。

ページャーをリファクタリングする

ページナビゲーションのための記述をビューに追加しましたが、同様の記述をページャーを実装する全てのビューに書かなければなりません。 一行くらいだったらいいのですが、結構な量なので面倒です。 一カ所にまとめたい。 そうしておけば、ページャーの記述を変更したくなったときにも一カ所を修正するだけでよいので便利です。

ページャーを実装する

userはそんなでもないけど、colorとかは10件とか100件とか、とても多くのデータが入力されるかもしれません。 件数が多いときに、全件を1ページで表示させているとレンダリングに時間がかかって、そのたびにイラっとします。 なので、決まった件数ごとにページングさせる機能を実装してみましょう。 apps/admin/modules/color/actions/actions.class.phpを修正します。

2007年12月10日

一覧表示をカスタマイズする

Scaffoldingで自動生成されるビューのうち、listSuccess.phpのフォーマットがあまり好きではありません。 colorテーブルを例に説明すると、

他のモジュールも作成する

userモジュールがほぼ落ち着いたので、colorモジュールに手を付けます。 # symfony propel-generate-crud admin color Color >> dir+ /home/kyomo/apps/admin/modules/color/templates >> file+ /home/kyomo/apps/admin/modules/color/templates/listSuccess.php >> file+ /home/kyomo/apps/admin/modules/color/templates/showSuccess.php

エラー画面で入力された値を保持する

ところで、ユーザーの作成でバリデータを実装しましたが、実はこのバリデータでエラーになり入力画面に戻ってきた場合、入力された値は消えてしまい大変不便でした。 でもご安心ください。 symfonyにはこの値を保持する機能も組み込まれているのです。 バリデータ用のYAMLに

2007年12月07日

ログイン処理をさらにリファクタリングする

ID/PWのチェックがカスタムバリデータに移ったのは良いのですが、本来検証だけをおこなうバリデータなのに認証チケットを渡したり、権限を設定したりする処理が記述されているというのもちょっと気持ち悪い感じです。 これらの処理はカスタムバリデータの外に追い出したいので、デフォルトで用意されているmyUser.class.phpに書くことにします。 apps/admin/lib/myUser.class.php

カスタムバリデータでログインチェックを行う

ログイン処理は、入力されたID/PWの組み合わせが正しいかどうかを検証するいわばバリデータみたいなもの。 なので、カスタムバリデータを作成して、ログイン処理はバリデータにやらせてしまいましょう。 loginアクションのバリデータなので、login.ymlを作成します。 apps/admin/modules/menu/validate/login.yml

ログイン処理を実装する (2)

続いて、ログイン処理を行うloginアクションを作ります。 public function executeLogin() { $c = new Criteria(); $c->add(UserPeer::USER_NAME, $value);

ログイン処理を実装する (1)

さて、ユーザーを作成できるようになったので、この情報を元にログイン機能を実装します。 menuモジュールのうち、indexアクションをログイン画面、loginアクションをログイン処理、listアクションを管理メニュー画面にしてみます。 管理メニューを作ったときにはindexアクションを管理メニュー表示にしていたので、まずはここから修正。

2007年12月05日

設定ファイルを使ってマジックナンバーを取り除く

前回、ビューの中に array('1' => 'guest', '5' => 'shop', '9' => 'admin) と書きましたが、これは気持ち悪いですね。 こう書く場所が一箇所ならいいけど、同じような記述を各所にしまくった後に権限が増えたときに修正するのも大変です。 なので、設定ファイルで権限の情報を記述して、それを読み込むように変更します。

データベースのカラム追加に伴い、各所を修正する

前のエントリで、データベースのカラムを追加しました。 propel-build-allを行うと、テーブル定義とモデルクラスは新しいカラムに合わせて変更してくれましたが、コントローラやビューは自動では変更してはくれません。 なので、そこを手動で変更していく必要があります。 ・コントローラの変更

データベースのカラムを追加する

いまさらですが、よく考えたら、ユーザーは権限を分けたりする必要があるのでした。 でも、作成済みのテーブルにはそんな用途に使えるカラムはありません。 早速追加しましょう。 追加する場合も、config/schema.ymlを修正してpropel-build-allでOKです。

とりあえず、管理メニューを作ってみる

ユーザーの新規作成などはできました。 色についても同じようにやっていけば、基本的な部分はほぼ出来上がるはずです。 他のテーブルのScaffoldingをする前に、管理メニュー画面を作ってみましょう。 # symfony init-module admin menu

2007年12月04日

バリデータを実装する

自動生成されたユーザー作成/編集の機能にはバリデータがないので、どんな値を入力しても、それどころか値を入力しなくてもユーザーの作成が出来てしまいます。 これじゃいけないので、バリデータを実装しましょう。 まずはバリデータのYAMLを置くディレクトリを作成します。 # mkdir apps/admin/modules/user/validate

ユーザーの作成/編集画面を変更する

さて無事日本語を表示できるようになったところで、いろいろ変更して行きます。 自動生成されたユーザー作成/編集画面はこんな感じです。 last_loginをtimestamp型にしたおかげで、めっちゃリッチなカレンダーコントロールとか表示されていて驚きました。symfonyすごい!

日本語を表示させるようにする

これまでに生成したモジュールは、英語を想定したものになっています。 日本語を表示させるために、以下のファイルを変更します。 ・アプリケーション全体のviewの設定ファイル → apps/admin/config/view.yml default:

Scaffoldingでモジュールを作成する

データベースは作っただけでは意味が無くて、テーブルに値を入れたり出したりするプログラムがあって初めて役に立ちます。 その入れたり出したりの処理のことをCRUDと言うそうです。 Create:データの作成(insert)

2007年11月30日

モデルクラスとテーブルを自動生成する

schema.ymlが出来たら、これを元にモデルクラスとテーブルを自動作成します。 コマンドは # symfony propel-build-all です。

データベースのテーブル構成を考えてしまう

symfonyにはYAMLファイルからデータベースにテーブルを作ってO/Rクラスを自動生成してくれる機能があります。 なので、まず最初にデータベースのテーブル構成を考えてしまいます。 もちろん、後からの変更も可能。 ということで、schema.ymlにデータベースのテーブル定義を書いて行きます。

MySQLに繋ぐ設定を入れる

続いて、symfonyとデータベースを連携させる設定をしましょう。 プロジェクトルートのconfig 以下に設定ファイルが置いてあります。 まずはdatabases.ymlの変更。

2007年11月29日

symfonyのXSS対策

次にXSS対策について考えます。 「symfonyxPHP」本のAppendix(P.199)に 「編集の自動エスケープ出力について」という項目がありました。 それによると、symfonyには変数を自動でエスケープする処理が組み込まれているそうです。 これを有効にするには

あらためて、サイトの構成について考える

肩ならしも終わったところで、今回作るのは家具のデータベースを管理する管理ツールです。 http://server.name/admin/ にアクセスするとログイン画面があって、ログインすると ・ユーザーの管理 ・家具データの管理

2007年11月28日

Hello World!を表示させる

helloモジュールが作成できたので、コントローラーおよびビューを変更して「Hello World!」の文字を表示できるようにしましょう。 helloモジュールのコントローラーは apps/admin/modules/hello/actions/actions.class.php になります。

とりあえずモジュールを作成してみる

さらにモジュールも作成してみます。 肩ならしに、「Hello World!」を表示させるモジュールを作ってみましょう。 モジュールを作成するには symfony init-module

Apacheの設定を変更する

ここで、symfonyが正しく動作しているか、ブラウザで確認してみます。 その前にApacheの設定を変更。 先ほど作成したプロジェクトルートに「web」というディレクトリがあるので、ここがDocumentRootになるように変更します。 DocumentRoot /home/kyomo/web

2007年11月27日

アプリケーションを作成する

続いて、アプリケーションも作成しましょう。 管理ツールを作るつもりなので、アプリケーション名は「admin」としてみます。 アプリケーションを作成するには symfony init-app

はじめてのプロジェクト作成

symfonyの世界では、大きい方から プロジェクト -> アプリケーション -> モジュール -> アクション というように名前が定義されています。 なので、まずは一番大きいくくりであるプロジェクトを作成しなければなりません。 プロジェクト名は「ls」とします。何の略かは気にしないでください。

symfonyを初めてみる

最近、すっかりプログラマモードのみらのです。 ということで、ある程度見えてきた気がするのでsymfony修行日記を始めてみます。 symfonyってのは、PHP5のフレームワークです。 symfonyどころか、PHPもAJAXもいじったことがないワタシが、「symfonyxPHP」を片手に開発をしていく過程を記録していきます。

AMN sponsor rolls


著書

実践Web2.0 BOOK 人気ブロガー直伝! 一歩先行くWeb2.0的ワーキングスタイル
ムーバブル・タイププラグインディレクトリ―PROFESSIONAL NETWORK
世界標準のブログソフトウェア「Movable Type」発売中