gpt4 book ai didi

Symfony:如何避免自定义表单类型自动包装在 div 中?

转载 作者:行者123 更新时间:2023-12-02 05:07:57 26 4
gpt4 key购买 nike

用户类型表单:

class UserType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('email', 'email', ['label' => 'EMail']);
// various other fields....
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => array('registration'),
'data_class' => 'Vendor\Model\Entity\User',
));
}

public function getName()
{
return 'form_user';
}
}

导师类型表格:

class TutorType extends Translate
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('user', new UserType(), ['label' => false]);

$builder->add('school', 'entity', [
'class' => 'Model:School',
'property' => 'name',
'label' => 'Label'
]);

// Various other fields
$builder->add('save', 'Submit');
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
//'validation_groups' => array('registration'),
'data_class' => 'Vendor\Model\Entity\Tutor',
'cascade_validation' => true,
));
}

public function getName()
{
return 'form_tutor';
}
}

渲染时,UserType是在 div 内渲染的,我找不到克服这个问题的方法。

表单呈现为

the result

<form name="form_tutor"
method="post"
action=""
novalidate="novalidate"
class="form-horizontal form-horizontal"
id="form_tutor">
<div id="form_tutor"
novalidate="novalidate"
class="form-horizontal">
<div class="form-group">
<div class="col-lg-10">
<div id="form_tutor_user">
<div class="form-group">
<label class="col-lg-2 control-label aaaa required"
for="form_tutor_user_email">EMail</label>

<div class="col-lg-10">
<input type="email"
id="form_tutor_user_email"
name="form_tutor[user][email]"
required="required"
class="form-control" />
</div>
</div>
</div>
</div>
</div>

<div class="form-group">
<label class="col-lg-2 control-label aaaa required"
for="form_tutor_tutorType">Type</label>

<div class="col-lg-10">
<select id="form_tutor_tutorType"
name="form_tutor[tutorType]"
class="form-control">
</select>
</div>
</div>

<div class="form-group">
<div class="col-lg-offset-2 col-lg-10">
<button type="submit"
id="form_tutor_save"
name="form_tutor[save]"
class="btn btn-default">Speichern</button>
</div>
</div><input type="hidden"
id="form_tutor__token"
name="form_tutor[_token]"
class="form-control"
value="s6i6zPxJs7KU5CiEe8i6Ahg_ca8rc2t5CnSk5yAsUhk" />
</div>
</form>

form_tutor_user包含在自己的 form-group div 中。我试图覆盖 form_tutor_user_widget 但这是深一层。 (这只是一个快速修复,它应该全局应用于所有表单类型 - 类)

如何更改主题,以便所有自定义类型都不用默认的 form_row 模板包装?

或者我如何知道 twig 何时渲染“子表单”?所以我可以决定打印 <div class="form-group">当子节点不是子表单时,如果是这种情况,则跳过它。

TIA

最佳答案

默认情况下,在基本表单主题中:

{% block form_row %}
{% spaceless %}
<div>
{{ form_label(form) }}
{{ form_errors(form) }}
{{ form_widget(form) }}
</div>
{% endspaceless %}
{% endblock form_row %}

并且,对于自定义复合形式:

{% block form_widget_compound %}
{% spaceless %}
<div {{ block('widget_container_attributes') }}>
{% if form.parent is empty %}
{{ form_errors(form) }}
{% endif %}
{{ block('form_rows') }}
{{ form_rest(form) }}
</div>
{% endspaceless %}
{% endblock form_widget_compound %}

除非您在此处进行了更改,否则您看到的 DIV 应来自模板的一个或另一位。

但是,在您的特定示例中,如果定义了 form_tutor_user_row ,则永远不会使用第一位,并且如果定义了 form_tutor_user_widget ,则永远不会使用最后一位。

回到你的问题。你的问题是:“如何更改主题,以便所有自定义类型都不会使用默认的 form_row 模板进行包装?”

这就是我所看到的问题:您希望您的 TOP 表单(包含所有子表单的表单)都具有共同的分段渲染方式。每个部分都将包含在 class="form-group"的 DIV 中。您可能想要添加一些额外的渲染操作,但为了简单起见,我将仅限于此。

然后您需要做的是创建一个特定的表单类型,并使您的所有 TOP 表单都继承自这个新的表单类型。例如:

class TopType extends AbstractType
{
public function getName()
{
return 'top_form';
}
}

...以及继承的形式:

class MyFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
...
}

public function getName()
{
return 'my_form';
}

public function getParent()
{
return 'top_form';
}
}

如您所见,无需使 PHP 继承即可使表单主题继承发挥作用。

模板主题明智(我什至可以这么说吗?),如果没有为 my_form 设置特定的表单主题,Symfony 将理解此处使用的默认表单主题是表单主题top_form,您可以这样定义:

{% block top_form_widget %}
{% spaceless %}
{% for child in form %}
<div class="form-group">
{{ form_widget(child) }}
</div>
{% endfor %}
{{ form_rest(form) }}
{% endspaceless %}
{% endblock top_form_widget %}

我应该补充一点,这是我已经遇到并解决的问题。告诉我这对你来说如何。

编辑:

总而言之,你要做的是:

  • 创建 TopType 表单类型,
  • 在表单主题中添加 top_form_widget block ,
  • 对于所有根表单(即顶级表单、没有父表单的表单),添加一个 getParent() 方法,该方法将返回您的 TopType 表单的名称(“top_form”)

关于Symfony:如何避免自定义表单类型自动包装在 div 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22014792/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com