• Jeder User im Forum verpflichtet sich zur Akzeptanz und zur Einhaltung dieser Regeln:
    1. Umgangston
      Ein angemessener höflicher Umgangston, ohne Beleidigungen, Beschimpfungen und aggressive Postings ist für jedes Mitglied Pflicht.
    2. Beiträge
      Jedes Mitglied sollte sich bemühen nur sinnvolle Beiträge zum Thema zu posten. Dabei ist unbedingt vorher zu prüfen, ob das Thema vorher schon einmal diskutiert wurde und daher fortgesetzt werden kann
      • Suchfunktion benutzen!
      • offizielle Doku lesen!
    3. Haftung
      Jeder Beitragsersteller übernimmt die alleinige Verantwortung seiner Inhalte.
    4. Werbung
      Wir erlauben keine Beiträge, Signaturen, Private Nachrichten oder eMails an Benutzer, die Werbung enthalten. Ausgenommen
      sind Stellengesuche /-angebote, welche ausschließlich im Forum "Stellengesuche" veröffentlicht werden dürfen.
    5. Verstöße
      Regelwidrige Beiträge sollten dem Team gemeldet werden. Nach deren Überprüfung werden wir schnellstmöglich
      entsprechend handeln.
    6. Authorität
      Den Anweisungen der Team-Mitglieder (Administratoren und Moderatoren) sind in diesem Forum Folge zu leisten.
      Bei Fragen oder Beschwerden bitte an diese wenden.
    Wir möchten Euch darauf aufmerksam machen, dass es bei Verstößen gegen einen oder mehreren der oben genannten
    Punkte dem Team frei steht entsprechend zu handeln. Dies kann z.B. das Löschen eines Beitrags, das Ausschliessen bzw.
    Sperren von Mitgliedern oder aber lediglich eine Verwarnung sein.

    In diesem Zusammenhang sollte erwähnt werden, dass das Forum automatisch die IP-Adresse jedes Beitrag-Erstellers
    speichert. Bei schweren Vergehen, behalten wir es uns vor, die IP-Adresse zur Strafverfolgung weiterzugeben.
  • Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

Daten aus Doctrine Entity in Zend Form zu Verfügung stellen

av3nger

New member
Habe den Beitrag jetzt mehrmals gelesen, bin jetzt aber nicht genau sicher: Hast du jetzt aufgrund der n:m-Beziehung Probleme damit die Bücher mit den Formularen zu verwalten? Denn ich habe mittlerweile mehrere Fälle, z. B. bei einer Rechteverwaltung: Rollen und Privilegien. Die Verwaltung erfolgt mit ObjectMultiCheckbox-Elementen. Einen Fall mit ObjectSelect-Elemeten habe ich ebenfalls - bei beiden Fälle funktioniert die Speicherung ohne Probleme.

Mit dem Hydrator gehe ich etwas anders um: setHydrator rufe ich bereits im Konstruktur meiner Formularklassen auf, welche von Factories aufgerufen werden. In meinen Service-Klassen setze ich dann mit $form->setObject() die jeweilige Entity (also entweder eine neues Objekt bei Erstellung oder ein vorhandenes aus der DB bei Bearbeitung) - direkt vor dem Aufruf von $form->isValid(). Im letzten Schritt rufe ich dann $form->getData() auf und habe dann das Objekt, das ich benötige. Beim anschließenden Speichern werden dann auch wie gewünscht die jeweiligen Beziehungen erstellt/entfernt.
 

Powers

New member
Ja, ich habe bislang Probleme aufgrund von n:m-Beziehungen. Das Buch ist im Formular jedoch nicht das Problem, sondern die Autoren. Da kann ich bislang nur jeweils einen je Buch speichern.

Ein Multiselect von Autoren führt jeweils zu merkwürdigen Ergebnissen. Wenn Du jedoch sagst, dass es definitiv auch mit einer n:m-Referenztabelle arbeitet, dann frag ich mich wo der Fehler ist.
Deine Arbeitsweise hört sich ganz gut an, müsste aber trotzdem erstmal nachvollziehen, wo genau da nun der Fehler ist und es nicht auch funktioniert, wenn man den Hydrator im Formular im Anschluß an den Constructor einbindet (in dem ich den Objektmanager mitgebe).

Ich fürchte das ich aktuell nicht die Zeit haben werde, dass nochmal aufzurollen. Aber ich behalte mir das aufjedenfall erstmal so im Hinterkopf.
 
Zuletzt bearbeitet:

KnechtRootRecht

New member
Ich bin mir nicht sicher ob es das gleiche Thema ist, aber ich habe ein Problem mit dem Bereitstellen der Daten für ein Select-Feld mit Multioptions per ManyToMany-Relation.
Die Rows werden ganz normal angezeigt, aber die Werte welche in der DB gesetzt sind werden nicht als "selected" markiert.

PHP:
$this->setHydrator(new DoctrineHydrator($oObjectManager, 'User\Entity\User'))
         ->setObject(new User())
         ->setInputFilter(new InputFilter());
$this->add(array(
            'name' => 'roles',
            'type' => 'DoctrineModule\Form\Element\ObjectSelect',
            'attributes' => array(
                'multiple' => true,
            ),
            'options' => array(
                'label' => 'form.player.role',
                'object_manager' => $oObjectManager,
                'target_class'   => 'User\Entity\Role',
                'property' => 'description',
                //'empty_option' => '-- auswählen --'
            )
        ));
 

av3nger

New member
Es geht bei dir vermutlich um ein Formular, das zum Bearbeiten dient, bei welchem die Werte vorselektiert werden sollen, oder?

Der Code sieht schon mal soweit korrekt aus. Aber wie sieht dein Controller aus? An irgendeiner Stelle musst du ja natürlich auch die Werte übergeben. Bei mir sieht die entscheidende Stelle folgendermaßen aus:

PHP:
if ($prg === false) {
    $form->bind($entity);
}
Entity wäre dann in dem Fall natürlich der User, den du dann vorher ausliest.
 

KnechtRootRecht

New member
Ja richtig, es geht hierbei um ein Edit-Formular. Soweit passt es ja auch und funktioniert.
Eben nur wenn ich die Rollen welche aus einem ManyToMany von Doctrine anzeigen möchte bekomm ich diese Notices.
Ich habs jetzt auch mit Checkboxen versucht, selber Fehler, die Checkboxen werden allerdings angezeigt, nur nicht richtig vorausgewählt.
Code:
[B]Notice[/B]:  Object of class User\Entity\Role could not be converted to int in [B]/var/www/marcus/adl_zf2/dartliga/vendor/zendframework/zendframework/library/Zend/Form/View/Helper/FormMultiCheckbox.php[/B] on line [B]205[/B]

[B]Notice[/B]:  Object of class DoctrineORMModule\Proxy\__CG__\User\Entity\Role could not be converted to int in [B]/var/www/marcus/adl_zf2/dartliga/vendor/zendframework/zendframework/library/Zend/Form/View/Helper/FormMultiCheckbox.php[/B] on line [B]205
[/B]
Das Formular setzte ich ganz normal mit:
PHP:
$oPlayerForm = new PlayerForm($oEm);
$oUserEntity = $oService->getSinglePlayer($aPost['pid']);$oPlayerForm->bind($oUserEntity);
 
Zuletzt bearbeitet:

KnechtRootRecht

New member
So, nach endloser google und mailinglisten sowie github suche und SOF bin ich durch einen einfachen Versuch zum richtigen Ergebniß gekommen.
Es lag am Modul "BjyAuthorize" welches das User-Entity als Vorgabe hatte.
Folgende Methode erzeugte den Fehler/Notice:
PHP:
/**
* Get role.
*
* @return array*/ 
public function getRoles() {
      return $this->roles->getValues();
 }
ich habe zum testen nur die Eigenschaft verwendet und somit wurden die Checkboxen richtig gecheckt und die Notices sind auch verschwunden:
PHP:
/**
* Get role.
*
* @return array*/
 public function getRoles() {
      return $this->roles;
 }
 

Powers

New member
Hallo!

Nach einiger Zeit habe ich nun mein ZF2 / Doctrine2-Projekt wieder hervorgeholt und nach einigem Testen hänge ich immernoch daran, dass ich mithilfe eines Multiple-Select-Field nicht mehrere Werte aufeinmal in der Datenbank speichern kann. Es wird immer nur das erste gespeichert.

Und zwar habe ich die Relation nun in eine Unidirektionale ManyToMany-Relation mit einer seperation NM-Tabelle umgewandelt.

PHP:
Entity/Book

     /**
     * @ORM\ManyToMany(targetEntity="Author", cascade="persist")
     * @ORM\JoinTable(name="books_authors",
     *         joinColumns={@ORM\JoinColumn(name="book_id", referencedColumnName="id")},
     *         inverseJoinColumns={@ORM\JoinColumn(name="author_id", referencedColumnName="id")}
     * )
     */
    private $authors;

    public function __construct() {
        $this->authors = new \Doctrine\Common\Collections\ArrayCollection();
    }


    public function addAuthors($author)
    {
        if (!$this->authors->contains($author)) {
            $this->authors->add($author);
        }
    }

    public function removeAuthors($author)
    {
        if ($this->authors->contains($author)) {
            $this->authors->removeElement($author);
        }

        return $this;
    }
Das Formular dazu habe ich nach Beispiel von KnechtRootRecht oben abgewandelt, und rufe nicht mehr direkt die Autoren-Entity auf, sondern die in Book erstellte Relation "Authors".

PHP:
Fieldset/AuthorSelect

parent::__construct('authors');
        $this->setHydrator(new DoctrineHydrator($objectManager, 'Article\Entity\Bkbook'));
        $this->setObject(new \Article\Entity\Bkbook());

        $this->add(array(
            'type'    => 'DoctrineModule\Form\Element\ObjectSelect',
            'name'    => 'authors',
            'attributes' => array(
                'multiple' => 'multiple',
            ),
            'options' => array(
                'label'          => 'Buchautor/en',
                'object_manager' => $this->getObjectManager(),
                'target_class'   => 'Article\Entity\Bkauthor',
                'value'             => 'id',
                'property'       => 'lastname',
                'empty_option'   => '--- bitte wählen ---',

            ),
        ));
 

Powers

New member
Hallo allerseits! :)

Nach einiger Zeit habe ich nun mein ZF2 / Doctrine2-Projekt wieder hervorgeholt und nach einigem Testen hänge ich immernoch daran, dass ich mithilfe eines Multiple-Select-Field nicht mehrere Werte aufeinmal in der Datenbank speichern kann. Es wird immer nur das erste Element eines Array's gespeichert.

Und zwar habe ich die Relation nun in eine Unidirektionale ManyToMany-Relation mit einer seperation NM-Tabelle umgewandelt.

PHP:
Entity/Book

     /**
     * @ORM\ManyToMany(targetEntity="Author", cascade="persist")
     * @ORM\JoinTable(name="books_authors",
     *         joinColumns={@ORM\JoinColumn(name="book_id", referencedColumnName="id")},
     *         inverseJoinColumns={@ORM\JoinColumn(name="author_id", referencedColumnName="id")}
     * )
     */
    private $authors;

    public function __construct() {
        $this->authors = new \Doctrine\Common\Collections\ArrayCollection();
    }


    public function addAuthors($authors)
    {
       foreach ($authors as $author) {
            $this->authors->add($author);
        }
        return $this;
    }

    public function removeAuthors($author)
    {
        if ($this->authors->contains($author)) {
            $this->authors->removeElement($author);
        }

        return $this;
    }
Das Formular dazu habe ich nach Beispiel von KnechtRootRecht oben abgewandelt, und rufe nicht mehr direkt die Autoren-Entity auf, sondern die in Book erstellte Relation "Authors" (Code-Schnipsel oben).

PHP:
Fieldset/AuthorSelect

parent::__construct('authors');
        $this->setHydrator(new DoctrineHydrator($objectManager, 'Article\Entity\Book'));
        $this->setObject(new \Article\Entity\Book());

        $this->add(array(
            'type'    => 'DoctrineModule\Form\Element\ObjectSelect',
            'name'    => 'authors',
            'attributes' => array(
                'multiple' => 'multiple',
            ),
            'options' => array(
                'label'          => 'Buchautor/en',
                'object_manager' => $this->getObjectManager(),
                'target_class'   => 'Article\Entity\Author',
                'value'             => 'id',
                'property'       => 'lastname',
                'empty_option'   => '--- bitte wählen ---',

            ),
        ));
Als ich den FormularSelect so umgebaut habe, hat mich Doctrine zunächst darauf aufmerksam gemacht, dass ich sowohl eine addAuthors, als auch eine removeAuthors-Methode benötige, wenn ich so arbeiten will. Also habe ich diese (wie im ersten Codeschnipsel zu sehen) auch eingefügt. Macht ja Sinn.

Dann bekomme ich den Fehler "Found entity of type Article\Entity\Book on association Article\Entity\Book#authors, but expecting Article\Entity\Author". Ich verstehe, dass Doctrine gerne ein Objekt vom Typ Author hätte - aber er bekommt ja mit "authors" eine ArrayCollection, wovon jedes Element von entsprechenden Typ ist. Muss man Doctrine da noch an entsprechender Stelle darauf hinweisen, damit es damit umgehen kann?
 
Zuletzt bearbeitet:

Powers

New member
Ah okay, habe mein Problem nun selbst lösen können. Habe alles nochmal aufgerollt und damals bei der Umsetzung wohl ein paar Ungereimtheiten im Detail eingebaut, die das Formular im groben nicht crashen lassen, aber bei sowas dann eben Probleme machten. Nun geht es wie von Zauberhand.

Ich habe ua.a:
- Datenbank NM-Tabelle geglättet (index-unique-Kram)
- Fieldset für Select von "Authors" aufgelöst und eine Ebene höher nach "Book" verschoben
- Hydratoren überarbeitet (hatte irgendwo noch einen ZendForm-Hydrator, dabei benötige ich überall DoctrineHydrator)

Ich habe das Thema hier mal abonniert. Falls mal jemand an der ZF2 / ZendForm / Doctrine2-Kombination-Umsetzung hängt - einfach hier die Frage im Thread stellen. Ich werde dann gerne versuchen zu helfen.
 
Zuletzt bearbeitet:
Oben