我有一个Symfony表单类型,我想在其上插入我创建的另一种表单:
$form = $this->createFormBuilder();
$form->add('quantity', NumberType::class);
$form->add('options', ProductOptionType::class);
$form->add('notes', TextareaType::class, ]);
ProductOptionType是我创建的另一种类型,但在此类型上,我向构造函数注入了当前产品,因此我知道该产品具有哪些可用选项,以便以表格形式添加(即颜色,大小等)。
class ProductOptionType extends AbstractType
{
private $productOptions;
public function __construct(Product $product)
{
$this->productOptions = $product->getOptions();
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
foreach ($this->productOptions as $option) {
$builder->add($option->getId(), ChoiceType::class, [
'choices' => $option->getChoicesForForm(),
'label' => $option->getName()
]);
}
}
}
问题是如何在此处传递构造函数???
$form->add('options', ProductOptionType::class);
上面的代码不会引发构造器无错误,因为它实例化了类型,而不会对注入器产生任何影响。
另外这个抛出异常:
$form->add('options', new ProductOptionType($product));
因为它需要一个字符串而不是一个对象。
您可以通过选项传递额外的数据
class ProductOptionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$productOptions = $options['productOptions'];
foreach ($productOptions as $option) {
$builder->add($option->getId(), ChoiceType::class, [
'choices' => $option->getChoicesForForm(),
'label' => $option->getName()
]);
}
}
public function configureOptions(OptionsResolver $resolver)
{
// you can define a required option field for work
$resolver->setRequired([
'productOptions',
]);
// ...
// You could specify which type of class is supported
$resolver->setAllowedTypes([
'productOptions' => ProductOptions:class,
]);
}
}
然后在表单创建中使用它,如下所示:
$form->add('options', ProductOptionType::class, ['productOptions' => $product]);
希望有帮助
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句