将自定义选项传递给 symfony2 表单

2024-01-27

在 symfony 1.4 中,可以通过表单的选项参数化表单类定义。有什么方法可以将自定义选项传递给我的自定义表单类型???我尝试使用的选项参数buildForm方法,但我不太确定这个数组是什么,显然它不是我想要的......谢谢!


解决方案很简单,如果您希望自定义选项在 Twig 模板中也可用,则必须使用$builder->setAttribute() in buildForm方法 和$view->set()中的方法buildView()方法也。

<?php

namespace Acme\DemoBundle\Form\Type;

use Symfony\Component\Form\AbstractType as FormAbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;

// For Symfony 2.1 and higher:
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

/**
 * ImagePreviewType
 *
 */
class ImagePreviewType extends FormAbstractType
{

    /**
     * {@inheritDoc}
     * For Symfony 2.0
     */
    //public function getDefaultOptions(array $options)
    //{
    //    $options = parent::getDefaultOptions($options);
    //    $options['base_path'] = 'path/to/default/dir/';
    //
    //    return $options;
    //}

    /**
     * {@inheritDoc}
     * For Symfony 2.1 and higher
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'base_path'         => '',
        ));
    }

    /**
     * {@inheritDoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        // For Symfony 2.0:
        // $view->set('base_path', $form->getAttribute('base_path'));

        // For Symfony 2.1 and higher:
        $view->vars['base_path'] = $options['base_path'];
    }

    /**
     * {@inheritDoc}
     */
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->setAttribute('base_path', $options['base_path'])
        ;
    }

    /**
     * {@inheritDoc}
     */
    public function getName()
    {
        return 'image_preview';
    }

    public function getParent(array $options)
    {
        // for Symfony 2.0:
        // return 'field';

        // for Symfony 2.1 and higher:
        return 'form';
    }
}

自定义表单类型的模板(文件...Acme/DemoBundle/Resources/views/Form/fields.html.twig):

{% block image_preview_widget %}
{% spaceless %}
<img src="{{ base_path ~ value }}" alt=""  {{ block('widget_container_attributes') }} />
{% endspaceless %}
{% endblock %}

在 app/config/config.yml 中注册自定义表单类型的模板

twig:
    debug:            %kernel.debug%
    strict_variables: %kernel.debug%
    form:
        resources:
            - 'AcmeDemoAdminBundle:Form:fields.html.twig'

用法:在编辑用户个人资料时显示用户图像的预览:

// src/Acme/DemoBundle/Form/Type/UserType.php
namespace Acme\DemoBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class UserType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('user_profile_image_file_name', new ImagePreviewType(), array(
            'base_path' => 'some/other/dir',
        ));
    }
}

2014-08-18:更新为 Symfony 2.1 或更高版本

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

将自定义选项传递给 symfony2 表单 的相关文章

随机推荐

  • 在两个js文件之间共享全局变量

    我正在使用两个 js 文件并在钛应用程序中在它们之间共享变量 在我的主 app js 中 我有 3 个与表中每一行关联的变量 我有一个事件侦听器 用于单击一行打开模态视图 该视图的组件位于单独的 js 文件中 我的三个变量如下 在单击事件中
  • 检索 id 1 的 Avro 模式时出错,未找到主题。;错误代码:40401

    Caused by org apache kafka common errors SerializationException Error retrieving Avro schema for id 1 Caused by io confl
  • 没有 STB_GNU_UNIQUE 的静态链接 stdc++ 在 dlclose 时导致内存泄漏

    我必须制作一个 dso 静态链接 stdc 并且需要可以从内存动态卸载 所以我尝试编译 gcc disable gnu unique object并使用黄金链接 Wl no gnu unique选项 但两者都包含内存泄漏问题 即使我除了调用
  • Android中的MVC架构[重复]

    这个问题在这里已经有答案了 可能的重复 Android 中的 MVC 模式 https stackoverflow com questions 2925054 mvc pattern in android 我想关注MVC架构 in Andr
  • 为什么要使用双重检查锁定?

    我继续运行使用双重检查锁定的代码 但我仍然对为什么使用它感到困惑 我一开始并不知道双重检查锁定被破坏 http www cs umd edu pugh java memoryModel DoubleCheckedLocking html 当
  • 如何增加 ASP.NET Core 2.0 API 的 Azure 应用服务超时

    我有一个 ASP NET Core 2 0 API 正在部署到 Azure 应用服务 这一直工作得很好 直到最近我不得不处理一个需要超过 2 分钟才能完成的请求 并且我得到了 502 Bad Gateway 说明 The specified
  • 如何使用 LINQ 组合 2 个列表?

    环境 NET4 C Hi All 我想合并这两个列表 A B C D and 1 2 3 进入这个 A1 A2 A3 B1 B2 B3 C1 C2 C3 D1 D2 D3 显然 我可以使用嵌套循环 但我想知道 LINQ 是否可以提供帮助 据
  • 在 MySQL 中选择表名作为 UNION select 查询中的列

    我希望能够选择行所在的表的名称作为联合选择查询中的列 像这样的东西 SELECT TABLENAME text from table1 UNION SELECT TABLENAME text from table2 ORDER BY dat
  • 评估 CSS 选择器 LTR 或 RTL 是否更容易/更快?

    给定一个 CSS 选择器 例如 ul gt li a 从左到右或从右到左评估它会更容易 更快吗 我意识到 简单 和 更快 的答案可能不同 我想要两者的答案 我即将踏上其中一条道路 但我不想走到一半 然后意识到我选择了错误的道路 LTR 遍历
  • 事务存储过程 C#

    我有一个小问题 请指导我 我正在使用 C 控制台应用程序 进行编码 我在代码中调用了 2 个不同的存储过程 基本上这两个存储过程都访问同一个表 第一个 SP 有一个选择查询和一个更新查询 第二个 SP 有一个更新查询 现在我想以事务模式调用
  • JOOQ:在公共接口中对来自不同表的列进行逻辑分组

    我们有一个表设计 其中许多表共享一些列 例如在一种情况下 我们的一些表具有该列markedForDeletion 在另一种情况下 我们的多个表都有列approvedAt and approvedBy 这些表在连接数据方面不共享任何内容 因此
  • 从 .NET 中的 Authenticode 签名文件获取时间戳

    我们需要验证二进制文件是否已使用数字签名 Authenticode 正确签名 使用signtool exe 可以很容易地实现这一点 但是 我们需要一种自动方式来验证签名者姓名和时间戳 这在本机 C 中是可行的CryptQueryObject
  • 如何在Python函数中使用全局变量? [复制]

    这个问题在这里已经有答案了 如何在 python 函数中设置全局变量 To use global函数内的变量 你需要做global
  • 为 Tegra GPU 编程需要什么

    我可以在 CUDA 处理器 Tegra 1 2 上开发应用程序吗 为此我需要什么以及 Tegra 1 2 CUDA 功能是什么 我在Eclipse for Android中发现只有NVIDIA Debug Manager用于开发 但不知道他
  • 如何在eclipse中添加java代码的快捷键

    假设我输入 sout 智能感知应将其扩展为 System out println 有没有办法添加这样的模板 该功能在 Eclipse 中称为 代码模板 您可以使用以下方式添加模板 窗口 gt 首选项 gt Java gt 编辑器 gt 模板
  • 将 LEFT OUTER JOIN 查询转换为 Django orm queryset/query

    给定 PostgreSQL 9 2 10 Django 1 8 python 2 7 5 和以下模型 class restProdAPI models Model rest id models PositiveIntegerField pr
  • 正则表达式仅允许 1 到 12 之间的数字

    正则表达式仅允许 1 到 12 之间的数字 我在尝试 12 1 9 d 但它不起作用 请帮助 因为我是正则表达式的新手 就像是 1 9 1 012 将正则表达式锚定在字符串的开头 1 9 火柴1 to 9 交替 匹配上一个匹配或下一个匹配
  • 比较时间值

    我想要一个比较时间的方法 例如 如果 Atime 发生早于 Btime 做某事 我会使用 CompareTime 函数 但我对该函数的问题是 粗括号 中所说的内容 见下文 调用CompareTime比较A和B指定的两个TDateTime值
  • 为什么单层感知器在没有归一化的情况下收敛得这么慢,即使裕量很大?

    在我确认我的结果后 这个问题完全被重写了 Python Notebook可以找到here https www dropbox com s pwvfx9hbxzkym5r perceptron py dl 0 用别人写的一段代码 可以找到he
  • 将自定义选项传递给 symfony2 表单

    在 symfony 1 4 中 可以通过表单的选项参数化表单类定义 有什么方法可以将自定义选项传递给我的自定义表单类型 我尝试使用的选项参数buildForm方法 但我不太确定这个数组是什么 显然它不是我想要的 谢谢 解决方案很简单 如果您