Sylius - определить другой тип формы для ресурса - PullRequest
0 голосов
/ 26 апреля 2020

Возможно ли в Sylius определить другой тип формы ресурса для указанного c маршрута? Здесь я определяю специфическую c форму App\Form\DishShop\AccountCartType для этого маршрута:

rout.yaml

app_account_edit_dish_selection:
    path: /dish-selection/edit/{tokenValue}
    methods: [GET, POST, PUT]
    defaults:
        _controller: sylius.controller.order:updateAction
        _sylius:
            template: 'shop/index.html.twig'
            form:
                type: App\Form\DishShop\AccountCartType
                options:
                    product: "expr:service('app.service.subscription_provider').getProduct()"
            repository:
                method: findOneBy
                arguments: [tokenValue: $tokenValue]
            state_machine:
                graph: sylius_order_checkout
                transition: edit
            redirect: app_account_next_deliveries
            event: dish_selection_changed

App \ Form \ DishShop \ AccountCartType

namespace App\Form\DishShop;

use App\EventSubscriber\Account\DishStockReservationUpdater;
use App\Service\Dish\DishStockReservationProvider;
use App\Validator\Constraints\NumberOfSelectedDishesIsCoherentWithPlan;
use Sylius\Bundle\ResourceBundle\Form\Type\AbstractResourceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

final class AccountCartType extends AbstractResourceType
{
    private DishStockReservationProvider $dishStockReservationProvider;

    public function __construct(
        DishStockReservationProvider $dishStockReservationProvider,
        string $dataClass,
        array $validationGroups = []
    ) {
        parent::__construct($dataClass, $validationGroups);
        $this->dishStockReservationProvider = $dishStockReservationProvider;
    }

    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('subscriptionItem', PlanSelectionType::class, [
                'product' => $options['product'],
            ])
            ->add('dishSelection', DishSelectionType::class, [
                'constraints' => [
                    new NumberOfSelectedDishesIsCoherentWithPlan(),
                ],
            ])
            ->addEventSubscriber(new DishStockReservationUpdater($this->dishStockReservationProvider));
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        parent::configureOptions($resolver);

        $resolver->setRequired('product');
    }
}

services.yaml

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false

    app.form.dish_shop.account_cart_type:
        class: App\Form\DishShop\AccountCartType
        arguments:
            $dataClass: '%sylius.model.order.class%'
            $validationGroups: '%sylius.form.type.cart.validation_groups%'
        tags:
            - { name: form.type }

Но когда я отправляю форму, я получаю эту ошибку:

Невозможно проверить, действительна ли отправленная форма. Вызовите Form :: isSubmitted () перед Form :: isValid ().

Итак, есть способ сообщить Sylius, что для only для этого указанного c маршрута вам следует использовать этот тип формы?

...