diff --git a/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_variant/create.yaml b/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_variant/create.yaml index 2558a9846b..b6a2088277 100644 --- a/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_variant/create.yaml +++ b/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_variant/create.yaml @@ -2,7 +2,14 @@ sylius_twig_hooks: hooks: 'sylius_admin.product_variant.create.content': form: - template: '@SyliusAdmin/product_variant/form.html.twig' + component: 'sylius_admin:product_variant:form' + props: + resource: '@=_context.resource' + product: '@=_context.resource.getProduct()' + form: '@=_context.form' + template: '@SyliusAdmin/product_variant/form.html.twig' + configuration: + render_rest: false priority: 0 'sylius_admin.product_variant.create.content.header': diff --git a/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_variant/update.yaml b/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_variant/update.yaml index c34347946b..b4109621ed 100644 --- a/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_variant/update.yaml +++ b/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_variant/update.yaml @@ -2,8 +2,14 @@ sylius_twig_hooks: hooks: 'sylius_admin.product_variant.update.content': form: - template: '@SyliusAdmin/product_variant/form.html.twig' + component: 'sylius_admin:product_variant:form' + props: + resource: '@=_context.resource' + product: '@=_context.resource.getProduct()' + form: '@=_context.form' + template: '@SyliusAdmin/product_variant/form.html.twig' configuration: + render_rest: false method: 'PUT' priority: 0 diff --git a/src/Sylius/Bundle/AdminBundle/Resources/config/routing/promotion_coupon.yml b/src/Sylius/Bundle/AdminBundle/Resources/config/routing/promotion_coupon.yml index da721c7648..b4d0a3718c 100644 --- a/src/Sylius/Bundle/AdminBundle/Resources/config/routing/promotion_coupon.yml +++ b/src/Sylius/Bundle/AdminBundle/Resources/config/routing/promotion_coupon.yml @@ -63,6 +63,8 @@ sylius_admin_promotion_coupon_generate: _controller: sylius.controller.promotion_coupon::generateAction _sylius: template: "@SyliusAdmin/promotion_coupon/generate.html.twig" + form: + type: Sylius\Bundle\AdminBundle\Form\Type\PromotionCouponGeneratorInstructionType section: admin redirect: route: sylius_admin_promotion_coupon_index diff --git a/src/Sylius/Bundle/AdminBundle/Resources/config/services/twig/component/product_variant.xml b/src/Sylius/Bundle/AdminBundle/Resources/config/services/twig/component/product_variant.xml new file mode 100644 index 0000000000..cd184e1e0e --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Resources/config/services/twig/component/product_variant.xml @@ -0,0 +1,34 @@ + + + + + + + + + + %sylius.model.product_variant.class% + Sylius\Bundle\AdminBundle\Form\Type\ProductVariantType + + + + + + + diff --git a/src/Sylius/Bundle/AdminBundle/Twig/Component/ProductVariant/FormComponent.php b/src/Sylius/Bundle/AdminBundle/Twig/Component/ProductVariant/FormComponent.php new file mode 100644 index 0000000000..7fae38e486 --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Twig/Component/ProductVariant/FormComponent.php @@ -0,0 +1,64 @@ + */ + use ResourceFormComponentTrait; + use TemplatePropTrait; + + #[LiveProp(hydrateWith: 'hydrateProduct', dehydrateWith: 'dehydrateProduct', fieldName: 'product')] + public ProductInterface $product; + + public function __construct( + RepositoryInterface $productVariantRepository, + FormFactoryInterface $formFactory, + string $resourceClass, + string $formClass, + private readonly ProductVariantFactoryInterface $productFactory, + private readonly ProductRepositoryInterface $productRepository, + ) { + $this->initialize($productVariantRepository, $formFactory, $resourceClass, $formClass); + } + + public function hydrateProduct(mixed $value): ?ProductInterface + { + return $this->productRepository->find($value); + } + + public function dehydrateProduct(ProductInterface $product): mixed + { + return $product->getId(); + } + + /** @return ProductVariantInterface */ + protected function createResource(): ResourceInterface + { + return $this->productFactory->createForProduct($this->product); + } +} diff --git a/src/Sylius/Bundle/AdminBundle/templates/product_variant/form.html.twig b/src/Sylius/Bundle/AdminBundle/templates/product_variant/form.html.twig index 14144d0ae8..0f3eb02098 100644 --- a/src/Sylius/Bundle/AdminBundle/templates/product_variant/form.html.twig +++ b/src/Sylius/Bundle/AdminBundle/templates/product_variant/form.html.twig @@ -1,11 +1,7 @@ -{% if form is not defined %} - {% set form = hookable_metadata.context.form %} -{% endif %} - {% form_theme form '@SyliusAdmin/shared/form_theme.html.twig' %} -
- {{ form_start(form, {'attr': {'class': 'ui loadable form', 'novalidate': 'novalidate', 'id': form.vars.id}}) }} +
+ {{ form_start(form, {'attr': {'novalidate': 'novalidate', 'id': form.vars.id}}) }}
{% if hookable_metadata.configuration.method is defined %} @@ -13,7 +9,7 @@ {{ form_errors(form, sylius_test_form_attribute('form-validation-errors')) }} {{ form_widget(form._token) }} - {% hook 'form' with { form } %} + {% hook 'form' with { form, resource } %}
{{ form_end(form, {render_rest: hookable.configuration.render_rest|default(false)}) }}
diff --git a/src/Sylius/Bundle/PromotionBundle/Controller/PromotionCouponController.php b/src/Sylius/Bundle/PromotionBundle/Controller/PromotionCouponController.php index 0d4c642c2d..08c0969163 100644 --- a/src/Sylius/Bundle/PromotionBundle/Controller/PromotionCouponController.php +++ b/src/Sylius/Bundle/PromotionBundle/Controller/PromotionCouponController.php @@ -37,7 +37,7 @@ class PromotionCouponController extends ResourceController throw new NotFoundHttpException('Promotion not found.'); } - $form = $this->container->get('form.factory')->create(PromotionCouponGeneratorInstructionType::class); + $form = $this->container->get('form.factory')->create((string) $configuration->getFormType()); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) {