Development

Changeset 21360

You must first sign up to be able to contribute.

Changeset 21360

Show
Ignore:
Timestamp:
08/23/09 04:40:56 (4 years ago)
Author:
masaki
Message:

[doc][1.1][1.2] updated Japanese translation of the forms book

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • doc/branches/1.1/forms/ja/01-Form-Creation.txt

    r20601 r21360  
    517517>XSS(クロスサイトスクリプティング)の対策 
    518518> 
    519 >ウィジェットに対してHTML属性を設定するか、デフォルト値を定義すると、`sfForm`クラスではHTMLコードを生成する際にXSS攻撃に対してこれらの値を自動的に保護します。この保護は`settings.yml`ファイルの`escaping_strategy`設定に依存しません。内容が別のメソッドによってに保護された場合、保護は再度適用されません。 
     519>ウィジェットに対してHTML属性を設定するか、デフォルト値を定義すると、`sfForm`クラスではHTMLコードを生成する際にXSS攻撃に対してこれらの値を自動的に保護します。この保護は`settings.yml`ファイルの`escaping_strategy`設定に依存しません。内容が別のメソッドによってすでに保護された場合、保護は再度適用されません。 
    520520> 
    521521>この処理で、生成されたHTMLを無効にする可能性がある`'`と`"`の文字も保護します。 
  • doc/branches/1.1/forms/ja/02-Form-Validation.txt

    r20601 r21360  
    4949---------- 
    5050 
    51 symfonyのフォームはフィールドで構成されます。1章で見てきたように、それぞれのフィールドはユニークな名前で識別されます。フィールドをユーザーに表示するために、それぞれのフィールドにウィジェットを結び付けました。ここでは、それぞれのフィールドにバリデーションルールを適用する方法を見てみましょう。 
     51symfonyのフォームはフィールドで構成されます。1章で見てきたように、それぞれのフィールドはユニークな名前で識別されます。フィールドをユーザーに表示するために、それぞれのフィールドにウィジェットがバインドされました。ここでは、それぞれのフィールドにバリデーションルールを適用する方法を見てみましょう。 
    5252 
    5353### sfValidatorBaseクラス 
     
    137137        $this->form = new ContactForm(); 
    138138 
    139   * ユーザーが`POST`リクエストでフォームを投稿すると、`bind()`メソッドによりフォームとユーザーの入力データが結び付けられ、バリデーション処理が実行されます。フォームは**バインドされた状態**に変化します。 
     139  * ユーザーが`POST`リクエストでフォームを投稿すると、`bind()`メソッドによりフォームとユーザーの入力データがバインドされ、バリデーション処理が実行されます。フォームは**バインドされた状態**に変化します。 
    140140 
    141141        [php] 
     
    144144          $this->form->bind($request->getParameter('contact')); 
    145145 
    146   * 一旦フォームがバインドされると、`isValid()`メソッドを利用してフォームの有効性をチェックできます: 
     146  * いったんフォームがバインドされると、`isValid()`メソッドを利用してフォームの有効性をチェックできます: 
    147147 
    148148      * 戻り値が`true`の場合、フォームは有効なので、ユーザーはthank youページにリダイレクトされます: 
     
    173173クリーニングプロセスには、2つの主要なアクション: 入力データの**標準化**と**変換**があります。 
    174174 
    175 に`trim`オプションによるデータの標準化のケースについて説明しました。しかし、例えば日付フィールドでは、標準化のアクションはさらに重要です。`sfValidatorDate`は日付をバリデートします。このバリデータでは、タイムスタンプ、正規表現に基づくフォーマットなど、多くのフォーマットを利用できます。デフォルトでは、入力を単に返す代わりに`Y-m-d H:i:s`フォーマットに変換されます。したがって、開発者は入力フォーマットを気にすることなく、特定のフォーマットでデータを取得できることが保証されます。システムはユーザーに多くの柔軟性を提供し、開発者には一貫性を保証します。 
    176  
    177 では、ファイルのアップロードのような変換アクションを考えてみましょう。ファイルは`sfValidatorFile`を利用してバリデートできます。一旦ファイルがアップロードされると、バリデータはファイルの名前を返す代わりに`sfValidatedFile`オブジェクトを返します。`sfValidatedFile`オブジェクトを使用すると、ファイル情報の取り扱いがより簡単になります。この章の後半で、このバリデータを使う方法を説明します。 
     175すでに`trim`オプションによるデータの標準化のケースについて説明しました。しかし、例えば日付フィールドでは、標準化のアクションはさらに重要です。`sfValidatorDate`は日付をバリデートします。このバリデータでは、タイムスタンプ、正規表現に基づくフォーマットなど、多くのフォーマットを利用できます。デフォルトでは、入力を単に返す代わりに`Y-m-d H:i:s`フォーマットに変換されます。したがって、開発者は入力フォーマットを気にすることなく、特定のフォーマットでデータを取得できることが保証されます。システムはユーザーに多くの柔軟性を提供し、開発者には一貫性を保証します。 
     176 
     177では、ファイルのアップロードのような変換アクションを考えてみましょう。ファイルは`sfValidatorFile`を利用してバリデートできます。いったんファイルがアップロードされると、バリデータはファイルの名前を返す代わりに`sfValidatedFile`オブジェクトを返します。`sfValidatedFile`オブジェクトを使用すると、ファイル情報の取り扱いがより簡単になります。この章の後半で、このバリデータを使う方法を説明します。 
    178178 
    179179>**Tip** 
     
    217217  | invalid        | `Invalid.`         | フィールドは無効 
    218218 
    219 に利用したバリデータに関するエラーコードは以下の通りです: 
     219すでに利用したバリデータに関するエラーコードは以下の通りです: 
    220220 
    221221  | **バリデータ**    | **エラーコード** | 
     
    258258![短すぎるメッセージエラー](/images/forms_book/en/02_06.png "短すぎるメッセージエラー") 
    259259 
    260 このエラーコード(`min_length`)に関連したデフォルトのエラーメッセージは、に説明したメッセージと異なります。2つの動的な値: ユーザーの入力データ(`foo`)と、このフィールドで許可する最小の文字数(`4`)を実装しています。リスト2-5では、これらの動的な値を利用してエラーメッセージをカスタマイズし、図2-7はカスタマイズした結果です。 
     260このエラーコード(`min_length`)に関連したデフォルトのエラーメッセージは、すでに説明したメッセージと異なります。2つの動的な値: ユーザーの入力データ(`foo`)と、このフィールドで許可する最小の文字数(`4`)を実装しています。リスト2-5では、これらの動的な値を利用してエラーメッセージをカスタマイズし、図2-7はカスタマイズした結果です。 
    261261 
    262262リスト2-5 - 動的な値でエラーメッセージをカスタマイズする 
     
    364364    } 
    365365 
    366 保護が無い場合、ユーザーが`name`フィールドと同時に`is_admin`フィールドの値をフォームから投稿すると、このコードには脆弱性があります。このような投稿は、Firebugのようなツールを利用することで簡単に実現できます。実際、フォーム内に`is_admin`フィールドに関連付けrられたバリデータがないため、`is_admin`の値は常に有効です。値が何であれ、`setFields()`メソッドは`name`プロパティだけでなく、`is_admin`プロパティも更新します。 
    367  
    368 しかし、このコードで`name`と`is_admin`フィールドの両方に対して値を渡すテストすると、図2-8で示されるように、"Extra field name."グローバルエラーが表示されます。投稿されたフィールドに、バリデータが関連けられていないものがあるため、システムでエラーが生成されました。`is_admin`フィールドは`UserForm`フォームクラスで定義されていません。 
     366保護が無い場合、ユーザーが`name`フィールドと同時に`is_admin`フィールドの値をフォームから投稿すると、このコードには脆弱性があります。このような投稿は、Firebugのようなツールを利用することで簡単に実現できます。実際、フォーム内に`is_admin`フィールドに関連づけられたバリデータがないため、`is_admin`の値は常に有効です。値が何であれ、`setFields()`メソッドは`name`プロパティだけでなく、`is_admin`プロパティも更新します。 
     367 
     368しかし、このコードで`name`と`is_admin`フィールドの両方に対して値を渡すテストすると、図2-8で示されるように、"Extra field name."グローバルエラーが表示されます。投稿されたフィールドに、バリデータが関連けられていないものがあるため、システムでエラーが生成されました。`is_admin`フィールドは`UserForm`フォームクラスで定義されていません。 
    369369 
    370370図2-8 - バリデータが見つからないエラー 
     
    422422![`allow_extra_fields`を`true`にセットしたバリデーション](/images/forms_book/en/02_09.png "`allow_extra_fields`を`true`にセットしたバリデーション") 
    423423 
    424 よく見ると、フォームが有効であるにも関わらず、どんな値を投稿しても、thank youページ内で`name`フィールドの値が空になっています。実際、`$this->form->getValues()`で返される配列に値は設定されていません。`allow_extra_fields`オプションを無効にすることで、バリデータが存在しないエラーは発生しなくなりますが、`filter_extra_fields`オプションは、デフォルトで`true`に設定されており、バリデータが存在しない値をフィルタリングして、バリデート済みの値から削除します。リスト2-10で示すように、もちろんこの振る舞いを変更することもできです。 
     424よく見ると、フォームが有効であるにも関わらず、どんな値を投稿しても、thank youページ内で`name`フィールドの値が空になっています。実際、`$this->form->getValues()`で返される配列に値は設定されていません。`allow_extra_fields`オプションを無効にすることで、バリデータが存在しないエラーは発生しなくなりますが、`filter_extra_fields`オプションは、デフォルトで`true`に設定されており、バリデータが存在しない値をフィルタリングして、バリデート済みの値から削除します。リスト2-10で示すように、もちろんこのふるまいを変更することもできです。 
    425425 
    426426リスト2-10 - `filter_extra_fields`保護を無効にする 
     
    457457  * `sfValidatorOr` : フィールドが少なくとも1つのバリデータのバリデーションをパスすると有効になります 
    458458 
    459 論理バリデータのコンストラクタは、最初の引数としてバリデータのリストを取ります。リスト2-11では、同時に満たす必要がある2つのバリデータを`name`フィールドに関連けるために、`sfValidatorAnd`を使います。 
     459論理バリデータのコンストラクタは、最初の引数としてバリデータのリストを取ります。リスト2-11では、同時に満たす必要がある2つのバリデータを`name`フィールドに関連けるために、`sfValidatorAnd`を使います。 
    460460 
    461461リスト2-11 - `sfValidatorAnd`バリデータを使う 
     
    509509これまで説明したそれぞれのバリデータは、特定のフィールドと結びつけられ一度に1つの値のバリデーションのみを行います。デフォルトでは、フィールドのバリデーションはユーザーによって投稿された別のフィールドのデータに関係しませんが、コンテキストに依存したり、多くの別のフィールドの値に依存してバリデーションを行う場合もあります。例えば、2つのパスワードが同じでなければならないときや、開始日が終了日より前の日付でなければならないときに、グローバルバリデータが必要となります。 
    510510 
    511 これら両方の場合において、それぞれのコンテキストでユーザー入力をバリデートするためにグローバルバリデータを使わなければなりません。プレバリデータもしくはポストバリデータをそれぞれ使うことで、個別のフィールドバリデーションの前または後にグローバルバリデータが処理されるように設定できます。通常はポストバリデータを使う方がベターです。データはにバリデートおよびクリーンアップされている、つまり標準化されたフォーマットになっているからです。リスト2-13では、`sfValidatorSchemaCompare`バリデータを利用して2つのパスワードの比較を実装する方法を示しています。 
     511これら両方の場合において、それぞれのコンテキストでユーザー入力をバリデートするためにグローバルバリデータを使わなければなりません。プレバリデータもしくはポストバリデータをそれぞれ使うことで、個別のフィールドバリデーションの前または後にグローバルバリデータが処理されるように設定できます。通常はポストバリデータを使う方がベターです。データはすでにバリデートおよびクリーンアップされている、つまり標準化されたフォーマットになっているからです。リスト2-13では、`sfValidatorSchemaCompare`バリデータを利用して2つのパスワードの比較を実装する方法を示しています。 
    512512 
    513513リスト2-13 - `sfValidatorSchemaCompare`バリデータを使う 
     
    533533ポストバリデータを利用することで、2つの日付の比較が正確になることが保証されます。入力に使われる日付フォーマットに関わらず、`start_date`と`end_date`フィールドのバリデーションでは、比較できるフォーマット(デフォルトでは`Y-m-d H:i:s`)に常に変換されます。 
    534534 
    535 デフォルトでは、プレバリデータとポストバリデータは、フォームに対してグローバルエラーを返します。とは言うものの、エラーを特定のフィールドに関連づけたい場合もあります。例えば、`sfValidatorSchemaCompare`バリデータの`throw_global_error`オプションを使うと、グローバルエラー(図2-10)にするか、またはエラーを最初のフィールドに関連ける(図2-11)かを選択できます。リスト2-15では、`throw_global_error`オプションの使い方を示しています。 
     535デフォルトでは、プレバリデータとポストバリデータは、フォームに対してグローバルエラーを返します。とは言うものの、エラーを特定のフィールドに関連づけたい場合もあります。例えば、`sfValidatorSchemaCompare`バリデータの`throw_global_error`オプションを使うと、グローバルエラー(図2-10)にするか、またはエラーを最初のフィールドに関連ける(図2-11)かを選択できます。リスト2-15では、`throw_global_error`オプションの使い方を示しています。 
    536536 
    537537リスト2-15 - `throw_global_error`オプションを使う 
  • doc/branches/1.1/forms/ja/03-Forms-for-web-Designers.txt

    • Property svn:mime-type deleted
    r20601 r21360  
    441章と2章でウィジェットとバリデーションのルールを作る方法を見ました。これらを表示するために`<?php echo $form ?>`ステートメントを使いました。このステートメントのおかげで開発者は最終的にどのように表示されるのか考えなくてもアプリケーションのコードを書けます。フィールド(名前、ウィジェット...)を変更もしくは追加するたびにテンプレートを変更する必要はありません。開発者がモデルとビジネスロジックに重点的に取り組まなければならないとき、このステートメントは試作と初期の開発フェーズに適しています。 
    55 
    6 一旦オブジェクトモデルが安定してスタイルのガイドラインの準備ができれば、Webデザイナーは様々なアプリケーションのフォームに戻り整えることができます。 
     6いったんオブジェクトモデルが安定してスタイルのガイドラインの準備ができれば、Webデザイナーはさまざまなアプリケーションのフォームに戻り整えることができます。 
    77 
    88この章を始める前に、symfonyのテンプレートシステムとビューレイヤーに精通しなければならなりません。そのためには、"The Definitive Guide to symfony"の[ビューレイヤーの内側](http://www.symfony-project.org/book/1_1/07-Inside-the-View-Layer)の章をご覧ください。 
     
    146146 
    147147>**TIP** 
    148 >すべてのフィールドは`id`生成属性を持ち、これによって開発者がCSSもしくはjavaScriptの振る舞いを簡単に追加できます。 
     148>すべてのフィールドは`id`生成属性を持ち、これによって開発者がCSSもしくはjavaScriptのふるまいを簡単に追加できます。 
    149149 
    150150プロトタイプのテンプレートのカスタマイズ 
     
    196196>オブジェクトを配列のように振る舞わせるには? 
    197197> 
    198 >PHP5以降では、オブジェクトはPHPの配列以外の振る舞いを行うことができます。`sfForm`クラスはシンプルで短い構文を利用してそれぞれのフィールドに対してアクセスする権限を与えるArrayAccessの振る舞いを実装します。配列のキーはフィールド名で戻り値は関連ウィジェットのオブジェクトです: 
     198>PHP5以降では、オブジェクトはPHPの配列以外のふるまいを行うことができます。`sfForm`クラスはシンプルで短い構文を利用してそれぞれのフィールドに対してアクセスする権限を与えるArrayAccessのふるまいを実装します。配列のキーはフィールド名で戻り値は関連ウィジェットのオブジェクトです: 
    199199> 
    200200>     [php] 
     
    253253>プロトタイプで使われた構造のフォーマットを変更するには? 
    254254> 
    255 >デフォルトでは、symfonyはフォームを表示するためにHTMLの配列を使います。この振る舞いは特定の*フォーマッター(formatter)*によって変更できます。これらは組み込みもしくはプロジェクトに適合させるために特別に開発されます。フォーマッターを作るには、5章で説明されているクラスを作る必要があります。 
     255>デフォルトでは、symfonyはフォームを表示するためにHTMLの配列を使います。このふるまいは特定の*フォーマッター(formatter)*によって変更できます。これらは組み込みもしくはプロジェクトに適合させるために特別に開発されます。フォーマッターを作るには、5章で説明されているクラスを作る必要があります。 
    256256 
    257257この構造から自由になるために、図3-6で示されるように、それぞれのフィールドは要素を生成するメソッドを持ちます: 
     
    275275![さまざまな列でフォームを表示する](/images/forms_book/en/03_07.png "さまざまな列でフォームを表示する") 
    276276 
    277 これを行うにはフィールドのそれぞれの要素を個別に生成できるようにしなければなりません。フィールドにアクセスするために、`form`オブジェクトを連想配列として使用し、フィールド名をキーとして使用できることをに見ました。例えば、`email`フィールドは`$form['email']`でアクセスできます。リスト3-6は2つの列を持つフォームを実装する方法を示しています。 
     277これを行うにはフィールドのそれぞれの要素を個別に生成できるようにしなければなりません。フィールドにアクセスするために、`form`オブジェクトを連想配列として使用し、フィールド名をキーとして使用できることをすでに見ました。例えば、`email`フィールドは`$form['email']`でアクセスできます。リスト3-6は2つの列を持つフォームを実装する方法を示しています。 
    278278 
    279279リスト3-6 - 2つのカラムで表示をカスタマイズする 
     
    505505  * hiddenフィールからのエラーもしくは実際にはフォームに表示されないフィールド。これらはグローバルエラーにまとめられる。 
    506506 
    507 フィールドに関連するエラーメッセージの実装方法をに調べたので、リスト3-15はグローバルエラーメッセージの実装方法を示します。 
     507フィールドに関連するエラーメッセージの実装方法をすでに調べたので、リスト3-15はグローバルエラーメッセージの実装方法を示します。 
    508508 
    509509リスト3-15 - グローバルエラーメッセージを実装する 
  • doc/branches/1.1/forms/ja/04-Propel-Integration.txt

    r20601 r21360  
    22====================== 
    33 
    4 Webプロジェクトにおいて、大抵のフォームはモデルオブジェクトを作るもしくは修正するために使われます。ORMのおかげでこれらのオブジェクトは通常はデータベースでシリアライズされます。symfonyのフォームシステムはsymfonyに組み込まれているPropelと連動する追加レイヤーを提供し、これらのモデルオブジェクトに基づいたフォームの実装をより簡単にします。 
     4Webプロジェクトにおいて、たいていのフォームはモデルオブジェクトを作るもしくは修正するために使われます。ORMのおかげでこれらのオブジェクトは通常はデータベースでシリアライズされます。symfonyのフォームシステムはsymfonyに組み込まれているPropelと連動する追加レイヤーを提供し、これらのモデルオブジェクトに基づいたフォームの実装をより簡単にします。 
    55 
    66この章ではフォームをPropelのオブジェクトモデルと統合する方法を詳しく検討します。Propelとsymfonyとの統合機能に習熟していることが大いに推奨されます。そうではない場合、"The Definitive Guide to symfony"の[モデルレイヤーの内側](http://www.symfony-project.org/book/1_1/08-Inside-the-Model-Layer)の章を参照してください。 
     
    158158    } 
    159159 
    160 生成クラスは以前の章でに作成したフォームと非常に似ていますが、下記の内容が異なります: 
     160生成クラスは以前の章ですでに作成したフォームと非常に似ていますが、下記の内容が異なります: 
    161161 
    162162  * 基底クラスは`sfForm`の代わりに`BaseFormPropel`です 
     
    306306    } 
    307307 
    308 タスクは2つのテンプレート、`indexSuccess`と`editSuccess`も生成しました。`editSuccess`テンプレートは`<?php echo $form ?>`ステートメントを使わずに生成されました。`--non-verbose-templates`を利用して、この振る舞いを修正できます: 
     308タスクは2つのテンプレート、`indexSuccess`と`editSuccess`も生成しました。`editSuccess`テンプレートは`<?php echo $form ?>`ステートメントを使わずに生成されました。`--non-verbose-templates`を利用して、このふるまいを修正できます: 
    309309 
    310310    $ ./symfony propel:generate-crud frontend author Author --non-verbose-templates 
     
    390390`propel:build-forms`と`propel:generate-crud`タスクによってモデルオブジェクトを表示する、作成する、編集し、削除する機能を持つsymfonyモジュールを作ることができます。これらのモジュールはモデルのバリデーションルールだけでなくテーブル間のリレーションも考慮します。一行も書かずにこれらすべてが行われます! 
    391391 
    392 生成コードをカスタマイズする段階に来ました。フォームクラスがに多くの要素を考慮しているのであれば、いくつかの面をカスタマイズする必要があります。 
     392生成コードをカスタマイズする段階に来ました。フォームクラスがすでに多くの要素を考慮しているのであれば、いくつかの面をカスタマイズする必要があります。 
    393393 
    394394### バリデータとウィジェットを設定する 
     
    677677    } 
    678678 
    679 `propel:build-forms`を利用することでフォームにオブジェクトモデルをイントロスペクトさせる大抵の要素を自動的に生成できます。この自動処理はいくつかの理由から役立ちます: 
     679`propel:build-forms`を利用することでフォームにオブジェクトモデルをイントロスペクトさせるたいていの要素を自動的に生成できます。この自動処理はいくつかの理由から役立ちます: 
    680680 
    681681  * 退屈で反復される作業をしなくて済むので、開発者の生活が楽になります。プロジェクト固有のビジネスルールに従ってバリデータとウィジェットのカスタマイズに焦点を当てることができます。 
  • doc/branches/1.1/forms/ja/08-Internationalisation-and-Localisation.txt

    r20601 r21360  
    22============================ 
    33 
    4 人気のあるWebアプリケーションの多くは様々な言語で利用可能で、時にユーザーのcultureに基づいてカスタマイズされます。symfonyはこれらの機能の管理を楽にする組み込みのフレームワークを搭載しています(symfony bookの["国際化と ローカライズ"](http://www.symfony-project.org/book/1_1/13-I18n-and-L10n)の章を参照)。 
     4人気のあるWebアプリケーションの多くはさまざまな言語で利用可能で、時にユーザーのcultureに基づいてカスタマイズされます。symfonyはこれらの機能の管理を楽にする組み込みのフレームワークを搭載しています(symfony bookの["国際化と ローカライズ"](http://www.symfony-project.org/book/1_1/13-I18n-and-L10n)の章を参照)。 
    55 
    66フォームフレームワークはユーザーのインターフェイス用の組み込みサポートを備えており国際化オブジェクトの管理を楽にする方法を提供します。 
     
    5959### 翻訳のために使うカタログを指定する 
    6060 
    61 symfonyの国際化フレームワークの機能を利用する場合 (`http://www.symfony-project.org/book/1_1/13-I18n-and-L10n#Managing%20Dictionaries`)、フォームを特定のカタログにバインドできます。リスト8-3において、`ContactForm`フォームを`contact_form`カタログに関連けします。ですので、フォーム要素の翻訳は`contact_form.fr.xml`ファイルで捜索されます。 
     61symfonyの国際化フレームワークの機能を利用する場合 (`http://www.symfony-project.org/book/1_1/13-I18n-and-L10n#Managing%20Dictionaries`)、フォームを特定のカタログにバインドできます。リスト8-3において、`ContactForm`フォームを`contact_form`カタログに関連けします。ですので、フォーム要素の翻訳は`contact_form.fr.xml`ファイルで捜索されます。 
    6262 
    6363リスト8-3 - 翻訳カタログのカスタマイズ 
     
    7979### エラーメッセージの国際化 
    8080 
    81 時々、エラーメッセージにはユーザーによって投稿された値が埋め込まれます(例えば、"Eメールアドレスのuser@domainは有効ではありません。")。これをフォームクラスの中でカスタマイズされたエラーメッセージを定義してユーザーが投稿した値を簡単に利用できることを2章でに見ました。これらの参照は`%parameter_name%`のパターンに従います。 
     81時々、エラーメッセージにはユーザーによって投稿された値が埋め込まれます(例えば、"Eメールアドレスのuser@domainは有効ではありません。")。これをフォームクラスの中でカスタマイズされたエラーメッセージを定義してユーザーが投稿した値を簡単に利用できることを2章ですでに見ました。これらの参照は`%parameter_name%`のパターンに従います。 
    8282 
    8383リスト8-4はこの原則をコンタクトフォームの`name`フィールドに適用する方法を示しています。 
     
    131131>PHPのcallableは関数もしくはメソッドのインスタンスへの参照です。これは`is_callable()`関数に渡されるときに`true`を返すPHP変数でもあります。 
    132132 
    133 リスト8-6で示されるクラスによって提供される独自の国際化メカニズムをに持つプロジェクトをマイグレートしなければならない場合を考えてみましょう。 
     133リスト8-6で示されるクラスによって提供される独自の国際化メカニズムをすでに持つプロジェクトをマイグレートしなければならない場合を考えてみましょう。 
    134134 
    135135リスト8-6 - カスタムの国際化クラス 
  • doc/branches/1.1/forms/ja/11-Doctrine-Integration.txt

    r20601 r21360  
    22========================= 
    33 
    4 Webプロジェクトにおいて、大抵のフォームはモデルオブジェクトを作るもしくは修正するために使われます。通常これらのオブジェクトはORMのおかげでシリアライズ化されます。symfonyのフォームシステムはsymfonyに組み込まれたORMであるDoctrineと橋渡しをするための追加レイヤーを提供し、これらのモデルオブジェクトに基づくフォームの実装を簡単にします。 
    5  
    6 この章ではフォームをDoctrineのオブジェクトモデルに統合する方法を詳しく説明します。Doctrineをsymfonyに統合して使うことにに慣れているのであれば大いにお勧めします。そうでなければ、"The Definitive Guide to symfony"の[モデルレイヤーの内側](http://www.symfony-project.org/book/1_1/08-Inside-the-Model-Layer)の章を参照してください。 
     4Webプロジェクトにおいて、たいていのフォームはモデルオブジェクトを作るもしくは修正するために使われます。通常これらのオブジェクトはORMのおかげでシリアライズ化されます。symfonyのフォームシステムはsymfonyに組み込まれたORMであるDoctrineと橋渡しをするための追加レイヤーを提供し、これらのモデルオブジェクトに基づくフォームの実装を簡単にします。 
     5 
     6この章ではフォームをDoctrineのオブジェクトモデルに統合する方法を詳しく説明します。Doctrineをsymfonyに統合して使うことにすでに慣れているのであれば大いにお勧めします。そうでなければ、"The Definitive Guide to symfony"の[モデルレイヤーの内側](http://www.symfony-project.org/book/1_1/08-Inside-the-Model-Layer)の章を参照してください。 
    77 
    88始める前に 
     
    158158    } 
    159159 
    160 生成クラスはわずかな違いを除いて、以前の章でに作成されたフォームによく似ています: 
     160生成クラスはわずかな違いを除いて、以前の章ですでに作成されたフォームによく似ています: 
    161161 
    162162  * 基底クラスは`sfForm`の代わりに`BaseFormDoctrine` 
     
    167167>Doctrineフォームのグローバルなカスタマイズ 
    168168> 
    169 >それぞれのテーブル用に生成されたクラスに加えて、`doctrine:build-forms`は`BaseFormDoctrine`クラスも生成します。この空のクラスは`lib/form/base/`ディレクトリの中の他のすべての生成クラスの基底クラスであり、Doctrineのすべてのフォームの振る舞いをグローバルに設定することを可能にします。例えば、すべてのDoctrineフォーム用のデフォルトのフォーマッターを簡単に変更できます: 
     169>それぞれのテーブル用に生成されたクラスに加えて、`doctrine:build-forms`は`BaseFormDoctrine`クラスも生成します。この空のクラスは`lib/form/base/`ディレクトリの中の他のすべての生成クラスの基底クラスであり、Doctrineのすべてのフォームのふるまいをグローバルに設定することを可能にします。例えば、すべてのDoctrineフォーム用のデフォルトのフォーマッターを簡単に変更できます: 
    170170> 
    171171>     [php] 
     
    330330    } 
    331331 
    332 タスクは`indexSuccess`と`editSuccess`の2つのテンプレートも生成しました。`<?php echo $form ?>`ステートメントを使わずに`editSuccess`テンプレートが生成されました。`--non-verbose-templates`を使用して、この振る舞いを修正できます: 
     332タスクは`indexSuccess`と`editSuccess`の2つのテンプレートも生成しました。`<?php echo $form ?>`ステートメントを使わずに`editSuccess`テンプレートが生成されました。`--non-verbose-templates`を使用して、このふるまいを修正できます: 
    333333 
    334334    $ ./symfony doctrine:generate-crud frontend author Author --non-verbose-templates 
     
    419419`doctrine:build-forms`と`doctrine:generate-crud`タスクによってモデルオブジェクトの一覧を表示、作成、編集する機能を持つモジュールを作ることができます。これらのモジュールはモデルのバリデーションルールだけでなくテーブル間のリレーションも考慮されます。これらすべては一行のコードを書かずに行われます! 
    420420 
    421 生成コードをカスタマイズしましょう。フォームクラスがに多くの要素を考慮しているのであれば、いくつかの面でカスタマイズする必要があります。 
     421生成コードをカスタマイズしましょう。フォームクラスがすでに多くの要素を考慮しているのであれば、いくつかの面でカスタマイズする必要があります。 
    422422 
    423423### バリデータとウィジェットを設定する 
     
    708708    } 
    709709 
    710 `doctrine:build-forms`を使うことでフォームはオブジェクトモデルをイントロスペクトして大抵の要素を自動的に生成できます。この自動化はいくつかの理由から役に立ちます: 
     710`doctrine:build-forms`を使うことでフォームはオブジェクトモデルをイントロスペクトしてたいていの要素を自動的に生成できます。この自動化はいくつかの理由から役に立ちます: 
    711711 
    712712  * これによって繰り返される冗長な作業をしなくても済むので、開発者の人生が楽になります。開発者はプロジェクト固有のビジネスルールに従ってバリデータとウィジェットのカスタマイズに集中できます。 
  • doc/branches/1.2/forms/ja/01-Form-Creation.txt

    r20619 r21360  
    3939`configure()`メソッドに**ウィジェット**を追加するコードを記述することからフォームの設定を始めましょう。 
    4040 
    41 **ウィジェット**はフォームフィールドを表します。この例のフォームでは、3つのフィールド: `name`, `email`、および`message`を表す3つのウィジェットを追加する必要があります。リスト1-1に、`ContactForm`クラスの最初の実装を示します。 
     41**ウィジェット**はフォームフィールドを表します。この例のフォームでは、3つのフィールド: `name`, `email`、および`message`を表す3つのウィジェットを追加する必要があります。リスト1-1`ContactForm`クラスの最初の実装を示します。 
    4242 
    4343リスト1-1 - 3つのフィールドがあるフォームの`ContactForm`クラス 
     
    9494    } 
    9595 
    96 フォームがインスタンス化される際、リスト1-1で定義した`configure()`メソッドは自動的に呼び出されます。 
    97  
    98 アクションの修正と合わせて、フォームを表示するためのテンプレートをリスト1-3のように作成する必要があります。 
     96フォームがインスタンス化される際、リスト1-1で定義した`configure()`メソッドは自動的に呼び出されます。 
     97 
     98アクションの修正に合わせてフォームを表示するために、リスト1-3のようなテンプレートを作成する必要があります。 
    9999 
    100100リスト1-3 - フォームを表示するテンプレート 
     
    292292 
    293293>**Tip** 
    294 >`executeSubmit()`が`executeIndex()`と異なることに気づいたでしょうか。これらのメソッドを呼び出すとき、symfonyは現在の`sfRequest`オブジェクトを最初の引数として`executeXXX()`メソッドに渡します。PHPではすべてのパラメータを定義する必要はなく、また`executeIndex()`では`request`変数は必要なかったため、定義しませんでした。 
     294>`executeSubmit()`が`executeIndex()`と異なることに気がつかれたでしょうか。これらのメソッドを呼び出すとき、symfonyは`executeXXX()`メソッドに最初の引数として現在の`sfRequest`オブジェクトを渡します。PHPではすべてのパラメータを定義する必要はなく、また`executeIndex()`では`request`変数は必要なかったため、定義しませんでした。 
    295295 
    296296図1-5に、ユーザーとインタラクトするときのメソッドのワークフローを示します。 
     
    328328    } 
    329329 
    330 `setNameFormat()`を呼び出すことで、すべてのウィジェットが出力するHTMLの`name`属性を修正できます。フォームを生成するとき、`%s`は自動的にフィールドの名前に置き換えられます。えば`email`フィールドでは、`name`属性は`contact[email]`になります。PHPでは、`contact[email]`のようなフォーマットを含むリクエストの値に対して、配列が自動的に作成されます。このようすると、フィールドの値を`contact`配列として利用できます。 
     330`setNameFormat()`を呼び出すことで、すべてのウィジェットが出力するHTMLの`name`属性を修正できます。フォームを生成するとき、`%s`は自動的にフィールドの名前に置き換えられます。たとえば`email`フィールドでは、`name`属性は`contact[email]`になります。PHPでは、`contact[email]`のようなフォーマットを含むリクエストの値に対して、配列が自動的に作成されます。このようすると、フィールドの値を`contact`配列として利用できます。 
    331331 
    332332リスト1-7で示すように、`request`オブジェクトから直接`contact`配列を取得できます。 
     
    352352### 別の解決方法 
    353353 
    354 この例では、フォームを管理するために2つのアクション: 表示に対して`index` 、投稿に対して`submit`を使いました。フォームは`GET`メソッドで表示され`POST`メソッドで投稿されることを利用して、リスト1-8で示されるように2つのメソッドを`index`メソッドにマージすることもできます。 
     354この例では、フォームを管理するために2つのアクション: 表示に対して`index`、投稿に対して`submit`を使いました。フォームは`GET`メソッドで表示され`POST`メソッドで投稿されることを利用して、リスト1-8で示されるように2つのメソッドを`index`メソッドにマージすることもできます。 
    355355 
    356356リスト1-8 - フォームで使われる2つのアクションをマージする 
     
    384384Webサイトが複数のWebマスターによって管理されている場合、質問内容に応じてメッセージをリダイレクトできるように、分類のドロップダウンリストを追加したいでしょう(図1-7)。リスト1-9では、`sfWidgetFormSelect`ウィジェットを利用して、ドロップダウンリストの`subject`を追加します。 
    385385 
    386 図1-7 - `subject`フィールドをフォームに追加する 
    387  
    388 ![`subject`フィールドをフォームに追加する](/images/forms_book/en/01_07.png "`subject`フィールドをフォームに追加する") 
    389  
    390 リスト1-9 - `subject`フィールドをフォームに追加する 
     386図1-7 - フォームに`subject`フィールドを追加する 
     387 
     388![フォームに`subject`フィールドを追加する](/images/forms_book/en/01_07.png "フォームに`subject`フィールドを追加する") 
     389 
     390リスト1-9 - フォームに`subject`フィールドを追加する 
    391391 
    392392    [php] 
     
    439439>     </select> 
    440440 
    441 `sfWidgetFormSelect`ウィジェットは、すべてのウィジェットと同じように、オプションのリストを最初の引数で受け取ります。オプションは必須もしくはオプションです。`sfWidgetFormSelect`ウィジェットでは、`choices`オプションは必須です。これまでに見てきたウィジェットで利用可能なオプションは下記の通りです: 
     441`sfWidgetFormSelect`ウィジェットは、すべてのウィジェットと同じように、最初の引数としてオプションのリストを受け取ります。オプションは必須もしくはオプションです。`sfWidgetFormSelect`ウィジェットでは、`choices`オプションは必須です。これまでに見てきたウィジェットで利用可能なオプションは下記の通りです: 
    442442 
    443443  | **ウィジェット**       | **必須のオプション**  | **追加のオプション**           | 
     
    449449 
    450450>**Tip** 
    451 >ウィジェットのすべてのオプションを知りたい場合、  ([http://www.symfony-project.org/api/1_2/](http://www.symfony-project.org/api/1_2/))で、オンラインで利用できる完全なAPIドキュメントを参照できます。追加のオプションやデフォルト値も合わせて、すべてのオプションが説明されています。例えば`sfWidgetFormSelect`のすべてのオプションは、次のURLで調べることができます: ([http://www.symfony-project.org/api/1_2/sfWidgetFormSelect](http://www.symfony-project.org/api/1_2/sfWidgetFormSelect)). 
     451>ウィジェットのすべてのオプションを知りたければ、([http://www.symfony-project.org/api/1_2/](http://www.symfony-project.org/api/1_2/))で、オンラインで利用できる完全なAPIドキュメントを参照できます。追加のオプションやデフォルト値も合わせて、すべてのオプションが説明されています。たとえば`sfWidgetFormSelect`のすべてのオプションは、次のURLで調べることができます: ([http://www.symfony-project.org/api/1_2/sfWidgetFormSelect](http://www.symfony-project.org/api/1_2/sfWidgetFormSelect)). 
    452452 
    453453### ウィジェットのHTML属性 
     
    491491### フィールドに対してデフォルトの値を定義する 
    492492 
    493 それぞれのフィールドに対してデフォルト値を定義しておくと便利です。えば、ユーザーがフィールドにフォーカスを移すと消えるヘルプメッセージを、フィールド内に表示するときです。リスト1-13では、`setDefault()`と`setDefaults()`メソッドを利用してデフォルト値を定義する方法を示しています。 
     493それぞれのフィールドに対してデフォルト値を定義しておくと便利です。たとえば、ユーザーがフィールドにフォーカスを移すと消えるヘルプメッセージを、フィールド内に表示するときです。リスト1-13では、`setDefault()`と`setDefaults()`メソッドを利用してデフォルト値を定義する方法を示しています。 
    494494 
    495495リスト1-13 - `setDefault()`と `setDefaults()`メソッド経由のウィジェットのデフォルト値 
     
    528528>XSS(クロスサイトスクリプティング)の対策 
    529529> 
    530 >ウィジェットに対してHTML属性を設定するか、デフォルト値を定義すると、`sfForm`クラスではHTMLコードを生成する際にXSS攻撃に対してこれらの値を自動的に保護します。この保護は`settings.yml`ファイルの`escaping_strategy`設定に依存しません。内容が別のメソッドによってに保護された場合、保護は再度適用されません。 
     530>ウィジェットに対してHTML属性を設定するか、デフォルト値を定義すると、`sfForm`クラスではHTMLコードを生成する際にXSS攻撃に対してこれらの値を自動的に保護します。この保護は`settings.yml`ファイルの`escaping_strategy`設定に依存しません。内容が別のメソッドによってすでに保護された場合、保護は再度適用されません。 
    531531> 
    532532>この処理で、生成されたHTMLを無効にする可能性がある`'`と`"`の文字も保護します。 
  • doc/branches/1.2/forms/ja/02-Form-Validation.txt

    r20619 r21360  
    5252---------- 
    5353 
    54 symfonyのフォームはフィールドで構成されます。1章で見てきたように、それぞれのフィールドはユニークな名前で識別されます。フィールドをユーザーに表示するために、それぞれのフィールドにウィジェットを結び付けました。ここでは、それぞれのフィールドにバリデーションルールを適用する方法を見てみましょう。 
     54symfonyのフォームはフィールドで構成されます。1章で見てきたように、それぞれのフィールドはユニークな名前で識別されます。フィールドをユーザーに表示するために、それぞれのフィールドにウィジェットをバインドしました。ここでは、それぞれのフィールドにバリデーションルールを適用する方法を見てみましょう。 
    5555 
    5656### sfValidatorBaseクラス 
     
    9191  * `sfValidatorChoice`: 入力値と予め定義された選択のリストに対してバリデーションを行います 
    9292 
    93 それぞれのバリデータは、最初の引数としてオプションのリストを取ります。ウィジェットのように、これらのオプションの中には必須であるものと、必須ではないものがあります。例えば、`sfValidatorChoice`バリデータは1つの必須オプションである、`choices`を取ります。それぞれのバリデータは、`sfValidatorBase`クラスで定義された`required`と`trim`オプションを取ることもできます: 
     93それぞれのバリデータは、最初の引数としてオプションのリストを受け取ります。ウィジェットのように、これらのオプションの中には必須であるものと、必須ではないものがあります。たとえば、`sfValidatorChoice`バリデータは1つの必須オプションである、`choices`を受け取ります。それぞれのバリデータは、`sfValidatorBase`クラスで定義された`required`と`trim`オプションを受け取ることもできます: 
    9494 
    9595  | **オプション**  | **デフォルト値**  | **説明** 
     
    140140        $this->form = new ContactForm(); 
    141141 
    142   * ユーザーが`POST`リクエストでフォームを投稿すると、`bind()`メソッドによりフォームとユーザーの入力データが結び付けられ、バリデーション処理が実行されます。フォームは**バインドされた状態**に変化します。 
     142  * ユーザーが`POST`リクエストでフォームを投稿すると、`bind()`メソッドによりフォームとユーザーの入力データがバインドされ、バリデーション処理が実行されます。フォームは**バインドされた状態**に変化します。 
    143143 
    144144        [php] 
     
    147147          $this->form->bind($request->getParameter('contact')); 
    148148 
    149   * 一旦フォームがバインドされると、`isValid()`メソッドを利用してフォームの有効性をチェックできます: 
     149  * いったんフォームがバインドされると、`isValid()`メソッドを利用してフォームの有効性をチェックできます: 
    150150 
    151151      * 戻り値が`true`の場合、フォームは有効なので、ユーザーはthank youページにリダイレクトされます: 
     
    176176クリーニングプロセスには、2つの主要なアクション: 入力データの**標準化**と**変換**があります。 
    177177 
    178 既に`trim`オプションによるデータの標準化のケースについて説明しました。しかし、例えば日付フィールドでは、標準化のアクションはさらに重要です。`sfValidatorDate`は日付をバリデートします。このバリデータでは、タイムスタンプ、正規表現に基づくフォーマットなど、多くのフォーマットを利用できます。デフォルトでは、入力を単に返す代わりに`Y-m-d H:i:s`フォーマットに変換されます。したがって、開発者は入力フォーマットを気にすることなく、特定のフォーマットでデータを取得できることが保証されます。システムはユーザーに多くの柔軟性を提供し、開発者には一貫性を保証します。 
    179  
    180 では、ファイルのアップロードのような変換アクションを考えてみましょう。ファイルは`sfValidatorFile`を利用してバリデートできます。一旦ファイルがアップロードされると、バリデータはファイルの名前を返す代わりに`sfValidatedFile`オブジェクトを返します。`sfValidatedFile`オブジェクトを使用すると、ファイル情報の取り扱いがより簡単になります。この章の後半で、このバリデータを使う方法を説明します。 
     178すでに`trim`オプションによるデータの標準化のケースについて説明しました。しかし、たとえば日付フィールドでは、標準化のアクションはさらに重要です。`sfValidatorDate`は日付をバリデートします。このバリデータでは、タイムスタンプ、正規表現に基づくフォーマットなど、多くのフォーマットを利用できます。デフォルトでは、入力を単に返す代わりに`Y-m-d H:i:s`フォーマットに変換されます。したがって、開発者は入力フォーマットを気にすることなく、特定のフォーマットでデータを取得できることが保証されます。システムはユーザーに多くの柔軟性を提供し、開発者には一貫性を保証します。 
     179 
     180では、ファイルのアップロードのような変換アクションを考えてみましょう。ファイルは`sfValidatorFile`を利用してバリデートできます。いったんファイルがアップロードされると、バリデータはファイルの名前を返す代わりに`sfValidatedFile`オブジェクトを返します。`sfValidatedFile`オブジェクトを使用すると、ファイル情報の取り扱いがより簡単になります。この章の後半で、このバリデータを使う方法を説明します。 
    181181 
    182182>**Tip** 
     
    220220  | invalid        | `Invalid.`         | フィールドは無効 
    221221 
    222 に利用したバリデータに関するエラーコードは以下の通りです: 
     222すでに利用したバリデータに関するエラーコードは以下の通りです: 
    223223 
    224224  | **バリデータ**    | **エラーコード** | 
     
    261261![短すぎるメッセージエラー](/images/forms_book/en/02_06.png "短すぎるメッセージエラー") 
    262262 
    263 このエラーコード(`min_length`)に関連したデフォルトのエラーメッセージは、に説明したメッセージと異なります。2つの動的な値: ユーザーの入力データ(`foo`)と、このフィールドで許可する最小の文字数(`4`)を実装しています。リスト2-5では、これらの動的な値を利用してエラーメッセージをカスタマイズし、図2-7はカスタマイズした結果です。 
     263このエラーコード(`min_length`)に関連したデフォルトのエラーメッセージは、すでに説明したメッセージと異なります。2つの動的な値: ユーザーの入力データ(`foo`)と、このフィールドで許可する最小の文字数(`4`)を実装しています。リスト2-5では、これらの動的な値を利用してエラーメッセージをカスタマイズし、図2-7はカスタマイズした結果です。 
    264264 
    265265リスト2-5 - 動的な値でエラーメッセージをカスタマイズする 
     
    291291 
    292292>**Tip** 
    293 >バリデータのすべてのエラーコード、オプション、デフォルトメッセージを確認したい場合は、APIのオンラインドキュメント ([http://www.symfony-project.org/api/1_2/](http://www.symfony-project.org/api/1_2/))を参照してください。デフォルト値に加えて、それぞれのコード、オプションとエラーメッセージが詳細に記述されています。えば、`sfValidatorString`バリデータのAPIは [http://www.symfony-project.org/api/1_2/sfValidatorString](http://www.symfony-project.org/api/1_2/sfValidatorString)で利用可能です。 
     293>バリデータのすべてのエラーコード、オプション、デフォルトメッセージを確認したい場合は、APIのオンラインドキュメント ([http://www.symfony-project.org/api/1_2/](http://www.symfony-project.org/api/1_2/))を参照してください。デフォルト値に加えて、それぞれのコード、オプションとエラーメッセージが詳細に記述されています。たとえば、`sfValidatorString`バリデータのAPIは [http://www.symfony-project.org/api/1_2/sfValidatorString](http://www.symfony-project.org/api/1_2/sfValidatorString)で利用可能です。 
    294294 
    295295バリデータのセキュリティ 
     
    367367    } 
    368368 
    369 保護が無い場合、ユーザーが`name`フィールドと同時に`is_admin`フィールドの値をフォームから投稿すると、このコードには脆弱性があります。このような投稿は、Firebugのようなツールを利用することで簡単に実現できます。実際、フォーム内に`is_admin`フィールドに関連付けrられたバリデータがないため、`is_admin`の値は常に有効です。値が何であれ、`setFields()`メソッドは`name`プロパティだけでなく、`is_admin`プロパティも更新します。 
    370  
    371 しかし、このコードで`name`と`is_admin`フィールドの両方に対して値を渡すテストすると、図2-8で示されるように、"Extra field name."グローバルエラーが表示されます。投稿されたフィールドに、バリデータが関連付けられていないものがあるため、システムでエラーが生成されました。`is_admin`フィールドは`UserForm`フォームクラスで定義されていません。 
     369保護が無い場合、ユーザーが`name`フィールドと同時に`is_admin`フィールドの値をフォームから投稿すると、このコードには脆弱性があります。このような投稿は、Firebugのようなツールを利用することで簡単に実現できます。実際、フォーム内に`is_admin`フィールドに関連づけられたバリデータがないため、`is_admin`の値は常に有効です。値が何であれ、`setFields()`メソッドは`name`プロパティだけでなく、`is_admin`プロパティも更新します。 
     370 
     371しかし、このコードで`name`と`is_admin`フィールドの両方に対して値を渡すテストすると、図2-8で示されるように、"Extra field name."グローバルエラーが表示されます。投稿されたフィールドに、バリデータが連づけられていないものがあるため、システムでエラーが生成されました。`is_admin`フィールドは`UserForm`フォームクラスで定義されていません。 
    372372 
    373373図2-8 - バリデータが見つからないエラー 
     
    425425![`allow_extra_fields`を`true`にセットしたバリデーション](/images/forms_book/en/02_09.png "`allow_extra_fields`を`true`にセットしたバリデーション") 
    426426 
    427 よく見ると、フォームが有効であるにも関わらず、どんな値を投稿しても、thank youページ内で`name`フィールドの値が空になっています。実際、`$this->form->getValues()`で返される配列に値は設定されていません。`allow_extra_fields`オプションを無効にすることで、バリデータが存在しないエラーは発生しなくなりますが、`filter_extra_fields`オプションは、デフォルトで`true`に設定されており、バリデータが存在しない値をフィルタリングして、バリデート済みの値から削除します。リスト2-10で示すように、もちろんこの振る舞いを変更することもできです。 
     427よく見ると、フォームが有効であるにも関わらず、どんな値を投稿しても、thank youページ内で`name`フィールドの値が空になっています。実際、`$this->form->getValues()`で返される配列に値は設定されていません。`allow_extra_fields`オプションを無効にすることで、バリデータが存在しないエラーは発生しなくなりますが、`filter_extra_fields`オプションは、デフォルトで`true`に設定されており、バリデータが存在しない値をフィルタリングして、バリデート済みの値から削除します。リスト2-10で示すように、もちろんこのふるまいを変更することもできです。 
    428428 
    429429リスト2-10 - `filter_extra_fields`保護を無効にする 
     
    460460  * `sfValidatorOr` : フィールドが少なくとも1つのバリデータのバリデーションをパスすると有効になります 
    461461 
    462 論理バリデータのコンストラクタは、最初の引数としてバリデータのリストを受け取ります。リスト2-11では、同時に満たす必要がある2つのバリデータを`name`フィールドに関連けるために、`sfValidatorAnd`を使います。 
     462論理バリデータのコンストラクタは、最初の引数としてバリデータのリストを受け取ります。リスト2-11では、同時に満たす必要がある2つのバリデータを`name`フィールドに関連けるために、`sfValidatorAnd`を使います。 
    463463 
    464464リスト2-11 - `sfValidatorAnd`バリデータを使う 
     
    510510-------------------- 
    511511 
    512 これまで説明したそれぞれのバリデータは、特定のフィールドと結びつけられ一度に1つの値のバリデーションのみを行います。デフォルトでは、フィールドのバリデーションはユーザーによって投稿された別のフィールドのデータに関係しませんが、コンテキストに依存したり、多くの別のフィールドの値に依存してバリデーションを行う場合もあります。例えば、2つのパスワードが同じでなければならないときや、開始日が終了日より前の日付でなければならないときに、グローバルバリデータが必要となります。 
    513  
    514 これら両方の場合において、それぞれのコンテキストでユーザー入力をバリデートするためにグローバルバリデータを使わなければなりません。プレバリデータもしくはポストバリデータをそれぞれ使うことで、個別のフィールドバリデーションの前または後にグローバルバリデータが処理されるように設定できます。通常はポストバリデータを使う方がベターです。データはにバリデートおよびクリーンアップされている、つまり標準化されたフォーマットになっているからです。リスト2-13では、`sfValidatorSchemaCompare`バリデータを利用して2つのパスワードの比較を実装する方法を示しています。 
     512これまで説明したそれぞれのバリデータは、特定のフィールドに結びつけられ一度に1つの値のバリデーションのみを行います。デフォルトでは、フィールドのバリデーションはユーザーによって投稿された別のフィールドのデータに関係しませんが、コンテキストに依存したり、多くの別のフィールドの値に依存してバリデーションを行う場合もあります。たとえば、2つのパスワードが同じでなければならないときや、開始日が終了日より前の日付でなければならないときに、グローバルバリデータが必要となります。 
     513 
     514これら両方の場合において、それぞれのコンテキストでユーザー入力をバリデートするためにグローバルバリデータを使わなければなりません。プレバリデータもしくはポストバリデータをそれぞれ使うことで、個別のフィールドバリデーションの前または後にグローバルバリデータが処理されるように設定できます。通常はポストバリデータを使う方がベターです。データはすでにバリデートおよびクリーンアップされている、つまり標準化されたフォーマットになっているからです。リスト2-13では、`sfValidatorSchemaCompare`バリデータを利用して2つのパスワードの比較を実装する方法を示しています。 
    515515 
    516516リスト2-13 - `sfValidatorSchemaCompare`バリデータを使う 
     
    542542ポストバリデータを利用することで、2つの日付の比較が正確になることが保証されます。入力に使われる日付フォーマットに関わらず、`start_date`と`end_date`フィールドのバリデーションでは、比較できるフォーマット(デフォルトでは`Y-m-d H:i:s`)に常に変換されます。 
    543543 
    544 デフォルトでは、プレバリデータとポストバリデータは、フォームに対してグローバルエラーを返します。とは言うものの、エラーを特定のフィールドに関連づけたい場合もあります。例えば、`sfValidatorSchemaCompare`バリデータの`throw_global_error`オプションを使うと、グローバルエラー(図2-10)にするか、またはエラーを最初のフィールドに関連付ける(図2-11)かを選択できます。リスト2-15では、`throw_global_error`オプションの使い方を示しています。 
     544デフォルトでは、プレバリデータとポストバリデータは、フォームに対してグローバルエラーを返します。とは言うものの、エラーを特定のフィールドに関連づけたい場合もあります。たとえば、`sfValidatorSchemaCompare`バリデータの`throw_global_error`オプションを使うと、グローバルエラー(図2-10)にするか、またはエラーを最初のフィールドに関連づける(図2-11)かを選択できます。リスト2-15では、`throw_global_error`オプションの使い方を示しています。 
    545545 
    546546リスト2-15 - `throw_global_error`オプションを使う 
  • doc/branches/1.2/forms/ja/03-Forms-for-web-Designers.txt

    r20619 r21360  
    441章と2章でウィジェットとバリデーションのルールを作る方法を見ました。これらを表示するために`<?php echo $form ?>`ステートメントを使いました。このステートメントのおかげで開発者は最終的にどのように表示されるのか考えなくてもアプリケーションのコードを書けます。フィールド(名前、ウィジェット...)を変更もしくは追加するたびにテンプレートを変更する必要はありません。開発者がモデルとビジネスロジックに重点的に取り組まなければならないとき、このステートメントは試作と初期の開発フェーズに適しています。 
    55 
    6 一旦オブジェクトモデルが安定してスタイルのガイドラインの準備ができれば、Webデザイナーは様々なアプリケーションのフォームに戻り整えることができます。 
     6いったんオブジェクトモデルが安定してスタイルのガイドラインの準備ができれば、Webデザイナーはさまざまなアプリケーションのフォームに戻り整えることができます。 
    77 
    88この章を始める前に、symfonyのテンプレートシステムとビューレイヤーに精通しなければならなりません。そのためには、"The Definitive Guide to symfony"の[ビューレイヤーの内側](http://www.symfony-project.org/book/1_2/07-Inside-the-View-Layer)の章をご覧ください。 
     
    151151 
    152152>**TIP** 
    153 >すべてのフィールドは`id`生成属性を持ち、これによって開発者がCSSもしくはjavaScriptの振る舞いを簡単に追加できます。 
     153>すべてのフィールドは`id`生成属性を持ち、これによって開発者がCSSもしくはjavaScriptのふるまいを簡単に追加できます。 
    154154 
    155155プロトタイプのテンプレートのカスタマイズ 
     
    201201>オブジェクトを配列のように振る舞わせるには? 
    202202> 
    203 >PHP5以降では、オブジェクトはPHPの配列以外の振る舞いを行うことができます。`sfForm`クラスはシンプルで短い構文を利用してそれぞれのフィールドに対してアクセスする権限を与えるArrayAccessの振る舞いを実装します。配列のキーはフィールド名で戻り値は関連ウィジェットのオブジェクトです: 
     203>PHP5以降では、オブジェクトはPHPの配列以外のふるまいを行うことができます。`sfForm`クラスはシンプルで短い構文を利用してそれぞれのフィールドに対してアクセスする権限を与えるArrayAccessのふるまいを実装します。配列のキーはフィールド名で戻り値は関連ウィジェットのオブジェクトです: 
    204204> 
    205205>     [php] 
     
    258258>プロトタイプで使われた構造のフォーマットを変更するには? 
    259259> 
    260 >デフォルトでは、symfonyはフォームを表示するためにHTMLの配列を使います。この振る舞いは特定の*フォーマッター(formatter)*によって変更できます。これらは組み込みもしくはプロジェクトに適合させるために特別に開発されます。フォーマッターを作るには、5章で説明されているクラスを作る必要があります。 
     260>デフォルトでは、symfonyはフォームを表示するためにHTMLの配列を使います。このふるまいは特定の*フォーマッター(formatter)*によって変更できます。これらは組み込みもしくはプロジェクトに適合させるために特別に開発されます。フォーマッターを作るには、5章で説明されているクラスを作る必要があります。 
    261261 
    262262この構造から自由になるために、図3-6で示されるように、それぞれのフィールドは要素を生成するメソッドを持ちます: 
    263263 
    264264  * `renderLabel()` : ラベル(フィールドに結びつけられた` <label>`タグ) 
    265   * `render()`      : フィールドタグそのもの(えば`<input>`タグ) 
     265  * `render()`      : フィールドタグそのもの(たとえば`<input>`タグ) 
    266266  * `renderError()` : エラーメッセージ(`<ul class="error_list">`リストとして) 
    267267 
     
    280280![さまざまな列でフォームを表示する](/images/forms_book/en/03_07.png "さまざまな列でフォームを表示する") 
    281281 
    282 これを行うにはフィールドのそれぞれの要素を個別に生成できるようにしなければなりません。フィールドにアクセスするために、`form`オブジェクトを連想配列として使用し、フィールド名をキーとして使用できることを既に見ました。例えば、`email`フィールドは`$form['email']`でアクセスできます。リスト3-6は2つの列を持つフォームを実装する方法を示しています。 
     282これを行うにはフィールドのそれぞれの要素を個別に生成できるようにしなければなりません。フィールドにアクセスするために、`form`オブジェクトを連想配列として使用し、フィールド名をキーとして使用できることをすでに見ました。たとえば、`email`フィールドは`$form['email']`でアクセスできます。リスト3-6は2つの列を持つフォームを実装する方法を示しています。 
    283283 
    284284リスト3-6 - 2つのカラムで表示をカスタマイズする 
     
    391391ラベルの名前を引数として送信する場合`renderLabel()`メソッドには何の意味があるのでしょうか? 
    392392なぜシンプルなHTMLの`label`タグを使わないのでしょうか? 
    393 これは`renderLabel()`メソッドは`label`タグを生成しリンクきフィールド(`id`)の識別子に 
     393これは`renderLabel()`メソッドは`label`タグを生成しリンクきフィールド(`id`)の識別子に 
    394394セットされる`for` 属性を自動的に追加するからです。このことは  
    395395フィールドがアクセス可能であることを保証します; ラベルをクリックするとき、フィールドは自動的に 
     
    518518  * hiddenフィールからのエラーもしくは実際にはフォームに表示されないフィールド。これらはグローバルエラーにまとめられる。 
    519519 
    520 フィールドに関連するエラーメッセージの実装方法をに調べたので、リスト3-15はグローバルエラーメッセージの実装方法を示します。 
     520フィールドに関連するエラーメッセージの実装方法をすでに調べたので、リスト3-15はグローバルエラーメッセージの実装方法を示します。 
    521521 
    522522リスト3-15 - グローバルエラーメッセージを実装する 
  • doc/branches/1.2/forms/ja/04-Propel-Integration.txt

    r20601 r21360  
    22====================== 
    33 
    4 Webプロジェクトにおいて、大抵のフォームはモデルオブジェクトを作るもしくは修正するために使われます。ORMのおかげでこれらのオブジェクトは通常はデータベースでシリアライズされます。symfonyのフォームシステムはsymfonyに組み込まれているPropelと連動する追加レイヤーを提供し、これらのモデルオブジェクトに基づいたフォームの実装をより簡単にします。 
     4Webプロジェクトにおいて、たいていのフォームはモデルオブジェクトを作るもしくは修正するために使われます。ORMのおかげでこれらのオブジェクトは通常はデータベースでシリアライズされます。symfonyのフォームシステムはsymfonyに組み込まれているPropelと連動する追加レイヤーを提供し、これらのモデルオブジェクトに基づいたフォームの実装をより簡単にします。 
    55 
    66この章ではフォームをPropelのオブジェクトモデルと統合する方法を詳しく検討します。Propelとsymfonyとの統合機能に習熟していることが大いに推奨されます。そうではない場合、"The Definitive Guide to symfony"の[モデルレイヤーの内側](http://www.symfony-project.org/book/1_2/08-Inside-the-Model-Layer)の章を参照してください。 
     
    8484          BaseTagForm.class.php 
    8585 
    86 `propel:build-forms`タスクはスキーマのそれぞれのテーブルに対して2つのクラスを生成し、1つの基底クラスは`lib/form/base`ディレクトリに、もう一つのクラスは`lib/form/`ディレクトリに存在します。えば`author`テーブルは、`lib/form/base/BaseAuthorForm.class.php`と`lib/form/AuthorForm.class.php`ファイルに生成された`BaseAuthorForm`と`AuthorForm`クラスで構成されます。 
     86`propel:build-forms`タスクはスキーマのそれぞれのテーブルに対して2つのクラスを生成し、1つの基底クラスは`lib/form/base`ディレクトリに、もう一つのクラスは`lib/form/`ディレクトリに存在します。たとえば`author`テーブルは、`lib/form/base/BaseAuthorForm.class.php`と`lib/form/AuthorForm.class.php`ファイルに生成された`BaseAuthorForm`と`AuthorForm`クラスで構成されます。 
    8787 
    8888>**SIDEBAR** 
     
    158158    } 
    159159 
    160 生成クラスは以前の章でに作成したフォームと非常に似ていますが、下記の内容が異なります: 
     160生成クラスは以前の章ですでに作成したフォームと非常に似ていますが、下記の内容が異なります: 
    161161 
    162162  * 基底クラスは`sfForm`の代わりに`BaseFormPropel`です 
     
    167167>Propelフォームのグローバルなカスタマイズ 
    168168> 
    169 >それぞれのテーブル用の生成クラスに加えて、`propel:build-forms`は`BaseFormPropel`クラスも生成します。この空のクラスは`lib/form/base/`ディレクトリに生成された他のすべてのクラスの基底クラスでこれによってすべてのPropelフォームのビヘイビアをグローバルに設定できます。えば、すべてのPropelフォームに対してデフォルトのフォーマッターを変更することは簡単にできます: 
     169>それぞれのテーブル用の生成クラスに加えて、`propel:build-forms`は`BaseFormPropel`クラスも生成します。この空のクラスは`lib/form/base/`ディレクトリに生成された他のすべてのクラスの基底クラスでこれによってすべてのPropelフォームのビヘイビアをグローバルに設定できます。たとえば、すべてのPropelフォームに対してデフォルトのフォーマッターを変更することは簡単にできます: 
    170170> 
    171171>     [php] 
     
    306306    } 
    307307 
    308 タスクは2つのテンプレート、`indexSuccess`と`editSuccess`も生成しました。`editSuccess`テンプレートは`<?php echo $form ?>`ステートメントを使わずに生成されました。`--non-verbose-templates`を利用して、この振る舞いを修正できます: 
     308タスクは2つのテンプレート、`indexSuccess`と`editSuccess`も生成しました。`editSuccess`テンプレートは`<?php echo $form ?>`ステートメントを使わずに生成されました。`--non-verbose-templates`を利用して、このふるまいを修正できます: 
    309309 
    310310    $ ./symfony propel:generate-crud frontend author Author --non-verbose-templates 
     
    390390`propel:build-forms`と`propel:generate-crud`タスクによってモデルオブジェクトを表示する、作成する、編集し、削除する機能を持つsymfonyモジュールを作ることができます。これらのモジュールはモデルのバリデーションルールだけでなくテーブル間のリレーションも考慮します。一行も書かずにこれらすべてが行われます! 
    391391 
    392 生成コードをカスタマイズする段階に来ました。フォームクラスがに多くの要素を考慮しているのであれば、いくつかの面をカスタマイズする必要があります。 
     392生成コードをカスタマイズする段階に来ました。フォームクラスがすでに多くの要素を考慮しているのであれば、いくつかの面をカスタマイズする必要があります。 
    393393 
    394394### バリデータとウィジェットを設定する 
     
    396396デフォルトで生成されたバリデータとウィジェットを設定することから始めましょう。 
    397397 
    398 `ArticleForm`フォームは`slug`フィールドを持ちます。スラッグは記事をURLで一意的に表現する文字の文字列です。えば、タイトルが"Optimize the developments with symfony"である記事のスラッグは`12-optimize-the-developments-with-symfony`で、`12`は記事の`id`です。このフィールドは`title`に依存しており、オブジェクトが保存されたときに自動的に算出されますが、ユーザーによって明示的に上書きされる可能性があります。このフィールドがスキーマに必要な場合でも、フォームに必須にはなることはありません。リスト4-8のように、バリデータを修正してオプションにしている理由はそういうわけです。`content`フィールドもサイズを増やして少なくともユーザーが五文字を入力するようにカスタマイズします。 
     398`ArticleForm`フォームは`slug`フィールドを持ちます。スラッグは記事をURLで一意的に表現する文字の文字列です。たとえば、タイトルが"Optimize the developments with symfony"である記事のスラッグは`12-optimize-the-developments-with-symfony`で、`12`は記事の`id`です。このフィールドは`title`に依存しており、オブジェクトが保存されたときに自動的に算出されますが、ユーザーによって明示的に上書きされる可能性があります。このフィールドがスキーマに必要な場合でも、フォームに必須にはなることはありません。リスト4-8のように、バリデータを修正してオプションにしている理由はそういうわけです。`content`フィールドもサイズを増やして少なくともユーザーが五文字を入力するようにカスタマイズします。 
    399399 
    400400リスト4-8 - バリデータとウィジェットをカスタマイズする 
     
    419419>オブジェクトをPHP配列として利用できるようにするために、`sfValidatorSchema`と`sfWidgetFormSchema`クラスはPHP5以降で利用できる`ArrayAccess`インターフェイスを実装します。 
    420420 
    421 2つの記事が同じ`slug`を持たないことを確認するために、ユニーク制約がスキーマの定義に追加されました。`sfValidatorPropelUnique`バリデータを利用することでデータベースレベルでのこの制約は`ArticleForm`フォームに反映されました。このバリデータは任意のフォームフィールドの独自性をチェックできます。えば、ログインのEメールアドレスの一意性のチェックなどに役立ちます。リスト4-9は`ArticleForm`フォームでこれを使う方法を示しています。 
     4212つの記事が同じ`slug`を持たないことを確認するために、ユニーク制約がスキーマの定義に追加されました。`sfValidatorPropelUnique`バリデータを利用することでデータベースレベルでのこの制約は`ArticleForm`フォームに反映されました。このバリデータは任意のフォームフィールドの独自性をチェックできます。たとえば、ログインのEメールアドレスの一意性のチェックなどに役立ちます。リスト4-9は`ArticleForm`フォームでこれを使う方法を示しています。 
    422422 
    423423リスト4-9 - フィールドの唯一性をチェックするために `sfValidatorPropelUnique`バリデータを使う 
     
    677677    } 
    678678 
    679 `propel:build-forms`を利用することでフォームにオブジェクトモデルをイントロスペクトさせる大抵の要素を自動的に生成できます。この自動処理はいくつかの理由から役立ちます: 
     679`propel:build-forms`を利用することでフォームにオブジェクトモデルをイントロスペクトさせるたいていの要素を自動的に生成できます。この自動処理はいくつかの理由から役立ちます: 
    680680 
    681681  * 退屈で反復される作業をしなくて済むので、開発者の生活が楽になります。プロジェクト固有のビジネスルールに従ってバリデータとウィジェットのカスタマイズに焦点を当てることができます。 
     
    692692### デフォルトの値 
    693693 
    694 **Propelフォームのインスタンスは常Propelのオブジェクトに接続します**。リンクされたPropelオブジェクトは常に`getModelName()`メソッドによって返されたクラスに所属します。えば、`AuthorForm`フォームは`Author`クラスに所属するオブジェクトのみにリンクできます。このオブジェクトは空のオブジェクト(`Author`クラスの空インスタンス)、もしくは最初の引数としてコンストラクタに送り出されるオブジェクトです。"平均的な"フォームのコンストラクタが値の配列を最初の引数として受け取る一方で、PropelフォームのコンストラクタはPropelオブジェクトを受け取ります。このオブジェクトはそれぞれのフィールドのデフォルト値を定義するために使われます。`getObject()`メソッドは現在のインスタンスに関連するオブジェクトを返し`isNew()`メソッドによってコンストラクタ経由でオブジェクトが送り出されたかどうかを知ることができます: 
     694**Propelフォームのインスタンスは常Propelのオブジェクトに接続します**。リンクされたPropelオブジェクトは常に`getModelName()`メソッドによって返されたクラスに所属します。たとえば、`AuthorForm`フォームは`Author`クラスに所属するオブジェクトのみにリンクできます。このオブジェクトは空のオブジェクト(`Author`クラスの空インスタンス)、もしくは最初の引数としてコンストラクタに送り出されるオブジェクトです。"平均的な"フォームのコンストラクタが値の配列を最初の引数として受け取る一方で、PropelフォームのコンストラクタはPropelオブジェクトを受け取ります。このオブジェクトはそれぞれのフィールドのデフォルト値を定義するために使われます。`getObject()`メソッドは現在のインスタンスに関連するオブジェクトを返し`isNew()`メソッドによってコンストラクタ経由でオブジェクトが送り出されたかどうかを知ることができます: 
    695695 
    696696    [php] 
     
    746746        $this->form = new AuthorForm($author); 
    747747 
    748   * 関連テーブル(`author`)から名けられたPHP配列の入力データを読み取れるようにウィジェットの`name`属性フォーマットは自動的にカスタマイズされます: 
     748  * 関連テーブル(`author`)から名けられたPHP配列の入力データを読み取れるようにウィジェットの`name`属性フォーマットは自動的にカスタマイズされます: 
    749749 
    750750        [php] 
     
    782782### save()メソッド 
    783783 
    784 Propelフォームが有効なとき、`save()`メソッドは関連オブジェクトを更新してデータベースに保存します。実際にはこのメソッドはメインオブジェクトだけでなく潜在的に関連するオブジェクトも保存します。えば、`ArticleForm`フォームは記事に結びつけられたタグを更新します。`article`テーブルと`tag`テーブル間の多対多のリレーションでは、記事に関連するタグは(生成された`saveArticleTagList()`メソッドを利用して)`article_tag`テーブルに保存されます。一貫したシリアライズを保証するために、`save()`メソッドは1つのトランザクション内ですべての更新を含みます。 
     784Propelフォームが有効なとき、`save()`メソッドは関連オブジェクトを更新してデータベースに保存します。実際にはこのメソッドはメインオブジェクトだけでなく潜在的に関連するオブジェクトも保存します。たとえば、`ArticleForm`フォームは記事に結びつけられたタグを更新します。`article`テーブルと`tag`テーブル間の多対多のリレーションでは、記事に関連するタグは(生成された`saveArticleTagList()`メソッドを利用して)`article_tag`テーブルに保存されます。一貫したシリアライズを保証するために、`save()`メソッドは1つのトランザクション内ですべての更新を含みます。 
    785785 
    786786>**Note** 
  • doc/branches/1.2/forms/ja/08-Internationalisation-and-Localisation.txt

    r20601 r21360  
    22============================ 
    33 
    4 人気のあるWebアプリケーションの多くは様々な言語で利用可能で、時にユーザーのcultureに基づいてカスタマイズされます。symfonyはこれらの機能の管理を楽にする組み込みのフレームワークを搭載しています(symfony bookの["国際化と ローカライズ"](http://www.symfony-project.org/book/1_2/13-I18n-and-L10n)の章を参照)。 
     4人気のあるWebアプリケーションの多くはさまざまな言語で利用可能で、時にユーザーのcultureに基づいてカスタマイズされます。symfonyはこれらの機能の管理を楽にする組み込みのフレームワークを搭載しています(symfony bookの["国際化と ローカライズ"](http://www.symfony-project.org/book/1_2/13-I18n-and-L10n)の章を参照)。 
    55 
    66フォームフレームワークはユーザーのインターフェイス用の組み込みサポートを備えており国際化オブジェクトの管理を楽にする方法を提供します。 
     
    5959### 翻訳のために使うカタログを指定する 
    6060 
    61 symfonyの国際化フレームワークの機能を利用する場合 (`http://www.symfony-project.org/book/1_2/13-I18n-and-L10n#chapter_13_sub_managing_dictionaries`)、フォームを特定のカタログにバインドできます。リスト8-3において、`ContactForm`フォームを`contact_form`カタログに関連付けします。ですので、フォーム要素の翻訳は`contact_form.fr.xml`ファイルで捜索されます。 
     61symfonyの国際化フレームワークの機能を利用する場合 (`http://www.symfony-project.org/book/1_2/13-I18n-and-L10n#chapter_13_sub_managing_dictionaries`)、フォームを特定のカタログにバインドできます。リスト8-3において、`ContactForm`フォームを`contact_form`カタログに連づけします。ですので、フォーム要素の翻訳は`contact_form.fr.xml`ファイルで捜索されます。 
    6262 
    6363リスト8-3 - 翻訳カタログのカスタマイズ 
     
    7575 
    7676>**Note** 
    77 >カタログを利用することでえばフォームごとに1つのファイルを使用する翻訳の編成がよりベターになります。 
     77>カタログを利用することでたとえばフォームごとに1つのファイルを使用する翻訳の編成がよりベターになります。 
    7878 
    7979### エラーメッセージの国際化 
    8080 
    81 時々、エラーメッセージにはユーザーによって投稿された値が埋め込まれます(例えば、"Eメールアドレスのuser@domainは有効ではありません。")。これをフォームクラスの中でカスタマイズされたエラーメッセージを定義してユーザーが投稿した値を簡単に利用できることを2章で既に見ました。これらの参照は`%parameter_name%`のパターンに従います。 
     81時々、エラーメッセージにはユーザーによって投稿された値が埋め込まれます(たとえば、"Eメールアドレスのuser@domainは有効ではありません。")。これをフォームクラスの中でカスタマイズされたエラーメッセージを定義してユーザーが投稿した値を簡単に利用できることを2章ですでに見ました。これらの参照は`%parameter_name%`のパターンに従います。 
    8282 
    8383リスト8-4はこの原則をコンタクトフォームの`name`フィールドに適用する方法を示しています。 
     
    131131>PHPのcallableは関数もしくはメソッドのインスタンスへの参照です。これは`is_callable()`関数に渡されるときに`true`を返すPHP変数でもあります。 
    132132 
    133 リスト8-6で示されるクラスによって提供される独自の国際化メカニズムをに持つプロジェクトをマイグレートしなければならない場合を考えてみましょう。 
     133リスト8-6で示されるクラスによって提供される独自の国際化メカニズムをすでに持つプロジェクトをマイグレートしなければならない場合を考えてみましょう。 
    134134 
    135135リスト8-6 - カスタムの国際化クラス 
  • doc/branches/1.2/forms/ja/11-Doctrine-Integration.txt

    r20619 r21360  
    22========================= 
    33 
    4 Webプロジェクトにおいて、大抵のフォームはモデルオブジェクトを作成もしくは修正するために使われます。 
     4Webプロジェクトにおいて、たいていのフォームはモデルオブジェクトを作成もしくは修正するために使われます。 
    55これらのオブジェクトはORMのおかげで通常はシリアライズされデータベースに保存されます。 
    66symfonyのフォームシステムはsymfonynの組み込みのORMであるDoctrineとやりとりするための追加レイヤーを提供します。  
     
    103103            BaseTagForm.class.php 
    104104 
    105 `doctrine:build-forms`タスクはスキーマのそれぞれのテーブル用の2つのクラスを生成し、1つの基底クラスは`lib/form/base`ディレクトリに、もう1つの基底クラスは`lib/form/`ディレクトリです。えば、`author`テーブルは`BaseAuthorForm`と`AuthorForm`クラスで構成され、これらのクラスは`lib/form/base/BaseAuthorForm.class.php`と`lib/form/AuthorForm.class.php`ファイルに生成されました。 
     105`doctrine:build-forms`タスクはスキーマのそれぞれのテーブル用の2つのクラスを生成し、1つの基底クラスは`lib/form/base`ディレクトリに、もう1つの基底クラスは`lib/form/`ディレクトリです。たとえば、`author`テーブルは`BaseAuthorForm`と`AuthorForm`クラスで構成され、これらのクラスは`lib/form/base/BaseAuthorForm.class.php`と`lib/form/AuthorForm.class.php`ファイルに生成されました。 
    106106 
    107107下記のテーブルは`AuthorForm`フォームの定義に関連する異なったクラス間の階層をまとめています。 
     
    163163    } 
    164164 
    165 生成クラスはわずかな違いを除いて、以前の章でに作成されたフォームによく似ています: 
     165生成クラスはわずかな違いを除いて、以前の章ですでに作成されたフォームによく似ています: 
    166166 
    167167  * 基底クラスは`sfForm`の代わりに`BaseFormDoctrine` 
     
    172172>Doctrineフォームのグローバルなカスタマイズ 
    173173> 
    174 >それぞれのテーブル用に生成されたクラスに加えて、`doctrine:build-forms`は`BaseFormDoctrine`クラスも生成します。この空のクラスは`lib/form/base/`ディレクトリの中の他のすべての生成クラスの基底クラスであり、Doctrineのすべてのフォームの振る舞いをグローバルに設定することを可能にします。例えば、すべてのDoctrineフォーム用のデフォルトのフォーマッターを簡単に変更できます: 
     174>それぞれのテーブル用に生成されたクラスに加えて、`doctrine:build-forms`は`BaseFormDoctrine`クラスも生成します。この空のクラスは`lib/form/base/`ディレクトリの中の他のすべての生成クラスの基底クラスであり、Doctrineのすべてのフォームのふるまいをグローバルに設定することを可能にします。たとえば、すべてのDoctrineフォーム用のデフォルトのフォーマッターを簡単に変更できます: 
    175175> 
    176176>     [php] 
     
    293293    } 
    294294 
    295 このモジュールにおいて、フォームのライフサイクルは3つのメソッド: `create`、`edit`と、`update`メソッドによって対処されます。`--non-atomic-actions`オプションをけることで、`doctrine:generate-crud`タスクに以前の3つのメソッドの機能のみをカバーする1つのメソッドだけを生成するように頼むこともできます: 
     295このモジュールにおいて、フォームのライフサイクルは3つのメソッド: `create`、`edit`と、`update`メソッドによって対処されます。`--non-atomic-actions`オプションをけることで、`doctrine:generate-crud`タスクに以前の3つのメソッドの機能のみをカバーする1つのメソッドだけを生成するように頼むこともできます: 
    296296 
    297297    $ ./symfony doctrine:generate-crud frontend author Author --non-atomic-actions 
     
    335335    } 
    336336 
    337 タスクは`indexSuccess`と`editSuccess`の2つのテンプレートも生成しました。`<?php echo $form ?>`ステートメントを使わずに`editSuccess`テンプレートが生成されました。`--non-verbose-templates`を使用して、この振る舞いを修正できます: 
     337タスクは`indexSuccess`と`editSuccess`の2つのテンプレートも生成しました。`<?php echo $form ?>`ステートメントを使わずに`editSuccess`テンプレートが生成されました。`--non-verbose-templates`を使用して、このふるまいを修正できます: 
    338338 
    339339    $ ./symfony doctrine:generate-crud frontend author Author --non-verbose-templates 
     
    424424`doctrine:build-forms`と`doctrine:generate-crud`タスクによってモデルオブジェクトの一覧を表示、作成、編集する機能を持つモジュールを作ることができます。これらのモジュールはモデルのバリデーションルールだけでなくテーブル間のリレーションも考慮されます。これらすべては一行のコードを書かずに行われます! 
    425425 
    426 生成コードをカスタマイズしましょう。フォームクラスがに多くの要素を考慮しているのであれば、いくつかの面でカスタマイズする必要があります。 
     426生成コードをカスタマイズしましょう。フォームクラスがすでに多くの要素を考慮しているのであれば、いくつかの面でカスタマイズする必要があります。 
    427427 
    428428### バリデータとウィジェットを設定する 
     
    430430デフォルトで生成されたバリデータとウィジェットを設定することを始めましょう。 
    431431 
    432 `ArticleForm`フォームは`slug`フィールドを持ちます。スラッグはURLの中で記事を一意的に表す文字列です。えば、タイトルが"Optimize the developments with symfony"である記事のslugは`12-optimize-the-developments-with-symfony`で、`12`は記事の`id`です。オブジェクトが保存されたときこのフィールドは`title`に従って自動的に算出されますが、これは明らかにユーザーによって上書きされる可能性があります。このフィールドがスキーマに必要であるとしても、フォームに必須なものになることはありません。リスト4-8で示されるように、これがバリデータを修正してオプションを追加する理由です。`content`フィールドのサイズを増やしてユーザーが少なくとも5文字を入力するようにもカスタマイズします。 
     432`ArticleForm`フォームは`slug`フィールドを持ちます。スラッグはURLの中で記事を一意的に表す文字列です。たとえば、タイトルが"Optimize the developments with symfony"である記事のslugは`12-optimize-the-developments-with-symfony`で、`12`は記事の`id`です。オブジェクトが保存されたときこのフィールドは`title`に従って自動的に算出されますが、これは明らかにユーザーによって上書きされる可能性があります。このフィールドがスキーマに必要であるとしても、フォームに必須なものになることはありません。リスト4-8で示されるように、これがバリデータを修正してオプションを追加する理由です。`content`フィールドのサイズを増やしてユーザーが少なくとも5文字を入力するようにもカスタマイズします。 
    433433 
    434434リスト4-8 - バリデータとウィジェットをカスタマイズする 
     
    713713    } 
    714714 
    715 `doctrine:build-forms`を使うことでフォームはオブジェクトモデルをイントロスペクトして大抵の要素を自動的に生成できます。この自動化はいくつかの理由から役に立ちます: 
     715`doctrine:build-forms`を使うことでフォームはオブジェクトモデルをイントロスペクトしてたいていの要素を自動的に生成できます。この自動化はいくつかの理由から役に立ちます: 
    716716 
    717717  * これによって繰り返される冗長な作業をしなくても済むので、開発者の人生が楽になります。開発者はプロジェクト固有のビジネスルールに従ってバリデータとウィジェットのカスタマイズに集中できます。 
     
    728728### デフォルトの値 
    729729 
    730 **Doctrineフォームのインスタンスは常にDoctrineオブジェクトに接続されます**。リンクされたDoctrineオブジェクトは`getModelName()`メソッドによって返されたクラスに常に所属します。えば、`AuthorForm`フォームは`Author`クラスに所属するオブジェクトのみにリンクできます。このオブジェクトは空のオブジェクト(`Author`クラスの空のインスタンス)、もしくはコンストラクタに最初の引数として送り出されるオブジェクトのどちらかです。"平均的な"フォームのコンストラクタは値の配列を最初の引数として受け取るのに対して、DoctrineフォームのコンストラクタはDoctrineのオブジェクトを受け取ります。このオブジェクトはそれぞれのフィールドのデフォルトの値を定義するために使われます。`getObject()`メソッドは現在のインスタンスに関連するオブジェクトを返し`isNew()`メソッドによってオブジェクトがコンストラクタを通して送り出されたことを知ることができます: 
     730**Doctrineフォームのインスタンスは常にDoctrineオブジェクトに接続されます**。リンクされたDoctrineオブジェクトは`getModelName()`メソッドによって返されたクラスに常に所属します。たとえば、`AuthorForm`フォームは`Author`クラスに所属するオブジェクトのみにリンクできます。このオブジェクトは空のオブジェクト(`Author`クラスの空のインスタンス)、もしくはコンストラクタに最初の引数として送り出されるオブジェクトのどちらかです。"平均的な"フォームのコンストラクタは値の配列を最初の引数として受け取るのに対して、DoctrineフォームのコンストラクタはDoctrineのオブジェクトを受け取ります。このオブジェクトはそれぞれのフィールドのデフォルトの値を定義するために使われます。`getObject()`メソッドは現在のインスタンスに関連するオブジェクトを返し`isNew()`メソッドによってオブジェクトがコンストラクタを通して送り出されたことを知ることができます: 
    731731 
    732732    [php] 
     
    782782        $this->form = new AuthorForm($author); 
    783783 
    784   * 関連テーブル(`author`)から名けられたPHP配列形式で入力データを取得できるようにウィジェットの`name`属性のフォーマットは自動的にカスタマイズされます: 
     784  * 関連テーブル(`author`)から名けられたPHP配列形式で入力データを取得できるようにウィジェットの`name`属性のフォーマットは自動的にカスタマイズされます: 
    785785 
    786786        [php] 
     
    818818### save()メソッド 
    819819 
    820 Doctrineのフォームが有効なとき、`save()`メソッドは関連オブジェクトを更新してそれをデータベースに保存します。このメソッドはメインのオブジェクトだけでなく潜在的に関連するオブジェクトも実際に保存します。えば、`ArticleForm`フォームは記事に関連するタグを更新します。` article`テーブルと`tag`テーブルのリレーションは多対多なので、(生成された`saveArticleTagList()`メソッドを利用して)記事に関連するタグは`article_tag`テーブルに保存されます。 
     820Doctrineのフォームが有効なとき、`save()`メソッドは関連オブジェクトを更新してそれをデータベースに保存します。このメソッドはメインのオブジェクトだけでなく潜在的に関連するオブジェクトも実際に保存します。たとえば、`ArticleForm`フォームは記事に関連するタグを更新します。` article`テーブルと`tag`テーブルのリレーションは多対多なので、(生成された`saveArticleTagList()`メソッドを利用して)記事に関連するタグは`article_tag`テーブルに保存されます。 
    821821 
    822822一貫したシリアライゼーションを保証するために、`save()`メソッドは1つのトランザクションの中のすべての更新を含みます。 
     
    866866 
    867867>**Caution** 
    868 >`doctrine:build-all`タスクはすべてのスキーマテーブルを再生成するためにこれらを削除することに気をけてください。テーブル内のデータはそれゆえ上書きされます。これがそれぞれのモデルを修正するたびに再びダウンロードできるテストデータ(`fixtures`)を作ることが重要である理由です。 
     868>`doctrine:build-all`タスクはすべてのスキーマテーブルを再生成するためにこれらを削除することに気をけてください。テーブル内のデータはそれゆえ上書きされます。これがそれぞれのモデルを修正するたびに再びダウンロードできるテストデータ(`fixtures`)を作ることが重要である理由です。 
    869869 
    870870リスト4-25はウィジェットとバリデータを`file`フィールドにリンクするために`ArticleForm`クラスを修正する方法を示しています。 
  • doc/branches/1.2/forms/ja/A-Widgets.txt

    r20638 r21360  
    66 
    77symfonyフォームフレームワークはたくさんの便利なウィジェットを搭載してやってきます。 
    8 これらのウィジェットは大抵のプロジェクトの共通のニーズをカバーします。 
     8これらのウィジェットはたいていのプロジェクトの共通のニーズをカバーします。 
    99この章ではsymfonyに搭載されたデフォルトのフォームウィジェットを説明します。 
    1010`sfFormExtraPlugin`、`sfPropelPlugin`、と`sfDoctrinePlugin`プラグインからも 
     
    267267>**CAUTION** 
    268268>`edit`モードにおいて、このウィジェットは接尾辞が"_delete"である 
    269 >ファイルアップロードウィジェットから名けられた追加ウィジェットをレンダリングします。 
     269>ファイルアップロードウィジェットから名けられた追加ウィジェットをレンダリングします。 
    270270>ですので、フォームを作る際には、この追加フィールド用のバリデータを追加することをお忘れなく。 
    271271 
     
    350350>~`sfWidgetFormSelectCheckbox`~、と~`sfWidgetFormSelectRadio`~ウィジェット 
    351351>は他のウィジェットと同じくプレーンなもので直接利用できます。 
    352 >大抵の場合、このセクションではこれらのドキュメントは作成されていないので、 
     352>たいていの場合、このセクションではこれらのドキュメントは作成されていないので、 
    353353>より柔軟な`sfWidgetFormChoice`ウィジェットを使う方がベターです。 
    354354 
     
    667667    # ); 
    668668 
    669 ウィジェットの振る舞いは多くのオプションでカスタマイズできます: 
     669ウィジェットのふるまいは多くのオプションでカスタマイズできます: 
    670670 
    671671| オプション     | 説明 
     
    723723    # ); 
    724724 
    725 ウィジェットの振る舞いは多くのオプションでカスタマイズできます: 
     725ウィジェットのふるまいは多くのオプションでカスタマイズできます: 
    726726 
    727727| オプション               | 説明 
     
    982982HTTPリクエストからフォームをバインドするときこれらを手動で追加しなければなりません。 
    983983 
    984 えば、フォームが`contact[%s]`ネームフォーマットを持つ場合、 
     984たとえば、フォームが`contact[%s]`ネームフォーマットを持つ場合、 
    985985captcha情報が残りのフォームに投稿された値にマージされることを保証するために必要なコードは次の通りです: 
    986986 
     
    10311031 
    10321032`sfWidgetFormSchema`ウィジェットはいくつかのフィールドで構成されるウィジェットを表します。 
    1033 フィールドは名前きのシンプルなウィジェットです: 
     1033フィールドは名前きのシンプルなウィジェットです: 
    10341034 
    10351035    [php] 
     
    10641064 
    10651065`sfWidgetFormSchema`クラスは`sfWidgetForm`クラスを継承するので、 
    1066 すべてのメソッドと振る舞いを継承します。 
     1066すべてのメソッドとふるまいを継承します。 
    10671067 
    10681068>**CAUTION** 
  • doc/branches/1.2/forms/ja/B-Validators.txt

    r20619 r21360  
    66 
    77symfonyフォームフレームワークはたくさんの便利なバリデータを搭載しています。 
    8 これらのバリデータは大抵のプロジェクトの共通のニーズをカバーします。 
     8これらのバリデータはたいていのプロジェクトの共通のニーズをカバーします。 
    99この章ではsymfonyに搭載されたデフォルトのフォームバリデータを説明します。 
    1010`sfPropelPlugin`、と`sfDoctrinePlugin`プラグインにもバリデータが含まれています。 
     
    2626バリデータは2つの目標: 汚染された値をクリーンにすることとバリデートすることを持ちます。 
    2727 
    28 バリデータを作るとき、オプションとしてオプションとエラーメッセージを引数として渡すことができます: 
     28バリデータを作るとき、オプションの引数としてオプションとエラーメッセージを渡すことができます: 
    2929 
    3030    [php] 
     
    5454    $cleaned = $v->clean('name', 'value', array('class' => 'foo')); 
    5555 
    56 `clean()`メソッドは汚染された値を引数として受け取りクリーンな値を返します。 
     56`clean()`メソッドは引数として汚染された値を受け取りクリーンな値を返します。 
    5757バリデーションエラーが起きるとき、`sfValidatorError`が投げられます。 
    5858 
     
    269269*スキーマバリデータ*: No 
    270270 
    271 `sfValidatorCallback`バリデータは実際のバリデーション作業をPHP callbackに委譲します。 
     271`sfValidatorCallback`バリデータは実際のバリデーション作業をPHPコールバックに委譲します。 
    272272 
    273273callbackは現在のバリデータインスタンスに、(`arguments`オプションから) 
     
    292292| オプション  | エラー| 説明 
    293293| ----------- | ----- | ----------- 
    294 | `callback`  | n/a   | 有効なPHP callback (必須) 
    295 | `arguments` | n/a   | callbackに渡す引数の配列 
     294| `callback`  | n/a   | 有効なPHPコールバック(必須) 
     295| `arguments` | n/a   | コールバックに渡す引数の配列 
    296296 
    297297日付バリデータ 
     
    302302*スキーマバリデータ*: No 
    303303 
    304 `sfValidatorDate`は日付と日付と時間の組をバリデートします 
     304`sfValidatorDate`は日付と時間の組をバリデートします 
    305305(日付と時間の組は`with_time`オプションを設定することでサポートされます)。 
    306306日付フォーマットをバリデートすることとは別に、 
     
    416416| `validated_file_class` | n/a          | クリーンにされたアップロードファイルを管理するクラスの名前(オプション) 
    417417 
    418 `web_images` mime-typeカテゴリは次のmime-typeを含みます: 
     418`web_images`カテゴリは次のmime-typeを含みます: 
    419419 
    420420 * `image/jpeg` 
     
    429429 * `guessFromFileinfo`:        `finfo_open()`関数を使用する(PECLの`Fileinfo`エクステンションから) 
    430430 * `guessFromMimeContentType`: `mime_content_type()`関すを使用する (非推奨) 
    431  * `guessFromFileBinary`:      ファイルバイナリを使用する(*nixシステムでのみ動作する) 
     431 * `guessFromFileBinary`:      ファイルバイナリを使用する(Unix系システムでのみ動作する) 
    432432 
    433433| エラー       | プレースホルダー              | デフォルト値 
     
    487487少なくともリストからのバリデータから汚染された値が通過する場合、`sfValidatorOr`バリデータはその汚染された値をバリデートします。 
    488488 
    489 `sfValidatorOr`コンストラクタは最初の引数としてバリデータのリストを取ります: 
     489`sfValidatorOr`コンストラクタは最初の引数としてバリデータのリストを受け取ります: 
    490490 
    491491    [php]