如何在 Sonata 管理表单中使用 Ajax?

2024-01-08

我有一个具有以下字段和关联的商家实体:-

/**
 * @ORM\ManyToMany(targetEntity="Category", inversedBy="merchants")
 */
public $categories;

/**
 * @ORM\ManyToMany(targetEntity="Tag", inversedBy="merchants")
 */
public $tags;

/**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="merchants")
 */
protected $primaryCategory;

/**
 * @ORM\ManyToOne(targetEntity="Tag", inversedBy="merchants")
 */
protected $primaryTag;

标签和类别也有一个多对多映射。 所以我们有Tag_Category、Merchant_Tag、Merchant_Category映射表。

现在我想在这些字段上执行一些ajax。

我想允许用户首先选择主标签。在Primary Tag的基础上,ajax将类别刷新为仅属于该Tag的类别以及更多操作。

我怎样才能实现这个目标?

Thanks!


几个月前我就能够完成这项工作。虽然 a.aitboudad 分享的内容是准确的。初次使用 Symfony/Sonata 的人可能会遇到一些问题。

以下是步骤。

1> 扩展Sonata CRUDedit.html.twig / base_edit.html.twig .为简单起见,我将仅使用后者。 复制vendor/bundles/Sonata/AdminBundle/Resources/views/CRUD/base_edit.html.twig进入与 Merchant AdminController 对应的视图文件夹 -YourBundle/Resources/views/Merchant/base_edit.html.twig

2> 我们需要告诉我们的 MerchantAdmin 类使用这个模板。所以我们重写 SonataAdmin 的getEditTemplate像这样的方法:

public function getEditTemplate()
{
    return 'YourBundle:Merchant:base_edit.html.twig';
}

3>接下来我们需要编写 Ajax 功能代码 in our base_edit.html.twig。标准 Ajax 包含以下内容:

3.1>-- 在控制器中为 Ajax 请求创建一个 Action 我们主要想要获取与特定标签对应的类别 ID 列表。但很可能您只是使用 Sonata 的 CRUD 控制器。

定义扩展 CRUDController 的 MerchantAdminController

<?php

namespace GD\AdminBundle\Controller;

use Sonata\AdminBundle\Controller\CRUDController as Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use GD\AdminBundle\Entity\Merchant;

class MerchantAdminController extends Controller
{

}

3.2>-- 通过在中定义它来告诉您的管理服务使用这个新创建的控制器而不是默认的 CRUDControllerYourBundle/Resources/config/services.yml

gd_admin.merchant:
        class: %gd_admin.merchant.class%
        tags:
            - { name: sonata.admin, manager_type: orm, group: gd_merchant, label: Merchants }
        arguments: [null, GD\AdminBundle\Entity\Merchant, GDAdminBundle:MerchantAdmin]

请注意,第三个参数是控制器的名称。默认情况下它将为空。

3.3>-- 创建一个名为getCategoryOptionsFromTagAction在你的控制器中。您的 Ajax 调用将针对此 Action。

// route - get_categories_from_tag
public function getCategoryOptionsFromTagAction($tagId)
    {   
        $html = ""; // HTML as response
        $tag = $this->getDoctrine()
            ->getRepository('YourBundle:Tag')
            ->find($tagId);

        $categories = $tag->getCategories();

        foreach($categories as $cat){
            $html .= '<option value="'.$cat->getId().'" >'.$cat->getName().'</option>';
        }

        return new Response($html, 200);
    }

3.4>-- 创建对应的路由app/config/routing.yml。如果您使用 FOSJsRoutingBundle,请记住公开您的路线(否则您将不得不进行硬编码,这不是一个好主意)。

get_categories_from_tag:
    pattern: /{_locale}/admin/gd/admin/merchant/get-categories-from-tag/{tagId}
    defaults: {_controller: GDAdminBundle:MerchantAdmin:getCategoryOptionsFromTag}
    options:
        expose: true

3.5>-- 发出 Ajax 请求并使用响应

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

        $(document).ready(function(){
            var primaryTag = $("#{{ admin.uniqId }}_primaryTag");
            primaryTag.change(updateCategories()); // Bind the function to updateCategories
            primaryTag.change(); // Manual trigger to update categories in Document load.

            function updateCategories(){
                return function () {
                    var tagId = $("#{{ admin.uniqId }}_primaryTag option:selected").val();
                    var primaryCategory = $("#{{ admin.uniqId }}_primaryCategory");
                    primaryCategory.empty();
                    primaryCategory.trigger("liszt:updated");
                    var locale = '{{ app.request.get('_locale') }}';

                    var objectId = '{{ admin.id(object) }}'

                    var url = Routing.generate('get_categories_from_tag', { '_locale': locale, 'tagId': tagId, _sonata_admin: 'gd_admin.merchant', id: objectId });
                    $.post(url, { tagId: tagId }, function(data){
                        primaryCategory.empty().append(data);
                        primaryCategory.trigger("liszt:updated");
                    },"text");

                    primaryCategory.val("option:first").attr("selected", true);
                };
            }
        });
    </script>
{% endblock %}

陷阱 1:

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

如何在 Sonata 管理表单中使用 Ajax? 的相关文章

  • Rails:通过 Ajax 传递参数

    我需要通过 javascript 将参数传递回服务器 目前 我将它们传递给 JavaScript 如下所示 sendParams 然后像这样将它们发回 function sendParams q ajax url mymodel myact
  • 从 json 数组中获取成对的值

    首先 这是我从 php 源获取的 json 值 oid 2 cid 107 oid 4 cid 98 oid 4 cid 99 之后 我想要得到并且oid值以及相应的cid值例如 oid 2 and cid 107一口气 oid 4 and
  • FOSUserBundle 强制用户写入不同的密码

    我有一个使用 FOSUSerBundle 在 Symfony2 0 上运行的应用程序 连接该应用程序的用户每 3 个月必须更改一次密码 密码已就位且正在运行 今天 如果用户每 3 个月写入与前一个密码相同的新密码 则无需验证 他还可以使用该
  • symfony2.3中'url'和'path'有什么区别

    文件说 src Acme ArticleBundle Resources views Article recentList html twig for article in articles a href article title a e
  • 如何使用Ext.Ajax登录Spring Security?

    我正在使用 Extjs 6 和 Spring 4 开发一个应用程序 我的应用程序是 Restful 我启用 CORS Origin 如下所示 public class CorsFilter extends OncePerRequestFil
  • 将对象传递给jquery中的回调函数

    我最近正在开发小型聊天模块 该模块需要不断检查服务器是否有新消息 我正在向服务器发送 ajax 请求 服务器将保持连接 直到找到新消息 长轮询 Code var chatController function other variable
  • Symfony2 - 使用 eventListener 修改表单字段

    我想寻求帮助 我有一个带有下拉列表的表单 我需要根据外部输入修改选择 我想它应该与 eventListener 配合得很好 builder gt addEventListener FormEvents PRE SET DATA functi
  • Symfony2/Memcached 集成

    我正在关注一篇博客文章 链接不再可用 并将 memcached 添加到 services yml parameters memcached servers host 127 0 0 1 port 11211 services memcach
  • 用 Ajax 响应替换 div 的内部 HTML

    我试图在一段时间后更改 div 的内部 HTML 我得到了我想要的 Ajax 正确响应 但无法用 Ajax 响应替换所选内容的内部 HTML 我的代码有什么问题 Html p class time ui li desc 51 seconds
  • onchange 下拉列表

    我的问题是我所问问题的延续 请参阅链接 加载国家 州 城市 https stackoverflow com questions 2640001 load country state city 我已经展开以从数据库加载我的下拉列表 我只需要一
  • Alfresco 更新文件 - 错误帖子

    我正在尝试更新 Alfresco 中的文件 我编写了以下代码 var csrf header Alfresco util CSRFPolicy getHeader var csrf token Alfresco util CSRFPolic
  • 通过单击按钮更改 PHP include ("link.php")

    如何通过单击按钮更改 PHP include link html BUTTON 1 change to BUTTON 2 change to BUTTON 3 change to 如何在不刷新页面的情况下执行此操作 使用ajax Wrap
  • 保护基于prototype.js的XHR请求免受CSRF攻击

    Django 已经更新到 1 3 事实上从 1 2 5 开始 它就扩展了该方案 将跨站请求伪造保护令牌传递给 XMLHttpRequests Django 人员提供了帮助jQuery 的一个例子 http docs djangoprojec
  • 如何使用 file:///F:/foldername 访问 ajax 中的本地文件夹?但它适用于 http://

    在这里 我使用以下代码使用 AJAX jQuery 动态创建文件名列表 window load function var fileExt csv document ready function ajax url file F foldern
  • 使用 JSONP 时出现“无效标签”?

    我的 JSONP 请求有问题 数据不会显示 Firebug 显示 无效标签 错误 我的 JavaScript ajax url link dataType jsonp beforeSend function xhr var base64 b
  • Symfony2 无效形式且无错误

    我的 Symfony2 生成的 CRUD 表单有问题 与MongoDB文档 但我不认为这是相关的 在我的控制器的 createAction 方法中 当我调试表单结果时 form gt isValid returns false form g
  • 如何使用 .net 2.0 中的 WebBrowser 控件检查 ajax 更新?

    我有一个网页正在使用 WebBrowser 控件在 winform 应用程序中显示 我需要在网页中的 HTML 发生变化时执行一个事件 但是 我找不到通过 Ajax 更新页面时触发的事件 DocumentComplete FileDownl
  • 从 HTML 字符串中解析和选择

    使用 ajax 调用 我返回了页面的partialView HTML 但在显示它之前 我希望从主 div 中提取信息 如果我创建一个浮动窗口 该数据只是大小信息 Code div class window details more data
  • Symfony/Form:函数 DoctrineType::__construct() 的参数太少

    我有一个奇怪的错误 我在自己的系统中实现了 Form 组件 我在那里创建了一个 FormType 其中使用 EntityType 作为字段 每次我想用 formBuilder 创建表单时 它都会抛出以下错误 Fatal error Unca
  • Monolog:通过邮件发送错误日志会导致每个发送的错误都会收到一封额外的邮件

    对于通过邮件发送的每个错误日志 我们都会收到另一封额外的电子邮件 其中包含 2 行 smtp 调试日志消息 新创建的 symfony 演示 symfony new demo 配置独白以通过邮件发送错误消息 如docs https symfo

随机推荐

  • 使用 str[i]-'0' (其中 str 是字符串)的目的是什么?

    我正在寻求解决我自己解决的问题 我遇到的许多解决方案都使用 str i 0 的这种表示法来对存储有数字的字符串 str 执行计算 下面的代码比较两个这样的字符串 以计算两个字符串中具有相同索引位置的数字 并为两个字符串中出现但不具有相同索引
  • 单击时在引导模式中打开 Iframe

    我正在尝试创建一个按钮来打开包含 iframe 的模式 iframe 仅应在模式打开后加载 现在 当我单击按钮打开模式时 没有加载任何内容 并且控制台中没有给出任何错误 我正在关注我发现的旧片段here https www bootply
  • AttributeError:模块“torchtext.data”没有属性“Field”

    我想运行一个 gitproject https github com fastnlp style transformer使用 pytorch 和 torchtext 但当我运行它时 它会引发错误 File main py line 60 i
  • 找不到 gfortran 4.8 来构建包

    我正在尝试安装deldirR 中的包通过install packages deldir type source 但收到以下错误消息 这是 OSX Mavericks installing source package deldir pack
  • 基于日期的条件格式

    尝试在 Excel 中设置工作时间卡 将日期放在工作表的左侧 2011 年 1 月 1 日星期五 2011 年 1 月 2 日星期六 2011 年 1 月 3 日星期日 等等 我想将周末日期的行灰显 如下所示 2011 年 1 月 1 日星
  • 您是否可以在 XML 中声明和使用变量而不使用 XSL 来转换/解析 XML

    假设您想要在应用程序中读取一个 XML 元素 但是您有多个环境 其中依赖文件的路径可能会发生变化
  • Python _winreg 的问题

    我正在尝试访问 Windows 注册表 在 Python 中 以使用以下命令查询键值 winreg我无法让它工作 以下行返回一个 WindowsError 指出 系统找不到指定的文件 key winreg OpenKey winreg HK
  • Selenium - “Firefox 已经在运行”错误

    我们正在使用 selenium 运行一些测试 为此 我们有专用的 Windows XP VM 每个 VM 上都有一个 selenium RC 服务器 并且该 VM 上没有运行其他进程 我们为每个测试打开和关闭一个 Selenium 会话 测
  • FSEvents C++ 示例

    我需要为 Mac 中的文件夹创建 FSEvents 观察器 我对 C 很熟悉 有没有办法在 C 代码中而不是 Objective C 中获取 FSEvents 通知 是否有一些示例代码可以开始以及我需要包含的任何库 我已经在这个页面了 ht
  • 当应用程序是代理时,如何在 Mac OS X 中取消关闭?

    我有一个 Java 应用程序 需要从 Dock 中隐藏 并且还需要能够中断 这就是我处理关闭的方式 import com apple eawt AppEvent QuitEvent import com apple eawt QuitHan
  • 如何在 SwiftUI 中为 WKWebView 创建浏览器选项卡

    我正在尝试构建一个新的选项卡功能 但我不太确定如何实现这一点 我在设置新的或以前的 WKWebView 时遇到问题 如果 url 无效 我如何显示 errorView 这是我到目前为止所拥有的 编辑 我不太确定如何初始化或如何创建 inva
  • 为什么 Cabal 不超链接我的来源?

    cabal version cabal install version 1 22 2 0 using version 1 22 2 0 of the Cabal library cabal install haddock hyperlink
  • Android 中用于标准化电话号码的任何 API

    android 中有没有可以标准化电话号码的API 例如当我查找电话号码时 有时是2223334444有时是 2223334444 谢谢 Android 有专门的类用于此目的 android telephony PhoneNumberUti
  • 从请求范围的 CDI Bean 获取对会话范围的 CDI bean 的访问

    我已经有一个会话范围的 CDI bean 它保存当前登录的用户数据 现在 从另一个请求范围内 我想访问这个 bean 以获取一些数据 我有一些操作要做 这取决于用户登录 这是我需要的唯一信息 如何访问它 AccountBean java N
  • 如何阻止 God 留下陈旧的 Resque 工作进程?

    我试图了解如何监控 resque 工作人员特拉维斯 ci https github com travis ci travis ci以这样的方式与上帝合作 通过上帝停止 resque 手表不会留下陈旧的工作进程 下面我讨论的是工作进程 而不是
  • 使用 PHP 解码 amf3 对象

    我的闪光代码 var request new URLRequest http localhost test php request method URLRequestMethod POST var data new URLVariables
  • 如何在相机中启动视频图标

    我正在尝试通过启动一个应用程序adb在我的安卓手机中 我努力了adb getevent 但它转储了很多事件 我怎样才能知道我需要哪一个 还有其他方式可以启动该应用程序吗 我希望推出相机的视频部分 我能够通过 adb 启动相机 am star
  • 如何在 Azure Cosmos DB 中构建关系?

    我在 cosmos 的同一集合中有两组数据 一组是 帖子 另一组是 用户 它们由用户创建的帖子链接 目前我的结构如下 user document id 123 postIds id1 id2 post document id id1 own
  • fs.readFileSync() 函数无法按预期工作

    以下代码无法按预期工作 var fs require fs var PeerServer require peer PeerServer var server PeerServer port 9000 path peerjs ssl key
  • 如何在 Sonata 管理表单中使用 Ajax?

    我有一个具有以下字段和关联的商家实体 ORM ManyToMany targetEntity Category inversedBy merchants public categories ORM ManyToMany targetEnti