私のアプリケーションでは、ユーザーはいくつかのエンティティのカスタム フィールドを作成し、フォームを表示するときにエンティティ オブジェクトごとにこのカスタム フィールドの値を設定できます。
実装は次のようになります。
1º) フォーム用のインターフェイスを作成し、このインターフェイスを実装するフォームを作成しました。
2º) すべてのフォームのフォーム拡張機能を作成しました。
app_core_form_builder.form_extension:
class: App\Core\Bundle\FormBuilderBundle\Form\FormExtension
arguments: ["@service_container", "@doctrine.orm.entity_manager"]
tags:
- { name: form.type_extension, alias: form }
3º) この拡張では、フォームがステップ 1 で参照されているインターフェイスを実装している場合、EventSubscriber を追加します。
if($formType instanceof \App\Core\Bundle\FormBuilderBundle\Model\IAllowCustomFieldsdInterface){
$builder->addEventSubscriber(new FormSubscriber($this->container, $this->em));
}
4º) このフォーム サブスクライバーは、preSetData FormEvent をサブスクライブします。このメソッドでは、フォームに関連付けられたエンティティを取得し、それに対して作成されたすべてのカスタム フィールドを取得します。次に、Symfony2 フォーム タイプを使用して、このフィールドをフォームに追加します。すべてがうまくいき、フォームを表示すると、カスタム フィールドが正しく表示されます。記録のために、フォームを保存すると、カスタム フィールドに挿入された値も保存されます。
public function preSetData(FormEvent $event) {
$data = $event->getData();
$form = $event->getForm();
// During form creation setData() is called with null as an argument
// by the FormBuilder constructor. You're only concerned with when
// setData is called with an actual Entity object in it (whether new
// or fetched with Doctrine). This if statement lets you skip right
// over the null condition.
if (null === $data) {
return;
}
$formEntity = $form->getConfig()->getType()->getInnerType()->getEntity();
$DbEntity = $this->em->getRepository('AppCoreSchemaBundle:DbEntity')->findOneBy(array('id' => $formEntity));
if ($DbEntity && $DbEntity->getAllowCustomFields()) {
$organization = $this->container->get('app_user.user_manager')->getCurrentOrganization();
if (!$organization) {
throw $this->createNotFoundException('Unable to find Organization entity.');
}
$params = array(
'organization' => $organization,
'entity' => $DbEntity,
);
$entities = $this->em->getRepository('AppCoreSchemaBundle:DbCustomField')->getAll($params);
# RUN BY ALL CUSTOM FIELDS AND ADD APPROPRIATE FIELD TYPES AND VALIDATORS
foreach ($entities as $customField) {
# configurate customfield
FieldConfiguration::configurate($customField, $form);
# THE PROBLEM IS HERE
# IF OBJECT IS NOT NULL THEN MAKE SET DATA FOR APPROPRIATED FIELD
if ($data->getId()) {
$filters = array(
'custom_field' => $customField,
'object' => $data->getId(),
);
$DbCustomFieldValue = $this->em->getRepository('UebCoreSchemaBundle:DbCustomFieldValue')->getFieldValue($filters);
if ($DbCustomFieldValue) {
$form[$customField->getFieldAlias()]->setData($DbCustomFieldValue->getValue());
} else {
$form[$customField->getFieldAlias()]->setData(array());
}
}
}
}
}
問題は、フォームを編集しようとしたときです。上記のコードの「THE PROBLEM IS HERE」という部分を見れば理解できます。
フォームのオブジェクトに ID がある場合、そのオブジェクトのカスタム フィールドに格納されている値を取得し、$form[field_alias']->setData (配列型としてマップされたデータベースから返された値) を呼び出します。
しかし、これは機能せず、データはフィールドに設定されていません。しかし、コントローラーで同じことを行うと、データは適切に設定されます。
問題がどこにあるのか誰にも分かりますか? preSetData イベントでデータを設定できませんか?
編集済み
エンティティ DbCustomField の値フィールドは、次のようにマップされます。
/**
* @var string
*
* @ORM\Column(name="value", type="array", nullable=true)
*/
protected $value;
`
var_dump($DbCustomFieldValue)
-> オブジェクト (Ueb\Core\Bundle\SchemaBundle\Entity\DbCustomFieldValue)
var_dump(DbCustomFieldValue->getValue())
-> string(11) "ブルーノ バロール"
しかし、次のようなことを試しても:
var_dump($customField->getFieldAlias());
= 文字列(21) "testebruno-1383147874"
$form[$customField->getFieldAlias()]->setData('example1');
それは動作しません。
しかし、私のコントローラーで、上記の fieldAlias に対して次のことを行うと:
$form['testebruno-1383147874']->setData('example2');
->それは動作します
何か案が?