Symfony2 Sonata 管理员根据所选值动态更改输入数据

2023-12-02

对于我的一个对象,我需要创建一些动态表单渲染...但我不知道如何在 Sonata Admin 中执行此操作。例如,当我创建一个对象时,我有一个字段类型。在此字段中,我选择我的对象的类型。现在,当我选择类型时,我想根据类型显示一个字段。例如,如果我选择类型“轮播”,我想显示一个选择实体库中所有对象的字段。如果我选择类型“产品”,我想显示包含所有可供选择的产品的字段...我怎样才能实现这一点?

现在我有这个:

/**
 * @param FormMapper $formMapper
 */
protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
        ->with('Module', array(
            'class' => 'col-md-6'
        ))
            ->add('position')
            ->add('type', null, array(
                'attr' => array('class' => 'module_type')
            ))
            ->add('items', 'entity', array(
                'class' => 'ApplicationSonataMediaBundle:Gallery'
            ))
        ->end()
    ;
}

我已经覆盖了编辑模板:

{% extends 'SonataAdminBundle:CRUD:edit.html.twig' %}

{% block javascripts %}
    {{ parent() }}
    <script type="text/javascript">
        $(document).ready(function () {
            $(".module_type").change(function() {

            });

        });
    </script>

{% endblock %}

正如你所看到的,画廊现在是硬编码的..

我现在不知道该怎么做...怎么说如果选择的值是这个,则在字段中使用该实体...问题是在 Sonata 中渲染表单的方式非常复杂...我不知道明白它..

也许我应该使用ajax?但是,当我发送一个值并获得响应时,如何在不刷新的情况下添加字段?

任何帮助表示赞赏。


在不断研究找到一种使用 ajax 和 sonata 与 symfony4 一起使用动态下拉菜单的方法之后,我想分享我的解决方案,它实际上是如何为我工作的。

就我而言,我有一个区,这个区有不同的城市。我有一家公司,首先选择一个地区,然后根据该地区选择城市。

我做了什么:

  1. 为各地区创建您的实体

  2. 为城市创建您的实体

  3. 进入您的主类(在我的例子中,这是公司实体,并为地区和城市添加两个实体

    /**
     * @ORM\ManyToOne(targetEntity="App\Wdm\MainBundle\Entity\Model\Cities",   inversedBy="id")
     */
    private $city;

    /**
    * @ORM\ManyToOne(targetEntity="App\Wdm\MainBundle\Entity\Model\Districts", inversedBy="id")
    */
     private $district;

  1. 更新数据库架构并使用一些示例数据填充城市和地区字段

  2. 进入 configureFormFields 函数中的 AdminClass 并添加以下内容(确保将“choice_label”选项与您所在地区或城市实体中的相应字段正确使用。

    protected function configureFormFields(FormMapper $formMapper)
    {         $formMapper
                  // Some other added fields

             ->add('district', EntityType::class, [
                 'choice_label' => 'name',
                 'class'       => Districts::class,
                 'placeholder' => '',
             ])

             ->add('city', EntityType::class, [
                 'choice_label' => 'name',
                 'class'       => Cities::class,
                 'placeholder' => '',
             ])       

             ;
  1. 这应该已经很好用了。您现在应该能够拥有一个依赖字段。现在让我们来看看 AJAX 的魔力。

  2. 进入您的 AdminClass(与 configureFields-Class 相同)并添加以下内容

 protected function configureRoutes(RouteCollection $collection)
    {    $collection->add('reloadCities', 'reload-cities');

    }
  1. 现在您有了可以从 ajax url 访问的路线。现在创建一个新的控制器类,无论您想要在哪里...
<?php

namespace App\Wdm\MainBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Sonata\AdminBundle\Controller\CRUDController as BaseController;
use App\Wdm\MainBundle\Entity\Model\Cities;


class CitiesController extends BaseController
{
    public function reloadCitiesAction(Request $request)
    {   $districtid = $request->request->get('id');
        $cities = $this->getDoctrine()->getRepository(Cities::class)->findBy(array("district" => $districtid));
        return $this->render("company/cities.html.twig", array("cities" => $cities));
    }
}

...并且不要忘记在您的 services.yaml 中注册此控制器...

  admin.company:
        class: App\Wdm\MainBundle\Admin\CompanyAdmin
        arguments:
            - ~
            - App\Wdm\MainBundle\Entity\Model\Company
            - App\Wdm\MainBundle\Controller\CitiesController (THIS IS THE NEW ROW)

...最后是这个函数中调用的小模板...

// THIS IS THE cities.html.twig

{% for city in cities %}
<option value="{{ city.id }}">{{ city.name }}</option>
{% endfor %}
  1. 到目前为止,一切都很好。我们现在得到了从 ajax 调用获取数据并将其返回到您的奏鸣曲管理编辑表单的逻辑。现在唯一缺少的是sonata admin 编辑模板中所需的jquery 代码。

进入您的 AdminClass 并插入以下代码(例如在 configureFormFields 之前)

 public function getTemplate($name)
    {
        switch ($name) {
            case 'edit':
                return 'company/cities_admin.html.twig';
                break;
            default:
                return parent::getTemplate($name);
                break;
        }
    }

现在我们创建这个 city_admin.html.twig 模板来覆盖默认模板

{% extends 'SonataAdminBundle:CRUD:edit.html.twig' %}

{% block form %}
    {{ parent() }}
<script type="text/javascript">

    $(document).ready(function () {
        $("#ID_OF_YOUR_DISTRICT_SELECT_FIELD").change(function () {
            $.ajax({
                url: "{{ admin.generateUrl('reloadCities') }}",
                data: {
                    'id': $(this).val(),
                    'uniquid': '{{ admin.uniqid }}'
                },
                method: 'POST',
                success: function (html) {
                    $("#ID_OF_YOUR_CITY_SELECT_FIELD").html(html);
                },
                error: function (data) {
                    // more code
                }
            });
        });
    });
</script>

{% endblock %}

就是这样。应该像魅力一样发挥作用。

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

Symfony2 Sonata 管理员根据所选值动态更改输入数据 的相关文章

  • 如何在 Windows 上以纯 PHP 形式提取 .tar 文件?

    我有一个 PHP 脚本 我想在 Windows 上运行 我需要提取 tar 文件 如何提取 tar 文件 我知道 PharData 类 它可以在 Linux 上运行 但不能在 Windows 上运行 我的脚本就死了 没有错误输出或任何东西
  • jQuery Calendar:如何在特定日期添加可点击事件?

    我正在使用 jquery 完整日历http arshaw com fullcalendar http arshaw com fullcalendar显示会议 我只是想确认是否可以添加活动 让我们创建一个新会议 使用 php ajax 在特定
  • PHP 中的延迟加载类方法

    我有一堂课 里面有一些相当大的方法 在它的基本和最常见的状态下 大多数功能并不是必需的 所以我想知道是否有一种方法可以延迟加载类的一部分 这些方法需要能够访问私有 受保护的成员 因此如果这些方法是类的本机方法 那将是理想的选择 但是在寻找其
  • jQuery 拖动并跟随鼠标

    我正在尝试创建一个两列的可滑动区域 中间有一个拖动栏 请参阅这个小提琴 http jsfiddle net W7tGj 2 http jsfiddle net W7tGj 2 我试图避免将 jQ UI 添加到其中 因此任何帮助将不胜感激 我
  • 使用 jQuery 禁用 CSS 继承

    有没有办法使用 jQuery 或通用 javascript 在块级别禁用 CSS 继承 例如 如果我通过 javascript 拉入外部资源 例如 Pastie org 它们将拥有自己的 CSS 而我的 CSS 会覆盖它们 我想将嵌入代码放
  • javascript 可以从父页面访问 iframe 元素吗?

    我的页面上有 iframe iframe 和父页面位于不同的域中 父页面上的 javascript 代码可以访问此 iframe 内的元素吗 如果页面来自不同的域 则不应该这样做 浏览器安全沙箱应该阻止这种类型的访问 当两个页面来自不同的时
  • 计算两列中两个总和的平均值,并将其显示在 JQGrid 的下一列中

    I m using Jqgrid with summery row at grouping level Now I want to know one thing that Is it possible to show average cal
  • 将我的 JSON 字符串格式化为 PHP 中的
      有序列表

    我正在为一个宠物项目开发一个简单的 CMS 我目前有一个 JSON 字符串 其中包含菜单结构的页面 ID 和父页面 ID 的列表 我现在想将此字符串转换为嵌套或分层列表 有序列表 我尝试过循环查找 但似乎最终得到了过于复杂的子类范围 我正在
  • jQuery:append() 与appendTo()

    我正在测试 jQuery append vs appendTo 使用以下代码的方法 div gt id id text this text appendTo div type item id div type item id append
  • 如何捕获jquery中的任何点击事件[重复]

    这个问题在这里已经有答案了 我有一个按钮 当单击它时 会显示一个带有图像的 div 例如聊天的表情符号面板 如果我再次单击它 div 会隐藏 但我想要做的是 如果 div 已经显示 然后我单击页面的任何其他内容 我想隐藏它 我试过这个 my
  • 在 foreach 循环中使用 next

    我正在使用 foreach 循环数组 在特定情况下 我需要在迭代到达下一个元素 如预测 之前知道下一个元素的值 为此 我计划使用该功能next http www php net manual en function next php 在文档
  • file_get_contents:即使出现错误也能获得完整响应

    是否有可能使file get contents即使发生错误也显示实际响应 否则很难调试 例如 假设您有以下代码 url https api twitter com oauth request token data array options
  • Outlook 2007 接收 html 邮件作为带有标头的源,其他 MUA 工作正常。为什么?

    我有几个简单的表单 可以发送纯 html 电子邮件 大多数客户端 Gmail Lotus Notes 8 hotmail live windows live mail outlookexpress 都能正常接收电子邮件 但 Outlook
  • 在 Woocommerce 结帐页面上移动亚马逊按钮

    我需要移动 Woocommerce 结账页面上的 Amazon Pay 消息 按钮 我们正在使用Woocommerce 的亚马逊支付 https woocommerce com products pay with amazon 当我查看插件
  • 多个引导模式的滚动问题

    我有一个带有大量信息的模态页面 因此您需要滚动 该模式包含指向第二个模式的链接 When I 打开模态 1 单击链接打开模式 2 模式 1 保持在后台 然后关闭模式 2 以便我回到模式 1 modal 1 失去滚动 仍然有一个滚动条 但它不
  • cURL 错误 28:5001 毫秒后解析超时

    我使用 WordPress 最近将我的网站从 cpanel 主机移动到带有 directadmin 面板的 Linux 服务器 转账后立即发现客户在通过EDD插件下载时出现以下错误 cURL 错误 28 5001 毫秒后解析超时 我也遇到了
  • chrome中使用jquery的图像高度问题

    img height 回报0在 Chrome 中 但在 IE 和 Firefox 中返回实际高度 在 Chrome 中获取图像高度的实际方法是什么 正如 Josh 提到的 如果图像尚未完全加载 jQuery 将不知道尺寸是多少 尝试这样的操
  • Laravel 5 中的两个登录表单

    我一直想知道如何在 laravel 5 中制作两个登录表单一段时间 原因是因为我有一个多站点项目 我在一个项目中拥有管理站点和公共站点 我对路由进行了分组 以便管理路由回答一个域 公共路由回答另一个域 如下所示 Route group ar
  • 如何使用 jQuery 解析 JavaScript 对象

    jQuery JavaScript 中用于解析 JSON 对象并返回键 值对的 foreach 等效项是什么 JSON 对象 是什么意思 JSON 是一种用于序列化对象的文本格式 如果要循环访问通过反序列化 JSON 字符串获得的对象中的属
  • simplexml,返回具有相同标签的多个项目

    我将以下 XML 文件加载到 php simplexml 中

随机推荐

  • Angular UI Router - 如何在切换视图时保留视图

    我是 Angular 和 UI Router 的新手 Plunk http plnkr co edit 1wfyrGryfGG5RtXozPFY p preview Setup我有三个顶级应用程序导航按钮 主页 项目 帮助 他们使用 Ang
  • R.java 文件未创建

    我的 Android 应用程序中有 R java 文件 但我不知道 它是如何删除的 要再次创建它 我清理我的项目 并通过单击 构建项目 重建我的项目 我不知道是什么问题 它不会再次被创建 一般来说 每当我构建项目时它都会自动创建 如果您在更
  • firebase获取每个子项的子项的数据

    大家好 我是 firebase 的超级新手 我需要一些帮助 首先 我正在做的是一份清单 例如 刻度表包含一个项目列表 其中包含刻度日志 因此我设计的数据如下 清单 ticksheets JbN5ol2jGRtAOZ9ovrO auto ge
  • noscript 标签,如果未启用,我需要提供替代 html

    如果用户浏览器上未启用 JavaScript 是否可以用 HTML 替换 javascript 我知道我可以使用
  • 当以 C++03 为目标时,使用 std::basic_string 作为连续缓冲区是否合理?

    我知道在 C 03 中 从技术上讲std basic string模板不需要有连续的内存 然而 我很好奇现代编译器有多少实现实际上利用了这种自由 例如 如果有人想使用basic string要接收某些 C API 的结果 如下面的示例 分配
  • 是否可以从具有超时的输入流中读取?

    具体来说 问题是编写一个这样的方法 int maybeRead InputStream in long timeout 如果数据在 超时 毫秒内可用 则返回值与 in read 相同 否则返回 2 在该方法返回之前 任何生成的线程都必须退出
  • 您如何简单地解释类型转发?

    我正在准备 MCTS 70 536 阅读后this文章 我不确定我是否理解类型转发的概念 我发现文章中给出的步骤更加令人困惑 如果我复制要转发的类型的源代码并重新编译它 该怎么办 旧的 dll 和客户端会发生什么 类型转发允许您在程序集之间
  • 如何在Python中将日转换为年和月?

    如何在Python中将日转换为年 月和日 例如 如果某人已经 5 538 天了 我怎样才能通过这样的年月日来显示这一点 15岁2个月又1天 这是为了获取用户的输入 print Please enter your birthday bd ye
  • UICollectionView - 水平排列单元格

    所以基本上我的问题是我的集合视图单元格是从上到下排序的 而不是从左到右排序的 This is what it looks like 1 4 7 2 5 8 3 6 9 This is what i want 1 2 3 4 5 6 7 8
  • 需要在角度2中插入Script标签

    我已经做了一些阅读和搜索 几乎所有我发现的内容都表明脚本标签不能包含在 Angular 2 的模板中 我们会像您一样有意从模板中删除标签 不应该使用它们来按需加载代码 https github com angular angular iss
  • 特定元素是否存在事件

    是否有任何事件可以知道原始 javascript 中特定元素何时 开始存在 例如我有 div class parent div class child div div 我想在 parent 和只有 parent 不是 child 开始存在
  • 更快地绘制实时音频信号

    我有一段代码 它从笔记本电脑的音频插孔获取实时音频信号 并在进行一些基本过滤后绘制其图表 我面临的问题是 随着程序的运行 实时绘图变得越来越慢 有什么建议可以让绘图更快并以恒定的速度进行吗 我认为动画功能会使其更快 但无法根据我的要求制定
  • git diff 用于任何存储库之外的自定义 2 个文件?

    I need git diff我在任何存储库之外拥有的 2 个文件的功能 有办法做到吗 就像是git diff file1 path file1 txt file2 path file2 txt如果没有 替代解决方案是什么 答案就在the
  • 强制请求使用 IPv4 / IPv6

    如何强制requests库使用特定的互联网协议版本来获取请求 或者可以用Python中的另一种方法更好地实现这一点吗 我可以 但我不想使用curl 阐明目的的示例 import requests r requests get https m
  • 在 Woocommerce 3 中使用 WC_Cart add_to_cart() 方法存储自定义数据

    我正在创建一个会员网站 并为每个会员计划完全创建静态页面 只有 3 个计划 但是 我为每个计划添加了产品 当我点击 选择计划 按钮时 我会重定向到一些自定义表单 在其中询问用户我们将用于实现计划的信息范围 与sneakertub com相同
  • 如何使用 CGContext 获取像素的 RGB 值?

    我正在尝试通过更改像素来编辑图像 我有以下代码 let imageRect CGRectMake 0 0 self image image size width self image image size height UIGraphics
  • 出现编译错误时eclipse如何执行java代码

    当下面的java代码在eclipse中执行时 它给出了正确的输出 即打印 Class B 但根据java规范 代码无法编译 因为超类构造函数需要一个int编译器为类 B 提供的参数和构造函数包括对超类 无参数构造函数 的调用 该构造函数未定
  • JavaScript ES6 Promise for 循环

    for let i 0 i lt 10 i const promise new Promise resolve reject gt const timeout Math random 1000 setTimeout gt console l
  • 有没有办法将 pmml 文件导入到 python 中?

    我使用 sklearn 训练了一个模型 并使用 sklearn2pmml 将其导出为 pmml 格式 有没有办法将该 pmml 文件转换回可以在 python 中导入和运行的文件 我之所以这样做 是因为我注意到 pmml 模型与 sklea
  • Symfony2 Sonata 管理员根据所选值动态更改输入数据

    对于我的一个对象 我需要创建一些动态表单渲染 但我不知道如何在 Sonata Admin 中执行此操作 例如 当我创建一个对象时 我有一个字段类型 在此字段中 我选择我的对象的类型 现在 当我选择类型时 我想根据类型显示一个字段 例如 如果