OroCommerce — Symfony: как переопределить Entity (пользовательская учетная запись в реестре клиентов)

Я пытаюсь сделать настраиваемая форма регистрации клиентов

И чтобы сделать это, я переопределил этот 2 файл:

CustomerBundle \ Layout \ DataProvider \ FrontendCustomerUserRegistrationFormProvider.php
а также
CustomerBundle \ Form \ Тип \ FrontendCustomerUserRegistrationType.php

Итак, я вставил этот код в конфиг / config.yml и это работает как ожидалось:

services:
oro_customer.provider.frontend_customer_user_registration_form:
class: 'My_Code\Bundle\CustomerBundle\Layout\DataProvider\FrontendCustomerUserRegistrationFormProvider'
arguments:
- "@form.factory"- "@doctrine"- "@oro_config.manager"- "@oro_website.manager"- "@oro_user.manager"- '@router'
tags:
- { name: layout.data_provider, alias: oro_customer_frontend_customer_user_register }

oro_customer.form.type.frontend.customer_user.register:
class: 'My_Code\Bundle\CustomerBundle\Form\Type\FrontendCustomerUserRegistrationType'
arguments:
- '@oro_config.manager'
- '@oro_user.manager'
calls:
- [setDataClass, ['%oro_customer.entity.customer_user.class%']]
tags:
- { name: form.type, alias: oro_customer_frontend_customer_user_register }

Но мне также нужно переопределить сущность, чтобы она отображала новый столбец в форме регистрации клиентов.

Я заметил, что FrontendCustomerUserRegistrationType иметь этот код:

calls:
- [setDataClass, ['%oro_customer.entity.customer_user.class%']]

Так что CustomerBundle \ Resources \ Config \ services.yml есть это тоже:

parameters:
oro_customer.entity.customer_user.class: Oro\Bundle\CustomerBundle\Entity\CustomerUser

Так что я переопределил это с помощью конфиг / config.yml:

parameters:
oro_customer.entity.customer_user.class: My_Code\Bundle\CustomerBundle\Entity\CustomerUser

Но это не работает, выдает ошибку:

Ожидается, что данные вида формы будут экземпляром класса.
My_Code \ Bundle \ CustomerBundle \ Entity \ CustomerUser, но является экземпляром
класса Oro \ Bundle \ CustomerBundle \ Entity \ CustomerUser. Вы можете избежать
эта ошибка, установив для параметра «data_class» значение null или добавив
преобразователь представления, который преобразует экземпляр класса
Oro \ Bundle \ CustomerBundle \ Entity \ CustomerUser для экземпляра
My_code \ Bundle \ CustomerBundle \ Entity \ CustomerUser.

Я думаю, что это делает переопределение FrontendCustomerUserRegistrationType пойти не так и не удалось.

Вот мой переопределенный FrontendCustomerUserRegistrationType.php:

<?php

namespace My_Code\Bundle\CustomerBundle\Form\Type;

use Oro\Bundle\ConfigBundle\Config\ConfigManager;
use Oro\Bundle\CustomerBundle\Entity\CustomerUser;
use Oro\Bundle\UserBundle\Entity\User;
use Oro\Bundle\UserBundle\Entity\UserManager;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Assert;
use Oro\Bundle\CustomerBundle\Form\Type\FrontendCustomerUserRegistrationType as OroFrontendCustomerUserRegistrationType;

class FrontendCustomerUserRegistrationType extends OroFrontendCustomerUserRegistrationType
{

/**
* @var ConfigManager
*/
protected $configManager;

/**
* @param ConfigManager $configManager
* @param UserManager $userManager
*/
public function __construct(ConfigManager $configManager, UserManager $userManager)
{
parent::__construct($configManager, $userManager);
$this->configManager = $configManager;
}

/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
if ($this->isCompanyNameFieldEnabled()) {
$builder->add(
'companyName',
TextType::class,
[
'required' => true,
'mapped' => false,
'label' => 'oro.customer.customeruser.profile.company_name',
'constraints' => [
new Assert\NotBlank(),
new Assert\Length(['max' => 255])
],
'attr' => ['placeholder' => 'oro.customer.customeruser.placeholder.company_name']
]
);
}

$builder
->add(
'firstName',
TextType::class,
[
'required' => true,
'label' => 'oro.customer.customeruser.first_name.label',
'attr' => ['placeholder' => 'oro.customer.customeruser.placeholder.first_name']
]
)
->add(
'lastName',
TextType::class,
[
'required' => true,
'label' => 'oro.customer.customeruser.last_name.label',
'attr' => ['placeholder' => 'oro.customer.customeruser.placeholder.last_name']
]
)
->add(
'email',
EmailType::class,
[
'required' => true,
'label' => 'oro.customer.customeruser.email.label',
'attr' => ['placeholder' => 'oro.customer.customeruser.placeholder.email']
]
)
->add(
'test',
TextType::class,
[
'required' => true,
'label' => 'Test Label',
'attr' => ['placeholder' => 'Test Place Holder']
]
)
->add(
'test2',
TextType::class,
[
'required' => true,
'label' => 'Test2 Label',
'attr' => ['placeholder' => 'Test2 Place Holder']
]
)
;

$builder->add(
'plainPassword',
RepeatedType::class,
[
'type' => PasswordType::class,
'first_options' => [
'label' => 'oro.customer.customeruser.password.label',
'attr' => ['placeholder' => 'oro.customer.customeruser.placeholder.password']
],
'second_options' => [
'label' => 'oro.customer.customeruser.password_confirmation.label',
'attr' => ['placeholder' => 'oro.customer.customeruser.placeholder.password_confirmation']
],
'invalid_message' => 'oro.customer.message.password_mismatch',
'required' => true,
'validation_groups' => ['create']
]
);

$this->addBuilderListeners($builder);
}

/**
* @return bool
*/
private function isCompanyNameFieldEnabled()
{
return (bool) $this->configManager->get('oro_customer.company_name_field_enabled');
}
}

О, и я также создал столбец «test» и «test2» в таблице «oro_customer_user» с успехом 2, используя оро: Миграции.

Просто спросите, когда вам нужно больше файлов для проверки, спасибо за помощь 🙂

0

Решение

Вам также нужно переопределить configureOptions метод с вашим data_class:

public function configureOptions(OptionsResolver $resolver)
{

parent::configureOptions($resolver);
$resolver->setDefault('data_class',  \My_Code\Bundle\CustomerBundle\Entity\CustomerUser::class);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]