Symfony2 动态/依赖形式

2024-03-29

我有一个包含 3 个依赖字段的表单:

制造商 -> 制造商产品组 -> 制造商产品系列

所以我想选择一个制造商,基于制造商的产品组和基于产品组的产品系列。

有一个 CookBook Entry 关于如何处理此类动态表单 它很容易为ManufacturerProductGroup 工作。问题是 ManufacturerProductSeries 取决于另一个动态表单/字段。

问题是,我无法在闭包中添加侦听器,因为我只有 访问 FormInterface 不再是 FormBuilderInterface。

我无法像 PRE_SET_DATA 监听器那样仅使用一个监听器来完成此操作,因为表单 然后将提交,这可以防止任何修改。我要么需要一种方法来添加 监听器动态地或者可能只更新 POST_SUBMIT 监听器中的数据 并且不替换整个字段/表单。

这是给出错误的代码,因为我将侦听器添加到不存在的 表单字段(manufacturerProductGroup 仅在 pre_set_data 事件之后可用)

/**
 * @param FormBuilderInterface $builder
 * @param array                $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('manufacturer', 'entity', array('class' => 'ArticleBundle:manufacturer', 'empty_value' => false));

    $manufacturerProductGroupModifier = function(FormInterface $form, Manufacturer $manufacturer)
    {
        $manufacturerProductGroups = $this->em->getRepository('ArticleBundle:ManufacturerProductGroup')
            ->findAvailableByManufacturer($manufacturer);

        $form->add(
            'manufacturerProductGroup',
            'entity',
            array(
                'class' => 'ArticleBundle:ManufacturerProductGroup',
                'empty_value' => '',
                'choices' => $manufacturerProductGroups
            )
        );
    };

    $manufacturerProductSeriesModifier = function(FormInterface $form, ManufacturerProductGroup $manufacturerProductGroup)
    {
        $manufacturerProductSeries = $this->em->getRepository('ArticleBundle:ManufacturerProductSeries')
            ->findAvailableByManufacturerProductGroup($manufacturerProductGroup);

        $form->add(
            'manufacturerProductSeries',
            'entity',
            array(
                'class' => 'ArticleBundle:ManufacturerProductSeries',
                'empty_value' => '',
                'choices' => $manufacturerProductSeries
            )
        );

    };

    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function(FormEvent $event) use ($manufacturerProductGroupModifier, $manufacturerProductSeriesModifier) {
            /** @var $article Article */
            $article = $event->getData();
            $manufacturerProductGroupModifier($event->getForm(), $article->getManufacturer());
            $manufacturerProductSeriesModifier($event->getForm(), $article->getManufacturerProductGroup());
        }
    );

    $builder->get('manufacturer')->addEventListener(
        FormEvents::POST_SUBMIT,
        function(FormEvent $event) use ($manufacturerProductGroupModifier) {
            $manufacturer = $event->getForm()->getData();
            $manufacturerProductGroupModifier($event->getForm()->getParent(), $manufacturer);
        }
    );

    $builder->get('manufacturerProductGroup')->addEventListener(
        FormEvents::POST_SUBMIT,
        function(FormEvent $event) use ($manufacturerProductSeriesModifier) {
            $manufacturerProductGroup = $event->getForm()->getData();
            $manufacturerProductSeriesModifier($event->getForm()->getParent(), $manufacturerProductGroup);
        }
    );
}

我用以下代码解决了这个问题:

    $addManufacturerProductSeries = function (FormEvent $event) {
        $form = $event->getForm()->getParent();
        $manufacturerProductGroup = $event->getData();

        $form->add(
            'manufacturerProductSeries',
            'entity',
            array(
                'auto_initialize' => false,
                'class' => 'ArticleBundle:ManufacturerProductSeries',
                'query_builder' => function (ManufacturerProductSeriesRepository $repository) use ($manufacturerProductGroup) {
                    return $repository->findAvailableByManufacturerProductGroupQueryBuilder($manufacturerProductGroup);
                },
            )
        );
    };

    $addManufacturerProductGroup = function (FormEvent $event) use ($factory, $addManufacturerProductSeries) {
        $form = $event->getForm()->getParent();
        $manufacturer = $event->getData();

        $fieldBuilder = $factory->createNamedBuilder(
            'manufacturerProductGroup',
            'entity',
            null,
            array(
                'auto_initialize' => false,
                'class' => 'ArticleBundle:ManufacturerProductGroup',
              'query_builder' => function (ManufacturerProductGroupRepository $repository) use ($manufacturer) {
                    return $repository->findAvailableByManufacturerQueryBuilder($manufacturer);
                },
            )
        );

        $fieldBuilder->addEventListener(FormEvents::POST_SET_DATA, $addManufacturerProductSeries);
        $fieldBuilder->addEventListener(FormEvents::POST_SUBMIT, $addManufacturerProductSeries);

        $form->add($fieldBuilder->getForm());
    };

    $builder->get('manufacturer')->addEventListener(FormEvents::POST_SET_DATA, $addManufacturerProductGroup);
    $builder->get('manufacturer')->addEventListener(FormEvents::POST_SUBMIT, $addManufacturerProductGroup);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Symfony2 动态/依赖形式 的相关文章

  • 用于电子邮件和文件日志记录的 Symfony2 Monolog 设置

    我想设置 Symfony2 向我发送电子邮件critical错误 但只需记录error级别错误 下面的设置可以做到这一点吗 monolog handlers main type fingers crossed action level er
  • 如何在 PHP、HTML 表单和 Javascript 之间传递布尔值

    我有一个 PHP 程序 它使用 HTML 表单并使用 JavaScript 进行验证 HTML 表单中有一个隐藏字段 其中包含一个布尔值 该值由 PHP 设置 由 JavaScript 在提交时进行验证 然后传递到另一个 PHP 页面 当我
  • 独立 Symfony2 包内的功能测试

    我需要直接在独立包中进行一些功能测试 我不想测试控制器 只是测试真实服务之间的一些交互 我想知道是否有标准 最佳方法可以做到这一点 我用一种方法做到了 但想知道是否有更好的方法 这是我自己的解决方案 我总结了在独立包中测试的所有过程 1 首
  • Doctrine/Symfony 如何使用数组中的特定数据更新实体

    我环顾四周太久了 但没有运气 我的情况是 我有一个有点大的表 60 列 在 Doctrine Entity 中表示 在 FosREST 上工作 我想要实现的是 我想发送带有特定数据的 JSON 例如 phone gt new phone n
  • 查找当前视图的twig文件

    当我想修改当前视图中的某些内容时 我必须查看操作和控制器 DefaultController indexAction例如 转到操作函数 indexAction 并查看该操作正在渲染什么文件 有没有更快的方法来找出哪个文件 xxxx html
  • 使用 Javascript 提交表单

    我的一些表单是用Javascript JQuery提交的 所以不会发生页面刷新 但我注意到我的两台计算机之间的浏览器存在奇怪的行为 在一台计算机 以及我测试过的所有浏览器 上 我的表单提交按预期执行 我的另一台电脑 Mac 时好时坏 我将提
  • 如何从symfony2中的现有表生成实体?

    我有带有一些字段的表 my table 我想在 MyBundle 中使用 my table 生成实体 但我不想重新创建 MyBundle 中的所有实体 我怎样才能做到这一点 这是你可以做到的方法 第一步 要求Doctrine自省数据库并生成
  • HTML 表单:POST 对象数组

    提交班级名单 一次添加3名学生 每个学生都有最初 最后的年龄 问题 我们如何才能将所有学生放入数组中 students 0 gt Array first gt first name for 0 last gt last name for 0
  • 防止刷新时提交双重表单

    我有一个简单的问题 我知道当用户使用 Post Redirect Get 模式重新加载页面时 我可以防止表单重新提交自身 但我的问题是 如果我将用户重定向回提交表单的同一页面 这种模式是否有效 我的意思是 我不想将用户重定向到另一个页面 请
  • PHP 5 的 HTML 表单库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个QuickForm替代品 QF 存在性能问题 例如组合框中的许多选项 我还想要一些更面向对象的东西 比如 Zend Form
  • Rails 3 UJS 干客户端 + 服务器端表单验证

    使用 jQuery 进行表单验证就像向字段添加类名一样简单 使用 Rails 进行表单验证就像将条件放入控制器 和 或模型 中一样简单 我认为应该有一种方法可以编写一次验证并将它们应用到客户端和服务器端 我一直热衷于编写自己的 javasc
  • 类似的 PHP 表单代码:如果 $_REQUEST 为空,第一个抛出错误,第二个则不抛出错误

    我是 PHP 新手 所以这可能是一个简单的答案 希望我能正确地按照 SO 标准格式化它 对于该网站来说仍然是新的 我正在通过 SitePoint 编写两组非常相似的代码 提交表单数据并使用 htmlspecialchars 来阻止 XSS
  • 如何使用来自数据库的值来定义 Twig 模板的全局变量?

    我想为 twig 定义一个全局变量 可以从任何模板访问它 我可以在 symfony 中创建一个全局变量config packages twig yaml 但我需要它是从数据库获取的值 在 twig 的文档中 它说使用此代码 twig new
  • Symfony 4.1 组件 - 依赖注入问题

    我正在用 PHP 重构旧应用程序 我正在尝试使用 Symfony 依赖注入组件将服务注入控制器 或其他服务 但我不知道如何实现这一点 因为 symphony 文档比框架组件更适合使用框架 我已经有了自己的内核 包含所有服务和控制器的容器 控
  • 强制 PayPal 始终请求信用卡信息而不是登录表单?

    我们的网站采用贝宝付款标准 当用户在我们的网站上填写他们的请求并按下 PayPal 按钮 立即购买 时 我们会将所有变量提交给 PayPal 以便他们可以处理付款 对于那些以前从未使用过贝宝并通过我们的网站付款的用户来说 它运行得非常好 因
  • phpunit --debug 仍然只显示点

    我想查看 phpunit 运行期间当前执行的测试 我用 debugparam 但仍然只得到点 phpunit debug PHPUnit 3 7 19 by Sebastian Bergmann Configuration read fro
  • 一个表单包含两个提交按钮,每个按钮都有不同的操作

    我花了几个小时试图找到问题的解决方案 但似乎找不到正确的解决方案 提前感谢你的帮助 我有一个 html 表单
  • Symfony StreamedResponse 服务器发送事件阻止请求

    我在 Symfony 中使用 StreamedResponse 实现了服务器发送事件 SSE 因此 当事件发生时 会话中会保存一条消息 该消息将通知给用户 问题是 当执行包含客户端代码的页面时 它会阻止对应用程序的所有 Web 请求 直到
  • 当 AngularJS 表单无效时禁用提交按钮

    我的表格是这样的
  • 在应用程序内核中找不到 FOSUserBundle

    我在 Windows 上使用 symfony 并尝试按照官方文档中的描述配置 FOSUserBundle 尝试更新架构时出现此错误 Class FOS UserBundle FOSUserBundle not found in app Ap

随机推荐

  • 是否有实体框架 7 数据库优先 POCO 生成器?

    我一直在为我正在开发的一个新项目使用 Entity Framework 7 和 ASP NET 5 但遇到了障碍 我所在的团队使用 DBA 优先的开发方法 即数据库由 DBA 设计 然后开发人员更改代码以补偿模型更改 使用 EF6 效果很好
  • 如何使图像高度适合并置文本高度

    我有一个图像和一个并排的文本 图像在左边 文本在右边 关于如何根据文本段落高度 以及宽度与高度保持比例 调整图像高度的任何想法 而不是将文本环绕在图像周围 这是我所能做到的 div style display table width 100
  • Flask jsonify 支持 UTF-8 吗?

    我一直在使用 Flasks 和 jsonify 进行实验 有用 但不支持 utf 8 字符 土耳其字符 我正在使用字典 if api key in key list quotes ataturk Hayatta En Hakiki Murs
  • 如何在启动时完全停止 Android Studio 索引/扫描/构建?

    我怎样才能停止这个索引或任何这个启动过程 它是做什么用的 它为什么这么做 我可以在以后最需要的时候推迟加载这么大的进程吗 我通过无效并重新启动解决了这个问题 我在循环中遇到了这个问题 在没有运行或构建任何东西的情况下不停地索引 文件 gt
  • ModelAttribute 可以是原始的吗?

    我在 Spring MVC 3 0 中的 ModelAttribute 上遇到了一个奇怪的问题 当我在本地主机部署应用程序时 它工作正常 但是当我在远程服务器上部署该应用程序时 每次用户访问特定操作时它都会失败 并出现错误 ERROR my
  • 互斥的powershell参数

    SCENARIO 我正在使用 Visual Studio 2008 和 NET 3 5 为 Powershell 2 0 编写 cmdlet 该 cmdlet 需要 3 个参数 我想要的 cmdlet 语法是这样的 cmdletname f
  • Apache2中可以有两个密码文件吗?

    我可以在 apache2 sites enabled 000 default 配置文件中包含两个 AuthUserFile 指令吗
  • Google App Engine“搜索”的测试床存根

    我正在尝试使用开发应用程序服务器在 Python 中测试 Google App Engine 的新全文搜索功能 是否有存根search https developers google com appengine docs python se
  • Spark:“无法使用 UnspecifiedFrame。这应该在分析过程中进行转换。请提交错误报告”

    Spark 2 3 0 与 Scala 2 11 我正在尝试编写一个自定义聚合器并在每个窗口函数上运行它这些文档 https spark apache org docs latest sql programming guide html t
  • Google Guava 供应商示例

    请用合适的例子解释Supplier in Guava 接口的使用 The Supplier接口只是一个返回值的无参数函数的抽象 它是一个获取对象的某个或多个实例的方法 因为它很通用 所以可以用来做很多事情 贾里德解释了如何Multimaps
  • 如何设置 Heroku Postgresql 的日志记录级别?

    将 Heroku 与 Postgresql 插件结合使用 在查看我的日志后 似乎 postgresql 正在记录每个 单个 事务 我知道您可以通过执行类似的操作来设置日志级别 https www postgresql org docs 9
  • 字体和颜色 - #region

    是否可以更改 region 和 endregion 的字体颜色 我在以下位置找不到这个元素extras options fonts and colors 它在这里 TOOLS gt Options gt Environment gt Fon
  • csv-parse 解析的对象的第一个属性不可访问

    我正在使用以下内容解析 csv 文件csv 解析 https csv js org parse userID sysID 20 50 30 71 但是 在返回的对象上 无法访问从第一列创建的属性userID 这是我的代码 async fun
  • 改造:将对象列表反序列化为不同类型

    开发 Android 应用程序 我正在使用改造来得到我的回应 目前我已经制作了一个 POJO 模型类 其中包含所有类型的字段 实际上它们有更多的字段和自己的方法 所以我在这里简化了它们很多 代码来自Client class OkHttpCl
  • 使用 R TM 包查找 2 和 3 个单词短语

    我正在尝试找到一个代码 该代码实际上可以在 R 文本挖掘包中找到最常用的两个和三个单词短语 也许还有另一个我不知道的包 我一直在尝试使用标记器 但似乎没有运气 如果您过去处理过类似的情况 您可以发布经过测试且实际有效的代码吗 太感谢了 您可
  • 1.9.1 的 ruby​​ ping

    我想在我的 ruby 代码中 ping 一个站点 发现 net ping 是一个很好的库 不幸的是 当我尝试 gem install net ping 时 出现以下错误 C gt gem 安装 net ping错误 安装 net ping
  • MVVM 符合 WPF 应用程序中的本地化

    如何使用 MVVM 模式本地化 WPF 应用程序 我真的很想以 正确 的方式去做 我当前的方法是使用 resx 资源文件来本地化我的应用程序 我将它们包含在我的 xaml 代码中 xmlns localization clr namespa
  • asp.net 网站中的 Quartz.net 设置

    我刚刚将quartz net dll 添加到我的bin 中并启动了我的示例 如何使用基于时间的quartz net 调用C 方法 using System using System Collections Generic using Sys
  • 开始后取消/停止 jquery fadeOut

    我有一个非常简单的页面 当用户单击页面上的特定条目时 该页面会显示状态更新 这一切工作正常 第一次点击更新id sts 如果输出正确 6 秒后这种现象就会消失 然而 虽然它会淡出 但如果用户单击另一个链接 DIV 会使用新文本进行更新 但它
  • Symfony2 动态/依赖形式

    我有一个包含 3 个依赖字段的表单 制造商 gt 制造商产品组 gt 制造商产品系列 所以我想选择一个制造商 基于制造商的产品组和基于产品组的产品系列 有一个 CookBook Entry 关于如何处理此类动态表单 它很容易为Manufac