4

私のアプリケーションでは、ユーザーはいくつかのエンティティのカスタム フィールドを作成し、フォームを表示するときにエンティティ オブジェクトごとにこのカスタム フィールドの値を設定できます。

実装は次のようになります。

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');

->それは動作します

何か案が?

4

1 に答える 1