• 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

Formular mit Doctrine speichert Relation nicht

rob5

New member
Hallo,

ich steige grad in Zend3 ein und stehe vor dem Problem das mein Formular mit einer Beziehung zu einem anderen Model einfach nicht gespeichert wird.

Ich musste die Annotations entfernen, da das Board mir sonst den Fehler gab: Post denied. New posts are limited by number of URLs it may contain and checked if it doesn't contain forbidden words.

Ich habe Kategorien die Einträge enthalten können.


PHP:
class Category extends AbstractEntity
{
    use Nameable;


     private $issue;

     private $entries;
}


PHP:
class Entry extends AbstractEntity
{
    use Nameable;

    private $amount;

    protected $category;
 
    private $dateOfEntry;
}
Das Fieldset sieht wie folgt aus:

PHP:
class EntryFieldSet extends Fieldset
{
    public function init()
    {
        $this->add([
            'name' => 'id',
            'type' => Hidden::class
        ]);

        $this->add([
            'name' => 'name',
            'type' => Text::class,
            'options' => [
                'label' => 'Name'
            ]
        ]);

        $this->add([
            'name' => 'amount',
            'type' => Number::class,
            'options' => [
                'label' => 'Summe'
            ]
        ]);

        $this->add([
            'name' => 'date_of_entry',
            'type' => Date::class,
            'options' => [
                'label' => 'Datum'
            ]
        ]);

        $this->add([
            'name' => 'category',
            'required' => false,
            'type' => ObjectSelect::class,
            'options' => [
                'target_class' => Category::class,
            ]
        ]);

        parent::init();
    }
}
Und der Filter um die Parameter zu konvertieren (ähnlich den ParamConverter in SF)

PHP:
class EntryFieldSetFilter extends InputFilter
{
    protected $mapper;

    public function __construct(MapperInterface $mapper)
    {
        $this->mapper = $mapper;
    }

    public function init()
    {
        $this->add([
            'name' => 'name',
            'required' => true,
            'filters' => [
                ['name' => StringTrim::class]
            ],
            'validators' => [
                [
                    'name' => StringLength::class,
                    'options' => [
                        'min' => 5
                    ]
                ]
            ]
        ]);

        $this->add([
            'name' => 'date_of_entry',
            'required' => true,
            'filters' => [
                [
                    'name' => Callback::class,
                    'options' => [
                        'callback' => [$this, 'convertStringToDate']
                    ]
                ]
            ]
        ]);

        $this->add([
            'name' => 'category',
            'required' => true,
            'filters' => [
                [
                    'name' => Callback::class,
                    'options' => [
                        'callback' => [$this, 'loadCategory']
                    ]
                ]
            ]
        ]);
    }

    public function convertStringToDate(string $date)
    {
        return new \DateTime($date);
    }

    public function loadCategory(string $categoryId)
    {
        // PHP Notice:  Object of class CashJournal\Model\Category could not be converted to int in
        return $this->mapper->find($categoryId);
    }
}
Ich nutze Doctrine2 und das speichern ohne Relation funktioniert fehlerfrei.
Mit dem Filter bricht Zend mit der Fehlermeldung:

PHP Notice: Object of class CashJournal\Model\Category could not be converted to int in

ab. Lasse ich alles so, wird das speichern ebenfalls verwehrt mittels "The input is not a valid step".

Der Setter bei der Entry Entity erwartet allerdings ein Category Object. Der Filter sollte doch dafür die richtige Stelle sein, oder?
Der Mapper leitet die Daten direkt an den EntityManager weiter und führt ein persist() und flush() aus.

Wie bekomme ich das Formular zum laufen, oder habe ich hier einen falschen Ansatz?
 

Kaiuwe

Super-Moderator
Willkommen im Forum! :)

ich steige grad in Zend3…
Ich finde es spannend, woher immer diese Namen kommen? „Zend3“ ist mir zumindest nicht bekannt! :confused:

(Es ist und bleibt „Zend Framework“ oder kurz „ZF“ ;))


Das Fieldset sieht wie folgt aus:

PHP:
class EntryFieldSet extends Fieldset
{
        $this->add([
            'name' => 'category',
            'required' => false,
            'type' => ObjectSelect::class,
            'options' => [
                'target_class' => Category::class,
            ]
        ]);
    }
}
Leider kann ich dir hier nicht folgen, denn die Option „target_class“ gibt es in zend-form nicht.

Und der Filter um die Parameter zu konvertieren (ähnlich den ParamConverter in SF)
Ähnlich dem „ParamConverter“ im Symfony Framework? Eher nicht, denn der Konverter in SF wandelt Parameter von HTTP-Anfragen in Objekte. Der Input-Filter im ZF prüft und filtert Werte die übergeben werden, die Quelle ist dabei egal. Der Input-Filter ist damit nicht auf HTTP-Anfragen beschränkt und konvertiert auch nicht zwangsläufig; auch nicht in ein Objekt.

Lasse ich alles so, wird das speichern ebenfalls verwehrt mittels "The input is not a valid step".
Die Meldung kommt vom Validator „Step“, welcher bei dir im Feld „amount“ hinzugefügt wird.
 

rob5

New member
Hallo Kaiuwe,

danke für Hilfe. Ich habe das Problem gefunden. ;)

Ich wollte mit einem Konverter die Parameter in Objekte umwandeln, weil es scheinbar durch doctrine nicht geschehen ist.
Das war aber ein Irrtum. Ich habe einen falschen Hydrator genutzt. Mein Testprojekt ist vom kleinen Hello-World gewachsen und dieses Detail habe ich dann gekonnt ignoriert.:rolleyes:

Ich habe dummerweise hier die Factory nicht gepostet. Vielmehr weil ich den Fehler woanders vermutet hatte.


PHP:
$fieldSet->setHydrator(            new DoctrineObject($entityManager)                               );

Hier hatte ich als Hydrator

PHP:
new Classmethods()
stehen.

Den Step habe ich auf "any" gesetzt. Damit ist die Meldung auch passè. Nun ist das Verhalten so wie ich es erwarte :D
 
Oben