我有一个表单:
class BillType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('user')
->add('numberPlate')
->add('servicesPerformed', CollectionType::class, array(
'label' => false,
'entry_type' => ServicePerformedType::class,
'allow_add' => true,
))
->add('Save', SubmitType::class)
;
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'DefaultBundle\Entity\Bill'
));
}
作为ServicePerformedType
类,它是这样的:
class ServicePerformedType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('description', TextareaType::class, array('label' => false))
->add('price', TextType::class, array('label' => false))
->add('quantity', TextType::class, array('label' => false));
}
}
同时,这是用于渲染表单的模板:
{{ form(form) }}
<a href="#">Add service</a>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script type="text/javascript">
var index = 0;
$('a').on('click', function() {
var prototype = $('#bill_servicesPerformed').data('prototype');
prototype = prototype.replace(/_name_/g, index.toString());
$('#bill_servicesPerformed').html(prototype);
index++;
})
</script>
如文档中所述,要获取自定义原型,我应该在模板顶部添加以下行:
{% form_theme form _self %}
{% block _servicesPerformed_entry_widget %}
I WILL WRITE MY CUSTOM PROTOTYPE HERE
{% endblock %}
但是当我点击“添加服务”时,我没有得到文本“I WILL WRITE MY CUSTOME PROTOTYPE HERE”,而是之前与类相关的、和。
注:也许有其他方法来自定义表单原型,但是我对此感兴趣,因此将非常感谢提供与这种方式相关的解决方案的人,谢谢。
unique_block_prefix
+_widget
或entry_widget
等)。这可能是Symfony文档中最糟糕的部分之一(通常很好)。基本上,我真的觉得使用经典的form_theme应该影响正常和原型渲染,将它们分开并没有太多意义(但也许这是一种奇怪的技术限制)。 - Bonswouar