ZF2 Form Hydration с несколькими объектами и наборами полей
Я изо всех сил пытаюсь понять, как редактировать несколько моделей с помощью одной формы.
У меня есть таблица базы данных под названием "Команды" и сущность доктрины, связанная с этой таблицей. Я создаю форму, как показано ниже:
Моя команда fieldset:
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
);
}
Пока это все нормально и прекрасно работает.
Теперь у меня также есть устаревшая база данных с другой таблицей команд. Я хотел бы, чтобы пользователь мог редактировать оба через одну и ту же форму.
Я не использую доктрину для устаревшей базы данных, но это не имеет значения, и я скоро могу вытащить соответствующую запись в массив, а затем создать для нее набор полей с гидратором массива.
Однако вы вызываете функцию связывания в форме, а не в наборе полей. Итак, как мне связать данные с каждым набором полей с помощью этой единственной операции связывания в форме?
Если бы была операция связывания с набором полей, это не было бы проблемой, я мог бы вытащить каждый набор полей из формы и связать с соответствующим объектом.
Любые указатели будут очень цениться.
: WQ
1 ответ
Вы можете использовать Zend\Stdlib\Hydrator\Aggregate\AggregateHydrator
Документация гласит
Обычно вы хотите использовать агрегатный гидратор, когда вы хотите гидратировать или извлекать данные из сложных объектов, которые реализуют несколько интерфейсов, и, следовательно, вам нужно несколько гидраторов для обработки этого на последующих этапах.