Я читал все о формах Symfony и Twig, но не нашел решения для своей проблемы, поэтому решил попросить вас, ребята.
То, что я пытаюсь достичь, состоит в том, чтобы передавать дубликаты данных в мою регистрационную форму только один раз. Данные, которые я хочу сохранить в базе данных, – это данные пользователя, название компании и адрес и название и адрес филиала. Мне нужно скопировать данные адреса в два объекта, например «Компания и филиал».
Есть ли способ передать эти данные для создания в веб-интерфейсе только один раз и указать его на две формы Symfony, которые будут добавлены к объектам и проверены.
Я знаю, что могу копировать адресные данные из одной сущности в другую за пределами формы, но это не так.
Main RegistrationFormType:
class RegistrationFormType extends AbstractType { private $class; public function __construct($class) { $this->class = $class; } public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('first_name') ->add('last_name') ->add('username') ->add('email', 'email') ->add('password', 'password') ->add('company', new CompanyType()) ->add('branch', new BranchType()) ; } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => $this->class, 'intention' => 'registration', )); } public function getName() { return 'registration'; } }
Тип компании:
class CompanyType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('companyName') ->add('foo', new CompanyInfoType(), array('data_class' => 'Acme\UserBundle\Entity\Company')) ; } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Acme\UserBundle\Entity\Company', 'validation_groups' => array('Registration'), )); } public function getName() { return 'company'; } }
Тип филиала:
class BranchType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('branchName') ->add('boo', new CompanyInfoType(), array('data_class' => 'Acme\UserBundle\Entity\Branch')) ; } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Acme\UserBundle\Entity\Branch', 'validation_groups' => array('Registration'), )); } public function getName() { return 'branch'; } }
CompanyInfoType:
class CompanyInfoType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('streetNumber') ->add('address') ->add('city') ->add('zip') ->add('country') ->add('contactName') ->add('phone') ->add('email') ; } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'inherit_data' => true )); } public function getName() { return 'company_info'; } }
Благодаря!
// РЕДАКТИРОВАТЬ
Я просто хочу объяснить, почему я хочу копировать данные компании в филиал, так как это выглядит немного странно.
Это делается именно потому, что я хочу, чтобы структура была подготовлена, если клиент хочет обновить свой аккаунт до «предприятия». При регистрации по умолчанию у них в основном есть только одна ветка, которая равна штаб-квартире компании, и если они добавляют больше филиалов, данные компании остаются неизменными, поскольку это их главная «ветвь». Существующие пользователи и другие элементы уже привязаны к этой ветке, поэтому добавление новой ветки не требует каких-либо баз данных или других структурных изменений.
// EDIT2 Мне удалось получить эту работу внутри формы благодаря linuxatico , но я уверен, что ее можно решить даже красивее. Вот как я это сделал:
public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('first_name') ->add('last_name') ->add('username') ->add('email', 'email') ->add('password', 'password') ->add('company', new CompanyType()) ->add('branch', new BranchType()) ; $builder->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) { $company = $event->getForm()->get('company')->getData(); $event->getForm()->get('branch')->getData() ->setBranchName($company->getCompanyName()) ->setStreetNumber($company->getStreetNumber()) ->setAddress($company->getAddress()) ->setCity($company->getCity()) ->setCountry($company->getCountry()) ->setZip($company->getZip()) ->setContactName($company->getContactName()) ; }); }
Ну, я не думаю, что это хорошая идея, что вы делаете, по информации, которую вы нам дали, похоже, у вас есть структурная проблема в том, как вы разрабатываете свое программное обеспечение, и еще один лучший способ решить вашу проблему.
Во всяком случае, если вы хотите продолжить свое решение, я могу предложить использовать AJAX, желательно JQuery, чтобы вы могли сделать запрос POST ко второй форме, если первый идет правильно.
В псевдокоде:
$.post({ url1, key_value_array_data, function(){ $.post({ url2, key_value_array_data, function(){ //custom_code }); } });
EDIT: это поможет: https://api.jquery.com/serialize/
EDIT # 2: вы также можете использовать внутреннюю систему событий Symfony, чтобы перехватить отправку формы и настроить поведение по своему усмотрению: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html