Sylius: добавление нестандартной формы - PullRequest
0 голосов
/ 14 сентября 2018

В Sylius я хочу добавить 1 таблицу для клиента, так что для определенного типа клиента (например, VIP) необходимо заполнить дополнительные поля. (Отношение один к одному)

Сущность CustomerExtra создана. Тип формы CustomerExtraType создан. Первоначально я создал тип формы extends AbstractType. В форме клиента показаны эти дополнительные поля, но запись не будет сохранена.

Тогда я обнаружил, что Sylius должен вместо этого расширить AbstractResourceType, чтобы я внес изменения, но с ошибкой:

Cannot autowire service "AppBundle\Form\Type\CustomerExtraType": argument "$dataClass" of method "Sylius\Bundle\ResourceBundle\Form\Type\AbstractResourceType::__construct()" is type-hinted "string", you should configure its value explicitly.

Вот код:

service.yml

services: app.form.type.customerextra: class: AppBundle\Form\Type\CustomerExtraType tags: - { name: form.type}

config.yml

sylius_resource: resources: app.customerextra: driver: doctrine/orm classes: model: AppBundle\Entity\CustomerExtra form: AppBundle\Form\Type\CustomerExtraType

Клиентский субъект

namespace AppBundle\Entity;
use AppBundle\Entity\CustomerExtra as BaseCustomerExtra;
use Sylius\Component\Core\Model\Customer as BaseCustomer;

class Customer extends BaseCustomer
{
    /**
     * @var CustomerExtra|null
     */
    protected $customerextra;

    public function __construct(BaseCustomerExtra $customerextra)
    {
        $this->createdAt = new \DateTime();
        $this->customerextra = $customerextra;
    }

    /**
     * {@inheritdoc}
     */
    public function getCustomerExtra(): ?BaseCustomerExtra
    {
        return $this->customerextra;
    }

    /**
     * {@inheritdoc}
     */
    public function setCustomerExtra(BaseCustomerExtra $customerextra): void
    {
        $this->customerextra = $customerextra;
        $this->customerextra->setCustomer($this);
        $customerextra->setCustomer($this);
    }

CustomerExtra Entity

private $customer;
/**
 * {@inheritdoc}
 */
public function getCustomer(): ?Customer
{
    return $this->customer;
}

/**
 * {@inheritdoc}
 */
public function setCustomer(?Customer $customer): void
{
    $this->customer = $customer;
}

CustomerProfileType

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event): void {
    $customer = $event->getData();

    $event->getForm()->add('customerextra', CustomerExtraType::class, [
    ]);
});

CustomerExtraType

namespace AppBundle\Form\Type;
use AppBundle\Entity\CustomerExtra;
use Symfony\Component\Form\FormBuilderInterface;
use Sylius\Bundle\ResourceBundle\Form\Type\AbstractResourceType;

class CustomerExtraType extends AbstractResourceType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('customer_extra1', TextType::class, [
                'required' => false,
                'label' => 'sylius.form.customer.customer_extra1',
            ])
            ->add('customer_extra2', NumberType::class, [
                'required' => false,
                'label' => 'sylius.form.customer.customer_extra2',
            ])
        ;
    }

    public function getBlockPrefix()
    {
        return 'app_customerextra';
    }

    public function getName()
    {
        return 'admin_customerextra';
    }

}

Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

У меня была эта проблема при переходе с Sylius 1.0-beta на 1.3. У меня было то же сообщение об ошибке того же родительского типа:

Cannot autowire service "App\SomeBundle\MyType": argument "$dataClass" of method "Sylius\Bundle\ResourceBundle\Form\Type\AbstractResourceType::__construct()" is type-hinted "string", you should configure its value explicitly.

Что для меня исправило, так это отключение автопроводки по умолчанию:

services:
    # Default configuration for services in *this* file
    _defaults:
        # Automatically injects dependencies in your services
        autowire: false
0 голосов
/ 17 сентября 2018

Попробуйте изменить определение услуги:

services:
    app.form.type.customerextra:
        class: AppBundle\Form\Type\CustomerExtraType
        arguments:
            $dataClass: AppBundle\Entity\CustomerExtra
        tags:
            - { name: form.type}

Обновление: хорошо, попробуйте вместо:

app.form.type.customerextra:
        class: AppBundle\Form\Type\CustomerExtraType
        arguments:
            - AppBundle\Entity\CustomerExtra
            - "Default"
        tags:
            - { name: form.type}
...