Форма ZF2 / Доктрина Многочисленные Самостоятельные Отношения

Когда я пытаюсь создать форму ZF2 с самореферентным отношением Doctrine, я получаю сообщение об ошибке Doctrine Method "Status::getName" is not callable

Ниже моей конфигурации YAML для моей сущности:

Status:
type: entity
table: status
fields:
id:
id: true
type: integer
generator:
strategy: AUTO
options:
unsigned: true
name:
type: string
length: 255
manyToMany:
workflow:
targetEntity: Status
joinTable:
name: status_workflow
joinColumns:
statusId:
referencedColumnName: id
inverseJoinColumns:
nextStatusId:
referencedColumnName: id

и форма

class WorkflowForm extends Form
{
public function init()
{
$this->setName('workflow');

$this->add([
'name' => 'workflow',
'type' => WorkflowFieldset::class,
'options' => [
'use_as_base_fieldset' => true,
],
]);
}
}

и fieldset

class WorkflowFieldset extends Fieldset ObjectManagerAwareInterface
{
use ProvidesObjectManager;

public function init()
{
$this->setName('workflow');

$this->add([
'name' => 'id',
'options' => [
'label' => 'Status name'
],
]);

$this->add([
'name' => 'workflow',
'type' => ObjectSelect::class,
'attributes' => [
'multiple' => true,
],
'options' => [
'object_manager' => $this->getObjectManager(),
'target_class' => Status::class,
'property' => 'name',
],
]);
}
}

и действие

public function workflowEditAction()
{
$sm = $this->getServiceLocator();
$fm = $sm->get('FormElementManager');
$om = $sm->get('Doctrine\ORM\EntityManager');

$form = $fm->get(WorkflowForm::class);
//$workflow = $om->getRepository(Status::class)->getStatusesByEntityId($route->getParam('id'));
//$form->bind($workflow);

return new ViewModel([
'form' => $form,
]);
}

Наконец-то я хочу получить что-то вроде этого

введите описание изображения здесь

Извините за столько кода, чтобы не раздувать еще больше, я не показывал Hidrator, Factory и шаблон.

Заранее всем спасибо за помощь.

0

Решение

После дня поиска я решил свою проблему. Главное, что нужно заполнить массив для заполнения формы.

Я создаю массив со следующей структурой

$values = array(4) {
[0] => array(9) {
["id"] => int(99)
["name"] => string(6) "active"["entityId"] => int(30)
["workflow"] => array(2) {
[0] => int(100)
[1] => int(101)
}
}
[1] => array(9) {
["id"] => int(100)
["name"] => string(8) "inactive"["entityId"] => int(30)
["workflow"] => array(0) {
}
}
[2] => array(9) {
["id"] => int(101)
["name"] => string(6) "paused"["entityId"] => int(30)
["workflow"] => array(1) {
[0] => int(99)
}
}
}

И заполнить форму $form->populateValues(['statuses' => $values]);

Далее нужно создать собственный метод в хранилище

public function getWorkflowByModule($module) {
$moduleAlias = 'entity';
$workflowAlias = 'workflow';
$qb = $this->createQueryBuilder($this->_alias)
->select($this->_alias)
->leftJoin($this->_alias . '.workflow', $workflowAlias)
->leftJoin($this->_alias . '.entity', $moduleAlias);
$qb->where($qb->expr()->eq($this->_alias . '.' . 'entity', $module->getId()));

return $qb->getQuery()->getResult();
}

Изменить выбор в Fieldset

$this->add([
'name' => 'workflow',
'type' => ObjectSelect::class,
'attributes' => [
'multiple' => true,
],
'options' => [
'object_manager' => $this->getObjectManager(),
'target_class' => Status::class,
'property' => 'name',
'is_method' => true,
'find_method' => [
'name' => 'getWorkflowByModule',
'params' => [
'module' => $this->getModule(),
],
],
],
]);

Результат то, что я ожидал

введите описание изображения здесь

0

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

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

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