我正在尝试设置一个Symfony表单,该表单将允许用户选择添加所需数量的多个元素。我希望能够有一个FormType
和EntityType
之间的Integertype
。这意味着我需要有一个基于query_builder
的元素列表,才能仅选择部分产品,但我不仅希望能够选择产品,还需要说给定数量的我想要多少产品。
我已经能够根据发送的选项创建表单。对于数组中的每个产品,我使用构建器将Integertype
字段添加到表单中。这使我可以显示产品列表,并询问客户他想要的元素数量。
现在我遇到的问题是在列表中添加产品的详细数据,因为我不知道无法与标签交互的表单字段名称。如果我可以添加一些内容让我说'label'
可以显示为原始html,则可以在标签中串联所需的数据。
这是我当前的表格:
class OfferRequestStepMultipleHardwareType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder,array $options)
{
// instead of haveing set fields I create them based on the $option['step']->getProducts() data
foreach ($options['step']->getProducts() as $product){
$builder->add($product->getId().'-qty',Integertype::class,[
'mapped' => false,'attr' => [
'value' => 0,'class' => 'longlist','min' => 0
],'row_attr' => [
'class' => 'longlist'
],'label' => $product->getNumber() // ideally I would do some thing like '<div>'.$product->getNumber().'</div><div>'.$product->getDescription().'</div>' and then show it as raw in the form template
]);
}
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => OfferRequest::class,'step' => StepHardware::class,]);
}
}
问题在于这会生成如下代码:
<div id="offer_request_step_multiple_hardware">
<div class="longlist"><label for="offer_request_step_multiple_hardware_27-qty" class="required">Product 1</label><input type="number" id="offer_request_step_multiple_hardware_27-qty" name="offer_request_step_multiple_hardware[27-qty]" required="required" value="0" class="longlist"
min="0"></div>
<div class="longlist"><label for="offer_request_step_multiple_hardware_28-qty" class="required">Product 2</label><input type="number" id="offer_request_step_multiple_hardware_28-qty" name="offer_request_step_multiple_hardware[28-qty]" required="required" value="0" class="longlist"
min="0"></div>
<div class="longlist"><label for="offer_request_step_multiple_hardware_29-qty" class="required">Product 3</label><input type="number" id="offer_request_step_multiple_hardware_29-qty" name="offer_request_step_multiple_hardware[29-qty]" required="required" value="0" class="longlist"
min="0"></div>
<div class="longlist"><label for="offer_request_step_multiple_hardware_30-qty" class="required">Product 4</label><input type="number" id="offer_request_step_multiple_hardware_30-qty" name="offer_request_step_multiple_hardware[30-qty]" required="required" value="0" class="longlist"
min="0"></div><input type="hidden" id="offer_request_step_multiple_hardware__token" name="offer_request_step_multiple_hardware[_token]" value="PZaPfxKNSV-TjftRgjAw1K8XCUr7Dvkrp57kWTMBJ64"></div>
我还尝试在模板中创建表单主题,以更改Integer小部件的显示方式:
{% form_theme form _self %}
{% block question %}
<h1>{{ offer.lastStep.Question }}</h1>
{% endblock %}
{% block integer_widget %}
<div class="name_row">
{{ form_label(form)|raw }}
{{ form_errors(form) }}
{{ form_widget(form) }}
{{ form_help(form) }}
</div>
{% endblock %}
当我连接并尝试向其添加过滤器“原始”时没有任何成功,代码仍会自动转义。然后的问题是,我找到了有关如何为表单的特定字段设置特定标签的信息,但是我又一次在旅途中生成了表单,却无法知道字段名称(如所述here )。关于如何进行这项工作有什么建议吗?
理想情况下,我希望能够基于EntityType创建一个FormType,该FormType允许添加一个Integer而不是选择Entity元素...
任何帮助都会很好!