Symfony / Form根据数据添加属性

时间:2016-02-02 14:04:41

标签: php symfony

在我的一个自定义表单类型中,我需要向该字段添加自定义HTML属性。但该属性基于数据。所以我添加了一个事件处理程序,但我不确定我应该在其中做什么。

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
    $data = $event->getData();
    // not sure what to do here.
};

也许应该在其他地方完成。 请注意,对于我的用例,我需要最初设置为表单的数据,而不是提交的数据。

编辑:我已被要求提供有关我想要实现的更多细节。基本上我需要将数据库中的初始数据(在PRE_SET_DATA事件中可用)放入data-* HTML属性中,以便javascript可以使用它。

更新:即使在几个月后也没有好的答案,所以我认为目前无法解决这个问题。

3 个答案:

答案 0 :(得分:4)

您可以使用新的表单元素替换旧的表单元素:

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
    $data = $event->getData();
    $form = $event->getForm();
    $val = $data['some_field'];
    $options = $form->get('existing_field_name_to_replace')->getConfig()->getOptions();
    $options['attr']['your-attr'] = $val;
    $form->add('existing_field_name_to_replace', 'type', $options);
};

$form->add()替换之前定义的表单字段。但您也可以使用$form->remove(),然后使用$form->add()

答案 1 :(得分:1)

如果这是HTML属性,则只能通过编辑视图来执行此操作:

function OBJ() {
    this.data = Object.create(PROTO.data);
}
OBJ.prototype = PROTO;

new OBJ().data === new OBJ().data // false

在这种情况下,如果数据在DATA_FIELD中的值为“foo”,则将禁用<div {% if form.DATA_FIELD.vars.value == 'foo' %}disabled{% endif %}> 。 如果您的逻辑比简单的数据检查属性更复杂,则可能需要创建一个树枝扩展名。

答案 2 :(得分:0)

出于多种原因,我不会通过听众直接做某事。

  1. 调试/编写很复杂
  2. 你添加的每个监听器都会降低框架的速度
  3. 大多数情况下的过度杀伤
  4. 我能看到的最好的方法是通过控制器添加它。由于您没有提供任何用例,我会为了说明而制作一个用例。

    用例

    您有一个表单中的字段需要被禁用或启用,具体取决于它是否处理新实体或已编辑的实体。

    控制器

    public function doSomethingAction(Request $request) {
    
        // ......
    
        $edit = $this->areWeEditing(); // or whatever data youre trying to inject
    
        // options to send to the form
        $options = [
            'disable_field' => $edit, // <--- put your data in here.
        ];
        $entity = new Something();
        $form = $this->createForm( SomethingType::class, $entity, $options );
    
        $form->handleRequest( $request );
    
        if ( $form->isValid() ) {
            //... do something
        }
    
        // .....
    }
    

    SomethingType.php

    class SomethingType extends AbstractType {
        public function buildForm( FormBuilderInterface $builder, array $options ) {
            $builder->add( 'name', TextType::class, [
                'label'    => 'Name',
                'required' => true,
                'disabled' => $options[ 'disable_field' ],  // <---- use the $option here.
            ] )->add( 'email', EmailType::class, [
                 'required' => true,
            ] );
        }
    
        public function configureOptions( OptionsResolver $resolver ) {
            $resolver->setDefaults( [
                'data_class'     => Something::class,  // whatever entity class youre mapping to
                'disabled_field' => false,  // you need to set this to tell symfony its an allowed option. Its name needs to match the incoming array key.  If the array key isnt present, this default will be used instead.
            ] );
        }
    }
    

    您传入的数据既可以用作数组键,也可以用作值或两者,具体取决于您要实现的目标。