如何将JS代码添加到实体表单?

Posted

技术标签:

【中文标题】如何将JS代码添加到实体表单?【英文标题】:How to add JS code to entity form? 【发布时间】:2012-04-25 21:58:47 【问题描述】:

我有一个实体。当实体在弹出窗口中加载时,我需要执行一些 JS 代码。 有没有办法通过管理类配置将自定义 JS/html 代码添加到实体表单。例如。将模板作为选项传递

【问题讨论】:

【参考方案1】:

你可以这样做:-

    像这样在你的 FormMapper 中添加一个类参数:-

    受保护的函数 configureFormFields(FormMapper $formMapper) $formMapper ->add('description', null, array('attr' => array('class' => 'for_popup'), 'required' => false))

    从 Sonata CRUD 模板扩展 edit.html.twig / base_edit.html.twig

---edit.html.twig----

% extends 'YourBundle:YourAdminClass:base_edit.html.twig' %

---base_edit.html.twig---

% block javascripts %
     parent() 
    <script type="text/javascript">
        // Your JS code here
    </script>
% endblock %

使用您的edit.html.twig 代替 Sonata CRUD,方法是在 getEditTemplate 函数中定义它(在您的 Admin 类中)。

public function getEditTemplate() 

    return 'YourAdminBundle:ControllerName:edit.html.twig'; 

您还可以在注入管理服务时设置自定义编辑模板。

<service id="sonata.admin.bf" class="Wyzbiz\Bundle\MainBundle\Admin\BfAdmin">
    <tag name="sonata.admin" manager_type="orm" group="Content" label="BFs"/>
    <argument />
    <argument>Wyzbiz\Bundle\MainBundle\Entity\Bf</argument>
    <argument>WyzbizMainBundle:CRUD</argument>
    <call method="setTranslationDomain"><argument>WyzbizMainBundle</argument></call>
    <call method="setTemplate"><argument>list</argument>                       
    <argument>WyzbizMainBundle:CRUD/Bf:list.html.twig</argument></call>
</service>

【讨论】:

base_edit 应该扩展奏鸣曲 crud 模板吗?我应该在这个模板中指定扩展标签,或者我可以把这个模板放在与奏鸣曲包中相同的路径?感谢您的帮助 在奏鸣曲中不要碰任何东西。只需将奏鸣曲的 base_edit.html.twig 复制到 YourBundle/Resources/YourController/ 文件夹中。我将更新答案以解释如何。 Sonata 显然已经用 getTemplate('edit') 替换了 getEditTemplate() 函数,这使得这变得更加困难。我最终做的是: $this->setTemplate('edit', 'MyBundle:Admin:edit_user.html.twig');在我管理员的 configureFormFields() 中 此外,您的 edit.html.twig 文件可以扩展奏鸣曲管理员的 CRUD edit.html.twig 并且可以包含 javascript 块(换句话说,您不需要创建自己的 base_edit 版本.html.twig 并扩展,直接扩展 Sonata admin 的 edit.html.twig 即可)【参考方案2】:

@Jessica 您可以添加自己的 getTemplate 方法实现,而不是在管理类的 configureFormFields 方法中使用 $this->setTemplate(),我的方法如下所示:

/**
 * Override core method to display custom template(s)
 */
public function getTemplate($name)

    switch ($name) 
        case 'edit':
            return 'YourAdminBundle:YourAdminEntity:edit.html.twig';
            break;
        default:
            return parent::getTemplate($name);
            break;
    

【讨论】:

以上是关于如何将JS代码添加到实体表单?的主要内容,如果未能解决你的问题,请参考以下文章

将表单名称发送到 JS/jQuery 和序列化

如何将已通过 JS 上传的图像添加到要从其上传的表单中?

如何动态添加带有引导表单元素的 div?

如何将 csrf 令牌添加到 html 表单?

如何使用表单中的数据来创建带有js的表?

表单同时提交多条记录的技术实现