处理SonataAdminBundle表单中不存在的集合字段

时间:2014-08-28 20:06:32

标签: php json forms collections sonata-admin

我有一个实体类ContactsPage来存储有关电子邮件,电话等的一些信息。问题是将所有这些信息放到ContactsPage实体中定义的json格式的一个字段“contacts”中:

class ContactsPage
{
...
    /**
     * @var string
     *
     * @ORM\Column(name="contacts", type="text", nullable=true)
     */
    private $contacts;
...
}

ContactsPageAdmin表单构建电子邮件示例:

protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
        ->add('emails', 'collection', 
              array(
                  'mapped' => false, 
                  'required' => false,
                  'type' => 'text',
                  'allow_add' => true,
                  'allow_delete' => true,
              )
         );
}
  • 我如何以及在哪里可以获得此“电子邮件”数组(或集合)?
  • 在保存ContactsPage实体之前,我可以在哪里处理此数组以生成json并将其推送到“contacts”字段?
  • 我可以在何处以及如何处理“联系人”字段并将所有已解码的json信息转换为编辑表单(转换为“电子邮件”集合)?

感谢。

1 个答案:

答案 0 :(得分:0)

几乎花了一天时间,但我自己找到了答案。 第一和第二个问题。 我必须在admin-class中定义prePersist和preUpdate方法,并将我的Entity作为参数,我可以在其中获取和处理"电子邮件"阵列:

class ContactsPageAdmin extends Admin
{
...
    public function prePersist($contactsPage)
    {
        $emails = $this->getForm()->get('emails')->getData();
        $contactsPage->setContacts(json_encode($emails));
    }
    public function Update($contactsPage)
    {
        $emails = $this->getForm()->get('emails')->getData();
        $contactsPage->setContacts(json_encode($emails));
    }
...
}

第三个问题怎么样?我只需要使用$ this-> getSubject()来获取原始实体和'数据'要加载所需数据的属性:

class ContactsPageAdmin extends Admin
{
...
    protected function configureFormFields(FormMapper $formMapper)
        $entity = $this->getSubject();           // getting original Entity
        $json = $entity->getContacts();          // field with json data
        $array = json_decode($json, true);

        // preparing data to fulfill necessary form fields
        $array['emails'] = is_array($array['emails']) ? $array['emails'] : array();

        $formMapper
            ->add('emails', 'collection', 
                array(
                    'mapped' => false, 
                    'required' => false,
                    'type' => 'text',
                    'allow_add' => true,
                    'allow_delete' => true,
                    'data' => $array['emails']    //  embeding prepared data into collection
                )
              );
    }
...
}