我正在尝试修改CartItemType的数量字段。
按照旧文档,我在Bundle上创建了一个新的FormType,并从Symfony/Bundle/CartBundle/Form/Type/CartItemType
中的原始文档扩展。
我的自定义CartItemType显示如下:
use Sylius\Bundle\CartBundle\Form\Type\CartItemType as BaseType;
use Symfony\Component\Form\FormBuilderInterface;
class CartItemType extends BaseType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->remove('quantity')
->add('quantity', 'hidden', [
'attr' => ['min' => 1, 'max' => 1],
'data' => '1',
'label' => 'sylius.form.cart_item.quantity',
])
->setDataMapper($this->orderItemQuantityDataMapper);
}
}
我希望您不能为每个订单购买多个产品数量。
我的配置似乎与此相似:
sylius_cart:
resources:
cart_item:
classes:
form:
default: Dinamic\Bundle\SyliusRibBundle\Form\Type\CartItemType
当我打开某个产品视图时,我收到此错误:
选项“产品”不存在。 [...]在@ SyliusShop / Product / Show / _inventory.html.twig第4行
知道为什么会这样吗?
答案 0 :(得分:2)
而不是使用此扩展CartBundle CartItemType:
use Sylius\Bundle\CoreBundle\Form\Type\CartItemType as BaseType;
CoreBundle CartItemType类扩展了CartBundle CartItemType,因此如果扩展错误的类,它将破坏所有内容
答案 1 :(得分:0)
不要以这种方式扩展Symfony表单类型 - 而是扩展Symfony\Component\Form\AbstractType
,并在自定义类型中实现getParent()
:
public function getParent()
{
return BaseType::class;
}
这样,父母的选项也可用于您的自定义类型,并且所有内容都将被正确呈现/初始化。
从技术上讲,这两种方法都应该有效。但是,使用继承将完全覆盖父表单的行为,而使用getParent()
会将您的自定义行为添加到父表单中。
getParent()
将告诉Symfony首先构建该方法中定义的表单,然后将其用作您自己实现的基础。因此,在使用该方法时,FormBuilder
方法中的buildForm()
已经包含完整的父表单,可供您自己修改,OptionsResolver
方法中的configureOptions()
已有父表单的选项和默认值定义等,这看起来正是您想要的(否则您对$builder->remove()
的调用没有多大意义)。使用继承时,您必须注意做父表单所做的所有操作,这可能会在父表单更改时中断。
另一个区别在于Symfony的表单 extensions 。在实施getParent()
时,应用于父表单的任何表单扩展也将应用于您的自定义表单。使用继承时,情况并非如此。
第一点易于使用(例如parent::buildForm()
将确保您拥有正确的字段),但第二点并不容易。通常,您希望这些扩展也适用于您的自定义表单类型 - 在这种情况下,实际上错误的可能性是表单扩展未应用于您的自定义类型。
所以基本上,尽可能使用getParent()
。仅当您要完全覆盖行为或明确希望表单扩展不适用于您的自定义类型时,才对表单类型使用继承。