[AdminBundle] Add LiveComponent for ProductVariant

This commit is contained in:
Wojdylak 2024-10-25 12:17:10 +02:00
parent 6396f39ee9
commit aae7407fa7
No known key found for this signature in database
GPG key ID: 7509E560A6821ABE
7 changed files with 119 additions and 10 deletions

View file

@ -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':

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
This file is part of the Sylius package.
(c) Sylius Sp. z o.o.
For the full copyright and license information, please view the LICENSE
file that was distributed with this source code.
-->
<container
xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"
>
<services>
<service
id="sylius_admin.twig.component.product_variant.form"
class="Sylius\Bundle\AdminBundle\Twig\Component\ProductVariant\FormComponent"
>
<argument type="service" id="sylius.repository.product_variant" />
<argument type="service" id="form.factory" />
<argument>%sylius.model.product_variant.class%</argument>
<argument>Sylius\Bundle\AdminBundle\Form\Type\ProductVariantType</argument>
<argument type="service" id="sylius.factory.product_variant" />
<argument type="service" id="sylius.repository.product" />
<tag name="sylius.live_component.admin" key="sylius_admin:product_variant:form" />
</service>
</services>
</container>

View file

@ -0,0 +1,64 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Sylius\Bundle\AdminBundle\Twig\Component\ProductVariant;
use Sylius\Bundle\UiBundle\Twig\Component\ResourceFormComponentTrait;
use Sylius\Bundle\UiBundle\Twig\Component\TemplatePropTrait;
use Sylius\Component\Core\Model\ProductInterface;
use Sylius\Component\Core\Model\ProductVariantInterface;
use Sylius\Component\Core\Repository\ProductRepositoryInterface;
use Sylius\Component\Product\Factory\ProductVariantFactoryInterface;
use Sylius\Resource\Doctrine\Persistence\RepositoryInterface;
use Sylius\Resource\Model\ResourceInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\UX\LiveComponent\Attribute\AsLiveComponent;
use Symfony\UX\LiveComponent\Attribute\LiveProp;
#[AsLiveComponent]
class FormComponent
{
/** @use ResourceFormComponentTrait<ProductVariantInterface> */
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);
}
}

View file

@ -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' %}
<div class="container-xl">
{{ form_start(form, {'attr': {'class': 'ui loadable form', 'novalidate': 'novalidate', 'id': form.vars.id}}) }}
<div class="container-xl" {{ attributes }}>
{{ form_start(form, {'attr': {'novalidate': 'novalidate', 'id': form.vars.id}}) }}
<div class="row">
{% if hookable_metadata.configuration.method is defined %}
<input type="hidden" name="_method" value="{{ hookable_metadata.configuration.method }}" />
@ -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 } %}
</div>
{{ form_end(form, {render_rest: hookable.configuration.render_rest|default(false)}) }}
</div>

View file

@ -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()) {