【问题标题】:How to set a class attribute to a Symfony form input with an attribut from entity linked如何使用来自实体链接的属性将类属性设置为 Symfony 表单输入
【发布时间】:2017-01-07 15:45:06
【问题描述】:

我的表单中有一个“床”属性,一个链接到另一个“卧室”的实体。 我想为每个输入添加一个带有链接实体“卧室”的 id 的类。

$form->add('beds', EntityType::class, array(
    'class' => 'DamiasResaBundle:Bed',
    'query_builder' => function (EntityRepository $er) {
        return $er->createQueryBuilder('b')
                  ->orderBy('b.id', 'ASC');
    },
    'choice_label' => 'id',
    'label' => 'lits ',
    'multiple' => true,
    'expanded' =>true,
    'attr' => array(
        'class' => function ($bed) {
            return $bed->getBedroom()->getId();
        }
     ),
 ))

我有两个问题:

  1. 'attr' => array('class'=>'test) 返回包含输入的 div 中的类属性,而不是输入中的类属性。
  2. 之前的代码不起作用并返回:

在 form_div_layout.html.twig 第 358 行的模板渲染过程中引发了异常(“Catchable Fatal Error: Object of class Closure could not be convert to string”)。

感谢您的帮助

【问题讨论】:

    标签: forms input attributes symfony symfony-forms


    【解决方案1】:

    我看到您正在使用复选框。 您的代码似乎没问题,并且由于您使用 query_builder,因此值应该是 Bed Entity。注意attrEntityType documentation中没有提到,我认为你需要使用choice_attr来代替。

    你可以试试这个。我不确定它是否会起作用:

    $form->add('beds', EntityType::class, array(
        'class' => 'DamiasResaBundle:Bed',
        'query_builder' => function (EntityRepository $er) {
            return $er->createQueryBuilder('b')
                        ->orderBy('b.id', 'ASC');
        },
        'choice_label' => 'id',
        'label' => 'lits ',
        'multiple' => true,
        'expanded' =>true,
        'choice_attr' => function ($val) {
                return ['class' => $val->getId()];
        },
    ))
    

    让我们知道结果。

    【讨论】:

    • 谢谢,您的解决方案匹配!
    【解决方案2】:
    1. 您需要customize form rendering
    2. 之前的代码不起作用,因为您试图传递闭包对象而不是字符串值。 attr 数组用作字段属性,因此它必须只包含字符串值(或具有__toString() 方法的对象)。

    【讨论】:

      【解决方案3】:

      对于 EntityType,它宁愿看起来像这样:

      $form->add('beds', EntityType::class, array(
          'class' => 'DamiasResaBundle:Bed',
          'query_builder' => function (EntityRepository $er) {
              return $er->createQueryBuilder('b')
                          ->orderBy('b.id', 'ASC');
          },
          'choice_label' => 'id',
          'label' => 'lits ',
          'multiple' => true,
          'expanded' =>true,
          'choice_attr' => function (Bed $bed, $key, $index) {
                  return ['class' => $bed->getBedroom()->getId();];
          },
      ))
      

      【讨论】:

        【解决方案4】:

        由于choice_attr 似乎不再起作用,我正在编写另一个解决方案。我无法直接从 formBuilder 设置属性(确切地说是“min”)。我设法在js的帮助下添加了它。我只是通过 formBuilder 给出的 ID 搜索元素并添加属性。

        在浏览器元素检查器中检查您的表单并找到 id。

        <div id="form_deadLine">
           <input type="date" id="form_deadLine_date" name="form[deadLine][date]" required="required" value="2020-02-20"/>
        </div>
        

        在我的情况下,您要查找的是 form_deadLine_date。

        然后你想将 .js 文件连接到你的树枝模板并在那里编写简单的脚本。

        const form = document.getElementById('form_deadLine_date');
        if(form){
            form.setAttribute("min", "2020-01-02")
        }
        

        那么我的代码如下:

        <div id="form_deadLine">
           <input type="date" id="form_deadLine_date" name="form[deadLine][date]" required="required" value="2020-02-20"/>
        </div>
        

        【讨论】:

          猜你喜欢
          • 2011-10-07
          • 1970-01-01
          • 2013-06-08
          • 2023-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多