php - 允许添加的 Symfony 表单实体

标签 php forms symfony entity

我正在使用 Symfony 2.3 构建一个应用程序。 我有一个 Booking 实体女巫通过 ManyToOne 关系与 Customer 实体相关。

在我的表单中,我希望能够选择一个现有客户或创建一个新客户。 例如,在我的客户中有一个“新客户”选项,选择谁将使用 javascript 显示客户表单。

事实上,我正在尝试构建一个带有“allow_add”选项的实体表单字段,就像在集合表单字段中一样。

知道我该怎么做吗?

非常感谢。

最佳答案

感谢您的贡献。我找到了实现它的方法! 解决方案是在 Customer 表单中有一个字段,它必须被映射,而实体字段在 Customer 实体中但不被映射。

$builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function(FormEvent $event) use ($company) {
            $form = $event->getForm();
            $data = $event->getData();

            $form->add('customer_list', 'entity',
                [
                    'class' => 'SomeBunlde\Entity\Customer',
                    'label'    => 'Client',
                    'property' => 'fullName',
                    'expanded' => false,
                    'multiple' => false,
                    'mapped'   => false,
                    'query_builder' => function(EntityRepository $er) use ($company)
                        {
                            return $er->getByCompanyQueryBuilder($company);
                        },
                ]
            )
            ;

            if ($data->getCustomer() === null) {
                $form->add('customer', new CustomerType());
            }
        }

在我向重载 finishView 方法的实体表单字段添加一个额外选项之后:

public function finishView(FormView $view, FormInterface $form, array $options)
{
    array_unshift($view->children['customer_list']->vars['choices'], new SfFormExt\ChoiceView('test', 'new', 'Nouveau client'));
}

然后我添加两个事件监听器,一个 pre_submit 以删除映射的嵌入式客户表单及其数据:

$builder->addEventListener(
        FormEvents::PRE_SUBMIT,
        function(FormEvent $event) use ($em) {
            $data = $event->getData();

            if ($data['customer_list'] !== 'new') {
                unset($data['customer']);
                $event->getForm()->remove('customer');
                  // setting data w/out customer to avoid extra-field error
                $event->setData($data);
            }
        }
    );

和一个将现有客户附加到预订的绑定(bind)事件:

$builder->addEventListener(
        FormEvents::BIND,
        function(FormEvent $event) use ($em) {
            $form = $event->getForm();
            $data = $event->getData();

            if (!$form->has('customer')) {
                $existing_customer = $form->get('customer_list')->getData();
                if ($existing_customer instanceof Customer) {
                    $data->setCustomer($existing_customer);
                }
            }
        }
    );

我知道它可能不是最先进的代码,但它工作得很好。

编辑:我对这项技术有疑问,因为当 customer_list 设置为 new 时,它会抛出错误。我没有找到避免此错误的方法(如果您知道我如何实现此错误!)所以我决定修改 pre_submit 以设置为“”如果我们处于新客户案例中,则 customer_list 值的数据,然后我在 Controller 中检测新客户端表单是否存在表单验证错误以便正确显示它。

关于php - 允许添加的 Symfony 表单实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20833113/

相关文章:

jsp - 如何用servlet派发的数据填充jsp中的html表单?

php - Silverstripe UserForms - 从 DataObject 填充选项

php - 在 Symfony 中为子一对多过滤器添加排序

orm - Symfony2 - 学说 :create in Production

symfony - 如何使用 phantomjs + behat + mink 处理确认弹出窗口

java - Java 和 PHP 中的相似数据结构

PHP:如何将时间字符串与日期 ('H:i' 进行比较)?

PHP PDO SQL 将两个字符串连接在一起

php - 一个查询中的多个 SQL 插入

html - 内联表单 MVC