top


総投稿数 本 
no_

スポンサーサイト

 --------
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
カテゴリ :スポンサー広告 トラックバック(-) コメント(-)
no_1078

問い合わせフォーム:チュートリアルと探した情報で、symfony・Doctrineフォームの改造に着手 ・・・ 【symphonyで、創るぞ】

 2009-09-05
 現在、symfonyでのサイト開発にどっぷり。
 細かいメモや習得した知識もあるが、
 まず現在「はまっている」フォームの作成部分を
 記録しておこう。

  追記に (長文ご容赦)▼


 ※今までのご参考

FC2ブログランキング にほんブログ村 IT技術ブログ Webサイト構築へ ブログ王ランキング 人気ブログランキング 人気ホームページランキングへ


more

************************************************
◎ symfony・Doctrineフォームの改造:symphonyで、創るぞ
************************************************


 ■Doctrine の利用


 前にチュートリアルを進めたとき、
 ・データベースのマッパーとして、Doctrine を知った。
  ・symfony:あれからどうしたって!? 随分作業して環境も一新(Propel > Doctrine)・・・ 【symfonyで、企業サイトを創る】

 使いやすいコマンドで、基礎的なモデルやフォームを
 作成してくれる。基本的な使い方には、ずいぶん慣れてきた。


 ・(プロジェクト名)/config/doctrine/schema.yml
  テーブルの構造などを設定して
  ・コマンドで、
symfony doctrine:build-model
とすれば
   ・基礎的なモデルクラス群が、
     (プロジェクト名)lib/model/doctrine 以下に作成され
  ・コマンドで、
symfony doctrine:build-form
とすれば
   ・基礎的なフォームに関わるモデルクラス群が、
     (プロジェクト名)lib/form/doctrine 以下に作成される

  さらに、


  ・コマンドで、
symfony doctrine:generate-module (アプリ名) (モジュール名) (テーブル名)
とすれば
   ・アクションクラスやテンプレートを含んだファイルが
     モジュールごとに生成される。

  その中で、
  ・テンプレートの newSuccess.php は、


   デフォルトで
<h1>New (モジュール名)</h1>
<?php include_partial('form', array('form' => $form)) ?>
 となっていて
   ・組み込まれる _form.php も用意される。

 ■フォームのカスタマイズ
  上記は、とてもすばらしいのだが・・・
  できあがったフォームは
  できあがったフォーム
  こんな感じだ。とてもこのままでは利用できない。


  ・CSS利用して、デザイン的に変えることは容易だが、
   _form.php のソースを確認してみると


  ・各項目は、
    <tbody>
<?php echo $form->renderGlobalErrors() ?>
<tr>
<th><?php echo $form['fieldname']->renderLabel() ?></th>
<td>
<?php echo $form['fieldname']->renderError() ?>
<?php echo $form['fieldname'] ?>
</td>
</tr>
 こんな感じで記述するようになっている。

  □バリデーション


   それでは、それぞれの項目に対する、細かいバリデーションは
   どうするんだ。
   (はい。チュートリアルをきちんと最後まで完遂していないから
    こうなるのですね。)


   前に進めていた、
   ・The Askeet Tutorial | symfony
   こちらの、
    ・5日目:フォームとページャ
    ・セキュリティとフォームのバリデーション に、
   フォーム作成とバリデーションの記事がある。


   これはこれで、きちんと理解しなくてはならない、
   ことなのだろうが、今知りたいのは、Doctrine で生成された
   ソースを元にしたカスタマイズ、だ。


 ■もうひとつのチュートリアル
  答えはここにあった。


  Symfonyを学習するために用意されている、
  もうひとつの(公式?)チュートリアル。

Practical symfony
Practical symfony こちらは、24日かけてみっちりと
 学習するんですね。
 い、いづれきちんとやります・・・




  この
  □10日目: フォーム で、
   Doctrineフォーム における
   ・フォームカスタマイズ や バリデーションの記事が
    確認できる。

  はは、ではいきなり、2つ目のチュートリアル:10日目
  を行うことにしよう。


  (ちなみに、「フォームのバリデーション」自体は
   ・symfony Forms in Action(日本語) にかなり詳しく述べられているので
    こちらも併用しながら、進める)


 ■フォームフレームワーク


  ・3つの要素で構成される、と。
バリデーション:
 ・入力(整数、文字列、Eメールアドレス・・・) をバリデート
  するクラスを提供
ウィジェット:
 ・HTMLフィールド(入力、テキストエリア、選択・・・) を
  出力するクラスを提供
フォーム:
 ・ウィジェットとバリデータで構成されるフォームを表し
  フォームの管理を手助けするメソッドを提供

  □クラスファイル
   コマンドで生成された クラスファイルのうち、
    ・(プロジェクト名)lib/form/doctrine/base 以下 のものは
     コマンドを実行するたびに再作成されるので、
     実際に編集するのは、
    ・(プロジェクト名)lib/form/doctrine/ 直下のクラスファイルだ。


   デフォルトは空。
class ContactForm extends BaseClientForm
{
public function configure()
{
}
}
 こんな感じだ、ここにいろいろ入れてゆくわけだ。

   ・バリデーション


    チュートリアルには、例として
    ・eメールアドレスのバリデートに対する説明が。
class ContactForm extends BaseClientForm
{
public function configure()
{
// ...
$this->validatorSchema['email'] = new sfValidatorEmail();
}
}
 なるほど、こうすれば
 メールアドレス用のバリデーションがされるわけだな。

    ・また「限られた」選択肢の中のデータしか
     受けつけない方法として、


     先に、テーブル用のクラスであるところに


     (プロジェクト名)lib/model/doctrine/(テーブル名)Table.class.php
class ContactTable extends Doctrine_Table
{
static public $types = array(
'full-time' => 'Full time',
'part-time' => 'Part time',
'freelance' => 'Freelance',
);
public function getTypes()
{
return self::$types;
}
// ...
}
 としておき。
      ※限定要素を配列で準備しておく、わけね。

     フォームのクラスファイルの方に、


class ContactForm extends BaseClientForm
{
public function configure()
{
// ...
$this->widgetSchema['type'] = new sfWidgetFormChoice(array(
'choices' => Doctrine::getTable('Contact')->getTypes(),
'expanded' => true,
));
}
}
 と利用する。

    ・他にもいろいろとあり、結構時間を費やしました。


  ※この sfValidatorFile 結構奥が深そうですね。

  □フォームテンプレート


   このチュートリアル記事に探していたものを見つけました。
    ・フォームの外見をカスタマイズする
    の 項です。
   また、別記事ですが、
    ・symfony Forms in Action 第1章 - フォームの作成
   こちらでさらに確実に理解できました。


   symfony はマニュアルやチュートリアルが豊富ですね。
   これらを「ひとつひとつ」ではなく、
   「同時に」参照することで、理解のスピードがあがったような。
   (私だけ? かな)


   決局、理解として


   ・各項目の属性などは ウィジェット を利用して、
$this->setWidgets(array(
'company' => new sfWidgetFormInput(),
'name' => new sfWidgetFormInput(),
'email' => new sfWidgetFormInput(),
'description' => new sfWidgetFormTextarea(),
));
$this->widgetSchema['category'] = new sfWidgetFormChoice(array(
'choices' => Doctrine::getTable('Category')->getTypes(),
'multiple' => true, 'expanded' => true,
));
$this->widgetSchema['ckitem'] = new sfWidgetFormInputCheckbox();
 などとクラスファイルに設定して

   ・すべての値を配列利用するために


$this->widgetSchema->setNameFormat('contact[%s]');
 などを加え、

   ・上記のようなバリデーション設定を加え、


   ・フォームテンプレートである _form.php では、
<?php echo $form['email_contact'] ?>
 と利用する。

   すると、生成されたソースでは、
    ・id として id="contact_email" などのような
     定型の名前ができているので、これを
   CSSで設定してデザインする、と。


  おぉ、時間要したけど、これは使いこなせばかなり便利。
  (自分のやり方にあっているぞ)

commentsコメント
comment_post












管理者にだけ表示を許可する
commentトラックバック
トラックバックURL:
http://metaboy.blog23.fc2.com/tb.php/1078-b91cebc9
ようこそ
Add to Google 創るmetaboy:RSSフィード
My Yahoo!に追加
最新記事のRSS | 問い合わせ

仕事検索、アルバイト検索、依頼仕事の検索ポータル - 仕事検索.COM - www.jobkensaku.com ツクルン

創るmetaboy - WEB創る、サイト創る、何創る - 創ったmetaboy

 

リンク集

 

最近の記事

 

ブロとも申請フォーム
Sponserd by

さくらのレンタルサーバ さくらのレンタルサーバ
大容量・高機能レンタルサーバー heteml 大容量・高機能レンタルサーバー heteml
XREA (ValueDomain)
お名前.com お名前.com
名づけてねっと名づけてねっと
ムームードメインムームードメイン

 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。