2012-10-23 13 views
7

Gibt es eine bessere Möglichkeit, Daten neben der Verwendung von bind() aus einer document2-ODM-Entitätsklasse in ein Zend2-Formular zu binden?Binden von Zend2-Formulardaten von doctrine2 ODM

Wenn ja, was wäre das? Würde ich die Daten einfach als Array abrufen und jedes einzelne Feld übergeben? Ich habe damit zu kämpfen und mache es wahrscheinlich schwieriger, als es sein muss.

Wenn ich die bind() Funktion aufrufen, gibt es einen Zend Fehler aus, der auf den Standard-Hydrator verweist. Muss ich in meiner Entity-Klasse etwas Spezielles tun?

Edit: Hier sind die genauen Fehler Zend

~ \ Anbieter wirft \ ZendFramework \ ZendFramework \ library \ Zend \ Stdlib \ Hydrator \ ArraySerializable.php: 35

Zend \ Stdlib \ Hydrator \ ArraySerializable :: Extrakt erwartet, dass die vorgesehenen Objekt getArrayCopy()

Sie machen mich implementieren glaube, ich muss entweder:

  1. Verwendung Zends hydrators (die ich erforschen müsste, wie zu implementieren) oder
  2. die Nutzung Doctrine2 hydrators (was ich auch den besten Weg, um herauszufinden, müsste zu implementieren)
+0

Modifizieren Sie bitte Ihre Frage die tatsächliche Fehlermeldung enthalten. Die Art, wie ZF2 funktioniert, bindet ein Objekt/eine Entität an Ihr Formular, und dann stellt der zugewiesene Hydrator sicher, dass die referenzierten Formularfelder entsprechend zugeordnet werden. Dies ist tatsächlich ein sehr einfacher Anwendungsfall und eine gute Trennung von Bedenken, da Fehlermeldungen Sie immer wissen, wo Sie suchen. – Sam

Antwort

14

Für Zend \ Formular Ihr Unternehmen Sie so etwas in Ihrer Entity-Klasse haben, müssen in der Lage, feuchtigkeitsspend:

public function getArrayCopy() 
{ 
    return get_object_vars($this); 
} 
+1

Automatischer Hydrationszauber, ZF2-Stil. Einfache Lernkurve ... –

+1

War fasziniert von der Funktion get_object_vars. Referenz: [get_object_vars] (http://php.net/manual/en/function.get-object-vars.php) - "Ruft die zugreifbaren nicht statischen Eigenschaften des angegebenen Objekts gemäß dem Bereich ab." –

+1

Für klarer, fügen wir obige Methode zu dieser Datei hinzu: '\ zf2-tutorial \ module \ Album \ src \ Album \ Model \ Album.php'. –

1

I Verwenden Sie die populate-Methode in meiner Entitätsklasse. so etwas wie dies

public function populate($data = array()) 
    { 
     $this->id = (isset($data['id'])) ? $data['id'] : null; 
     $this->username = (isset($data['username'])) ? $data['username'] : null; 
     $this->pass = (isset($data['pass'])) ? $data['pass'] : null;    

    } 

und dann in der Steuerung können Sie mit Funktion so etwas wie diese füllen.

$user = new User(); 
$request = $this->getRequest(); 
$user->populate($request->getPost()); 

Ich bin mir nicht sicher, ob ich Ihre Frage richtig verstehe.

+0

Grundsätzlich beziehen sich meine Fragen auf eine editAction(). Ich möchte, dass Benutzer die Informationen, die sie bereits veröffentlicht haben, natürlich bearbeiten können. Ich habe einige Nachforschungen angestellt und festgestellt, dass Zend eine bind() -Methode verwendet, die Daten aus meiner Entität zieht und das zu bearbeitende Formular auffüllt. Momentan mache ich etwas wie $ form = new Form(); $ form-> bind ($ Entität). Meine $ -Entität verwendet den getServiceLocator() von Doctrne2 und ich erstelle eine Abfrage mit getQueryBuilder(). Wenn ich zu meiner editAction navigiere, erhalte ich den folgenden Fehler: Zend \ Stdlib \ Hydrator \ ArraySerializable :: extract erwartet das bereitgestellte Objekt zu implementieren getArrayCopy() – bl4design

1

Glücklicherweise brauchen Sie nichts mehr in Ihrem Wesen, wenn Sie dieses Tutorial folgen:

http://samminds.com/2012/07/a-blog-application-part-1-working-with-doctrine-2-in-zend-framework-2/ ich fast die gleiche Methode verwenden, und es ist (fast) gut funktioniert. Zwei Dinge, die Sie beachten sollten:

1.) Stellen Sie sicher, dass Sie alle Daten in Ihren Tabellen validieren (oder zumindest die nicht null), da nur validierte Felder an die Datenbank gesendet werden. Es wurde mir vom Autor dieses Blogs gesagt. :)

2.) Wenn Sie die Ansicht für das Bearbeiten-Formular erstellen, fügen Sie die ID auf der Route:

$form->setAttribute('action', $this->url('post', 
        array('action'=>'add', 'id'=>"$this->id")))->prepare(); 

Viel Glück!

2

in Ihnen .../Model/XXXXTable.php
definieren eine Funktion wollen um einen Rekord zu bekommen.

$id = (int)$id; 
    $row = $this->tableGateway->select(array('id'=>$id)); 
    $row = $row->current(); //this line is very important 
+0

danke, wirklich meine Stunden gerettet. –

2

Ich verwende den folgenden Code an module.config.php Lehre Hydrator verwenden

$form = new ...; 
$dm = $sm->get('doctrine.documentmanager.odm_default'); 
$form->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($dm)); 
return $form; 
Verwandte Themen