Я изо всех сил пытаюсь решить, как редактировать несколько моделей с помощью одной формы.
У меня есть таблица базы данных под названием «Команды» и объект доктрины, связанный с этой таблицей. Я создаю форму, как показано ниже:
Мой групповой набор:
class TeamFieldset extends AbstractFieldset implements InputFilterProviderInterface { public function init() { $this->setName('Team') ->setHydrator(new DoctrineHydrator($this->getObjectManager(),'Application\Model\Entities\Team')) ->setObject(new Team()) ->setLabel('Team'); $this->add(array( 'type' => 'Hidden', 'name' => 'id', )); $this->add(array( 'name' => 'name', 'options' => array( 'label' => 'Team name', ), )); // …. more fields go here } /** * Implement InputFilterProviderInterface */ public function getInputFilterSpecification() { // …. input filter implementation goes here. } }
Форма моей команды:
class TeamForm extends AbstractAdminForm { public function init() { parent::init(); $this->setName('team-form') ->add(array( 'type' => 'TeamFieldset', 'name' => 'Team', 'options' => array( 'use_as_base_fieldset' => true, ), ) ); $this->add(array( 'name' => 'submit', 'options' => array( 'label' => 'Save Team', ), 'attributes' => array( 'class' => 'btn-primary', 'type' => 'submit', ), )); } }
И в моем контроллере:
public function editTeamAction() { $team = $this->getEntityManager()->find('Application\Model\Entities\Team',$this->params()->fromRoute('team_id')); $formManager = $this->serviceLocator->get('FormElementManager'); $form = $formManager->get('Application\Form\Team\TeamForm'); $form->setAttribute('action',$_SERVER['REQUEST_URI']); $form->bind($team); $request = $this->getRequest(); if ($request->isPost()) { $form->setData($request->getPost()); if ($form->isValid()) { $this->getEntityManager()->persist($team); $this->getEntityManager()->flush(); $this->redirect()->toRoute('admin/leagues/league/team',array('league_id' => $team->getLeague()->getId(),'team_id' => $team->getId())); } } return array( 'team' => $team, 'form' => $form ); }
Пока все прекрасно и отлично работает.
Теперь у меня также есть устаревшая база данных с другой таблицей команд. Я хотел бы, чтобы пользователь мог редактировать как через ту же форму.
Я не использую доктрину для устаревшей базы данных, но это не имеет значения, и я могу вскоре вытащить соответствующую запись в массив, а затем создать для нее набор полей с гидратором массива.
Однако вы вызываете функцию bind в форме, а не в поле. Итак, как мне привязать данные к каждому набору полей с помощью этой операции единственного связывания в форме?
Если бы была операция привязки на листе, это не было проблемой, я мог бы вытащить каждый набор полей из формы и связать с соответствующим объектом.
Любые указатели были бы очень оценены.
: WQ
Вы можете использовать Zend\Stdlib\Hydrator\Aggregate\AggregateHydrator
В документации указано
Обычно вы хотите использовать агрегированный гидратор, когда хотите гидратировать или извлекать данные из сложных объектов, которые реализуют несколько интерфейсов, и, следовательно, для их последующего использования потребуется несколько гидраторов.