2016-07-13 12 views
0

Wenn ich versuche, ZF2 Formular mit Lehre Selbstreferenzierung Beziehung zu erstellen:ZF2 Form/Lehre ManyToMany Selbst Bezug Relation

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 

und Form

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

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

und 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', 
      ], 
     ]); 
    } 
} 

und Aktion

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, 
    ]); 
} 

Schließlich möchte ich so viel Code so etwas wie dieses

enter image description here

Leider erhalten nicht noch mehr aufzublasen, ich nicht zeigen Hidrator, Fabrik und Vorlage .

Vielen Dank im Voraus für Ihre Hilfe.

Antwort

0

Nach dem Tag der Suche löste ich mein Problem. Die Hauptsache ist, dass Array generiert werden muss, um das Formular zu füllen.

Ich schaffe Array mit der nächsten Struktur

$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) 
    } 
    } 
} 

Und füllen Form $form->populateValues(['statuses' => $values]);

Als nächstes müssen benutzerdefinierte Methode in Repository

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(); 
} 

ändern wählen in 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(), 
       ], 
      ], 
     ], 
    ]); 
erstellen

Ergebnis ist das, was ich

enter image description here

erwartet