如何修改使用Symfony2生成的表单元素的id?

如何修改使用Symfony2生成的表单元素的id?,symfony,Symfony,我在Symfony中有一个带有选项卡的应用程序,并使用Ajax异步加载,因此我可以一次在应用程序中使用两种表单。我有一个表单来注册用户,还有一个表单来更新用户数据。在更新表单中,Symfony2通过生成表单来创建用户(UserType),因此表单元素的id是相同的 另一方面,我有一个验证表单元素的函数,但当它验证其中一个表单时,也会验证另一个表单是否具有相同的id元素,因此无法正确验证每个表单 例如,使用细枝 {form\u row(edit\u form.name)}使用id=“user\u

我在Symfony中有一个带有选项卡的应用程序,并使用Ajax异步加载,因此我可以一次在应用程序中使用两种表单。我有一个表单来注册用户,还有一个表单来更新用户数据。在更新表单中,Symfony2通过生成表单来创建用户(UserType),因此表单元素的id是相同的

另一方面,我有一个验证表单元素的函数,但当它验证其中一个表单时,也会验证另一个表单是否具有相同的id元素,因此无法正确验证每个表单

例如,使用细枝
{form\u row(edit\u form.name)}
使用
id=“user\u name”
生成一个输入,我需要将其修改为更新表单
id=“update\u user\u name”

是否有任何方法可以在此时更改id属性?

您可以执行以下操作:

{{ form_row(edit_form.name, { 'id': 'edit_user_name' } }} 
如果要获取原始id并为其添加前缀,可以尝试以下操作:

{{ form_row(edit_form.name, { 'id': 'update_' ~ edit_form.name.vars.id } }} 
希望这符合您的需要。

您可以这样做:

{{ form_row(edit_form.name, { 'id': 'edit_user_name' } }} 
如果要获取原始id并为其添加前缀,可以尝试以下操作:

{{ form_row(edit_form.name, { 'id': 'update_' ~ edit_form.name.vars.id } }} 

希望这能满足您的需要。

我想我会从
FormType
实现中删除一个简短的“如何覆盖
id
属性值”:

基本上:

  • 覆盖
    buildView()
  • 修改
    $view->vars['id']
  • 一段代码:

    /**
     * We're setting the `id` attr. as e.g. `appointment-3-pack-221`
     *
     * @see parent::buildView()
     *
     * @see \Symfony\Component\Form\Extension\Core\Type\BaseType::buildView()
     *      Symfony Form component internals where
     *      the `id` attribute gets its value.
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        parent::buildView($view, $form, $options);
    
        /** @var Appointment $appt */
        $appt = $options['data'];
    
        $id = sprintf("%s-%d-pack-%d", $view->vars['id'], $appt->id, $appt->pack->id);
    
        $view->vars = array_replace($view->vars, [ 'id' => $id ]);
    }
    

    干杯。

    我想我会从
    FormType
    实现中删除一个简短的“如何覆盖
    id
    属性值”:

    基本上:

  • 覆盖
    buildView()
  • 修改
    $view->vars['id']
  • 一段代码:

    /**
     * We're setting the `id` attr. as e.g. `appointment-3-pack-221`
     *
     * @see parent::buildView()
     *
     * @see \Symfony\Component\Form\Extension\Core\Type\BaseType::buildView()
     *      Symfony Form component internals where
     *      the `id` attribute gets its value.
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        parent::buildView($view, $form, $options);
    
        /** @var Appointment $appt */
        $appt = $options['data'];
    
        $id = sprintf("%s-%d-pack-%d", $view->vars['id'], $appt->id, $appt->pack->id);
    
        $view->vars = array_replace($view->vars, [ 'id' => $id ]);
    }
    

    干杯。

    Hi@chalasr,这正是我所需要的,非常感谢。Hi@chalasr,我需要更改无线电场类型(选项)的名称,其中我有两个选项:男性或女性。根据您向我指示的方式,名称更改为包含两个输入的div,但不是每个输入。这是我得到的结果:
    这就是我需要的:
    这是正确的方法@chalasr吗<代码>{form_行(edit_form.sex[0],{'id':'edit_'~ edit_form.sex.vars.id~''''u 0}}}{{form_行(edit_form.sex[1],{'id':'edit_'~ edit_form.sex.vars.id~''}}
    Ah。。。遗憾的是,输入没有继承自定义id。如果它起作用,您可以使用它。但是,如果必须对许多字段执行此操作,则应尝试通过在字段上迭代并设置新id从控制器执行此操作(如果您不能直接更改表单类型。如果您需要更多信息或示例,请告诉我,我将编辑我的答案。Hi@chalasr,它可以工作,我只需要一个表单字段,所以我将保留它。感谢您的回复。Hi@chalasr,这正是我需要的,非常感谢。Hi@chalasr,我需要更改无线电字段类型的名称(选择),其中我有两个选项:男性或女性。根据您向我指示的方式,名称被更改为包含两个输入的div,但不是每个输入。这是我得到的结果:
    ,这就是我需要的:
    这是@chalasr的正确方式吗?
    {{form row(edit\form.sex[0],{'id':'edit'~edit'~form.sex.vars.id~''''0'}}{{{form'行(edit''form.sex[1],{'id':'edit'~edit'~edit'~form.sex.vars.id~'''1'}
    Ah…很遗憾,输入没有继承自定义id。如果它起作用,您可以使用它。但是如果您必须对许多字段执行此操作,您应该尝试从控制器迭代字段并设置新id来执行此操作(如果您不能直接更改表单类型。如果您需要更多信息或示例,请告诉我,我将编辑我的答案。您好@chalasr,它可以工作,我只需要一个表单字段,所以我将保留它。感谢您的回复。)。