OrderType
$builder
->add('items', FormTypes\CollectionType::class, [
'entry_type' => OrderItemType::class,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'label' => 'acme.form.order.items',
])
->add('channel', ChannelSelectType::class, [
'required' => true,
'label' => 'acme.form.order.channel',
])
OrderItemType
$builder
->add('service', ServiceSelectType::class, [
'label' => 'acme.form.order_item.service',
])
->add('product', ProductSelectType::class, [
'label' => 'acme.form.order_item.product',
])
->add('quantity', FormTypes\IntegerType::class, [
'label' => 'acme.form.order_item.quantity',
]);
Как сопоставить ошибку с полем продукта OrderItemType?
позиция заказа действительна при применении продукта кконкретный канал.однако у нас нет способа получить подчиненный канал в OrderItemType, потому что дочерний тип формы передается перед его родителем.поэтому $ event-> getForm () -> getParent () -> getData () -> getChannel () пусто.Единственный способ, который у меня есть, это проверить позицию заказа в OrderType или создать валидатор, который добавляется в класс Order.проблема в том, как я могу сопоставить ошибку с полем продукта OrderItemType.
$orderItems = $order->getItems();
$channel = $order->getChannel();
foreach($orderItems as $index => $orderItem) {
$product = $orderItem->getProduct();
if (!$this->isProductAvailableForChannel($channel, $product)) {
$message = sprintf('product %ss is not available for channel "%s"', $product->getName(), $channel->getName());
}
if (null !== $message) {
$this->context
->buildViolation($this->constraint->message)
->setParameter($message)
->atPath("items.children[$index].product") // this doesn't work, the error will be added to root form.
->addViolation()
;
}
}