Когда я пытаюсь создать форму 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 и шаблон.
Заранее всем спасибо за помощь.
После дня поиска я решил свою проблему. Главное, что нужно заполнить массив для заполнения формы.
Я создаю массив со следующей структурой
$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(),
],
],
],
]);
Результат то, что я ожидал
Других решений пока нет …