対応するエンティティの構成方法によってフィールドが異なる Symfony 2 でフォームを作成しています。
簡単に言うと、各エンティティには、さまざまなタイプと構成のデータを保持できる一連の「詳細」フィールドがあります。
たとえば、Project
エンティティは次の構成を持つ場合があります。
url
テキスト入力としてレンダリングし、最大長 300 文字の URL として検証します。description
検証制約のないテキストエリアとしてレンダリングします。logo
ファイル入力としてレンダリングし、最大サイズが 500x500 の画像ファイルとして検証します。
等々。これを興味深いものにしている部分は、管理者が UI を介してこれらのモデルの構成を変更できるように、これらすべてがデータベース テーブルを介して構成されていることです。
データベース構造 (の関連部分) は次のようになります。
project
プロジェクト レコードを格納します。project_detail
各プロジェクトの各詳細フィールドの値を格納します。detail_type
各詳細フィールドのタイプと構成を定義します。detail_type_assignment
各エンティティで使用できる詳細タイプと、フィールドがフォームに表示される順序を定義します。
フォームでのエラー メッセージのレンダリングを除いて、これまでのところすべてうまく機能しています。
これらの詳細フィールドのいずれかで検証エラーが発生すると、フォームの上部に表示されます。
上の画像で、「EIN」はProject
エンティティに存在するフィールド (つまり、Symfony フォームの通常の方法で実装) であり、「URL」と「ロゴのアップロード」は詳細フィールドとして実装されていることに注意してください。
ProjectType
外観は次のとおりです。
class ProjectType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('ein', 'ein')
;
/* Add detail fields to the form builder. */
foreach($this->getDetailTypes() as $detailType)
{
$slug = $detailType->getSlug();
$formatter = $detailType->createFormatterInstance('');
$builder->add(
$slug
, $formatter->getFormFieldType()
, $formatter->getFormFieldOptions()
);
/* E.g.,
*
* $builder->add(
* 'url'
* , 'text'
* , array('label' => 'URL', ...)
* )
*/
}
}
...
}
ここで起こっていることは、 が を正しくViolationMapper
翻訳できないことだと確信しています。property_path
たとえば、実行時property_path
のurl
値の は ですproject.details[url].value
が、フィールドは にありproject.url
ます。
各フィールドの位置がそのproperty_path
. 違反が追加されるパスを変更する方法はありExecutionContext
ますか?