• 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

Entities verbinden

fitti70

New member
Hallo zusammen,

folgende Annahme:
- Ich habe eine Form mit zwei Fieldsets, die jeweils eine Tabelle repräsentieren.
- Die Daten der Tabelle lese ich mit je einem Tabellen-Gateway aus und erhalte zwei Result-Entities.
- Diese beiden Entities möchte ich nun an eine Form binden, sodass sie mit den Fieldsets matchen.

Funktioniert das irgendwie?

Viele Grüße,
fitti
 

Kaiuwe

Super-Moderator
Ich habe eine Form mit zwei Fieldsets, die jeweils eine Tabelle repräsentieren.
Du meinst, die „Fieldsets“ repräsentieren jeweils ein Datensatz aus der Datenbanktabelle. Richtig?

Diese beiden Entities möchte ich nun an eine Form binden, sodass sie mit den Fieldsets matchen.
Wenn du mal in den Quellcode von „Zend\Form“ schaust, dann wirst du feststellen, dass ein Objekt nicht an das Formular, sondern an ein „Fieldset“ gebunden wird.
Und wenn du zwei „Fieldset“ und zwei Objekte hast, dann dürfte damit deine Frage beantwortet sein. :D
 
Zuletzt bearbeitet:

fitti70

New member
Hallo,

erstmal Danke für die Antwort und sorry, dass ich erst jetzt reagiere. Ich wurde gar nicht informiert.

Zum Thema: die Objekte lassen sich zwar an die Fieldsets binden, aber die Values werden nicht übernommen. Ich komme einfach nicht weiter. Wie kann ich aus der Datenbank vorgegebene Werte an Fieldsets übergeben?

VG
Fitti
 

Kaiuwe

Super-Moderator
die Objekte lassen sich zwar an die Fieldsets binden, aber die Values werden nicht übernommen. Ich komme einfach nicht weiter.
Veröffentliche doch mal bitte ein Beispiel mit Formular und deinen Objekten, damit es nachvollziehen kann. Es ist sehr mühselig alles selbst nachzubauen.
 

fitti70

New member
Also zunächst einmal initialisiere ich zwei Fieldsets. Es handelt sich erstens um die Basisdaten von Mitgliedern, die in einer separaten Tabelle gespeichert werden.
Eine weitere Tabelle enthält zweitens (optional) die Daten für eine jeweilige Microsite.
Die Objekte, die mit setObjects an die Fieldsets gebunden werden, enthalten bereits alle Daten aus der Datenbank.
Das Formular verknüpft die Daten aber leider nicht als Values für die Elemente der Fieldsets.
Mit $form->bind() könnte ich zwar Daten zuweisen, aber eben nur einmal (also nur ein Objekt bzw. Entity).
Wo ist mein Denkfehler?
Code:
[B]public function [/B]getMemberFormFromDatabase($id)
{
    $microFieldset = [B]new [/B]MicropageFieldset([B]'micropage'[/B]);
    $memberFieldset = [B]new [/B]MemberFieldset([B]'member'[/B]);
 $memberObject = $this->getMemberTable()->fetchSingleById($id); 
$microObject = $this->getMicropageTable()->fetchSingleByMemberId($memberObject->getMitgliedId()); 
$microObject = ($microObject) ? $microObject : [B]new [/B]ClassMethods(); 
$microFieldset->setHydrator([B]new [/B]Reflection())     ->setObject($microObject);
$memberFieldset->setHydrator([B]new [/B]Reflection())     ->setObject($memberObject); 
$form = [B]new [/B]MemberAssembleForm(); 
$form->add($memberFieldset); 
$form->add($microFieldset);return $form;}
VG fitti
 
Zuletzt bearbeitet:

Kaiuwe

Super-Moderator
Mit $form->bind() könnte ich zwar Daten zuweisen, aber eben nur einmal (also nur ein Objekt bzw. Entity).
Wo ist mein Denkfehler?
Schau dir mal folgenden Code an, dann wirst du feststellen, dass noch ein paar Schritte fehlen:

Objekte und Container:
PHP:
class Micro
{
    private $foo;

    public function getFoo()
    {
        return $this->foo;
    }

    public function setFoo($foo)
    {
        $this->foo = $foo;
    }
}

class Member
{
    private $bar;

    public function getBar()
    {
        return $this->bar;
    }

    public function setBar($bar)
    {
        $this->bar = $bar;
    }
}

class Container
{
    public $mircoFieldset;

    public $memberFieldset;
}

// Objects
$micro = new Micro();
$micro->setFoo('123');

$member = new Member();
$member->setBar('456');

$container                 = new Container();
$container->mircoFieldset  = $micro;
$container->memberFieldset = $member;
Formular und Fieldsets:
PHP:
// Form
$form = new \Zend\Form\Form();
$form->setHydrator(new \Zend\Stdlib\Hydrator\ObjectProperty());
$form->bind($container);

// Hydrator
$hydrator = new \Zend\Stdlib\Hydrator\ClassMethods();

// Fieldset
$fieldset1 = new \Zend\Form\Fieldset('mircoFieldset');
$fieldset1->add(
    [
        'name' => 'foo',
        'type' => 'text',
    ]
);
$fieldset1->setObject(new Micro());
$fieldset1->setHydrator($hydrator);

$form->add($fieldset1);

// Fieldset
$fieldset2 = new \Zend\Form\Fieldset('memberFieldset');
$fieldset2->add(
    [
        'name' => 'bar',
        'type' => 'text',
    ]
);
$fieldset2->setObject(new Member());
$fieldset2->setHydrator($hydrator);

$form->add($fieldset2);
Formular befüllen nach dem es abgesendet wurde:
PHP:
if (count($_POST)) {
    /*
    Post sieht so aus:
    $_POST = [
        'mircoFieldset'  => ['foo' => 'abc'],
        'memberFieldset' => ['bar' => 'def'],
    ];*/

    // Validation
    $form->setData($_POST);
    $form->isValid();
}
Ausgabe:
PHP:
var_dump($container);
var_dump($fieldset1->getObject());
var_dump($fieldset2->getObject());
Ergibt:
Code:
object(Container)[4]
  private 'mircoFieldset' => 
    object(Micro)[31]
      private 'foo' => string 'abc' (length=3)
  private 'memberFieldset' => 
    object(Member)[38]
      private 'bar' => string 'def' (length=3)
object(Micro)[31]
  private 'foo' => string 'abc' (length=3)
object(Member)[38]
  private 'bar' => string 'def' (length=3)
Es entspricht dem Prinzip, wie es in der Doku beschrieben ist.

(Eventuell habe ich noch etwas übersehen, aber momentan steht mir leider keine ordentliche IDE zur Verfügung.)
 
Zuletzt bearbeitet:

fitti70

New member
Ich glaube, du hast mein Problem nicht verstanden oder ich stehe total auf dem Schlauch. Also in dem Beispiel werden die Values über setData() zugewiesen. In meinem letzten Post meinte ich übrigens auch $form->setData(), und nicht bind().

Jetzt mal konkret nachgefragt:
Kann ich den Fieldset Objekten direkt Values zuweisen (also nicht über form-setData())? Wenn ja, wie? Über $fieldset->setObject() scheint es jedenfalls nicht zu klappen.

$fieldset->bindValues() akzeptiert nur Arrays. Ich habe es noch nicht probiert, vielleicht klappt es so. Dann müsste ich aber das Entity Objekt in ein Array extrahieren, damit es nachher wieder vom Fieldset in ein Objekt umgewandelt wird. Das kann es eigentlich auch nicht sein, oder?
Viele Grüße,
fitti
 
Zuletzt bearbeitet:

Kaiuwe

Super-Moderator
Ich glaube, du hast mein Problem nicht verstanden oder ich stehe total auf dem Schlauch.
Ich denke schon.

Also in dem Beispiel werden die Values über setData() zugewiesen.
Leider falsch! Die Objekte „Micro“ und „Member“ haben schon Werte und diese werden mit „bind“, per Container-Objekt, an das Formular gebunden. Formular ist ausgefüllt.

Kann ich den Fieldset Objekten direkt Values zuweisen (also nicht über form-setData())? Wenn ja, wie? Über $fieldset->setObject() scheint es jedenfalls nicht zu klappen.
Brauchst du doch nicht, denn die Daten sind bereits schon da!

Dann müsste ich aber das Entity Objekt in ein Array extrahieren, damit es nachher wieder vom Fieldset in ein Objekt umgewandelt wird. Das kann es eigentlich auch nicht sein, oder?
Die Überlegung brauchst du nicht!

„$form->setData“ wird erst nach dem Absenden eines Formulars benötigt. (Ich habe es oben nochmals verdeutlicht!)
 
Zuletzt bearbeitet:

fitti70

New member
Das heißt, es fehlt einfach nur das Container Objekt?
Es klappt aber noch nicht ganz. Ich probiere noch mal weiter und melde mich dann.

Übrigens schon mal tausend Dank bis hierhin. O

VG
Fitti
 
Zuletzt bearbeitet:

fitti70

New member
Es klappt leider immer noch nicht, das Problem
bleibt das gleiche.
var_dump gekürzt:
Code:
object(Admin\Form\MemberAssembleForm)#381 (29) {
  ["attributes":protected]=>
  array(2) {
    ["method"]=>
    string(4) "POST"
    ["name"]=>
    string(15) "member-assemble"
  }
  ["bindAs":protected]=>
  int(17)
  ["bindOnValidate":protected]=>
  int(0)
  ["baseFieldset":protected]=>
  object(Admin\Form\MicropageFieldset)#337 (15) {
    ["factory":protected]=>
    NULL
    ["elements":protected]=>
    array(4) {
      ["tick"]=>
      object(Zend\Form\Element\Csrf)#412 (9) {
        ["attributes":protected]=>
        array(2) {
          ["type"]=>
          string(6) "hidden"
          ["name"]=>
          string(4) "tick"
        }
        ["csrfValidatorOptions":protected]=>
        array(0) {
        }
        ["csrfValidator":protected]=>
        NULL
        ["label":protected]=>
        NULL
        ["labelAttributes":protected]=>
        array(0) {
        }
        ["labelOptions":protected]=>
        array(0) {
        }
        ["messages":protected]=>
        array(0) {
        }
        ["options":protected]=>
        array(0) {
        }
        ["value":protected]=>
        NULL
      }
      ["text"]=>
      object(Zend\Form\Element\Textarea)#409 (7) {
        ["attributes":protected]=>
        array(3) {
          ["type"]=>
          string(8) "textarea"
          ["name"]=>
          string(4) "text"
          ["class"]=>
          string(8) "ckeditor"
        }
        ["label":protected]=>
        string(9) "Anreißer"
        ["labelAttributes":protected]=>
        array(0) {
        }
        ["labelOptions":protected]=>
        array(0) {
        }
        ["messages":protected]=>
        array(0) {
        }
        ["options":protected]=>
        array(0) {
        }
        ["value":protected]=>
        NULL
      }
      ["active"]=>
      object(Zend\Form\Element\Checkbox)#410 (11) {
        ["attributes":protected]=>
        array(3) {
          ["type"]=>
          string(8) "checkbox"
          ["name"]=>
          string(6) "active"
          ["class"]=>
          string(9) "col-xs-12"
        }
        ["validator":protected]=>
        NULL
        ["useHiddenElement":protected]=>
        bool(true)
        ["uncheckedValue":protected]=>
        string(1) "0"
        ["checkedValue":protected]=>
        string(1) "1"
        ["label":protected]=>
        string(5) "Aktiv"
        ["labelAttributes":protected]=>
        array(0) {
        }
        ["labelOptions":protected]=>
        array(0) {
        }
        ["messages":protected]=>
        array(0) {
        }
        ["options":protected]=>
        array(0) {
        }
        ["value":protected]=>
        NULL
      }
      ["langtext"]=>
      object(Zend\Form\Element\Textarea)#411 (7) {
        ["attributes":protected]=>
        array(3) {
          ["type"]=>
          string(8) "textarea"
          ["name"]=>
          string(8) "langtext"
          ["class"]=>
          string(8) "ckeditor"
        }
        ["label":protected]=>
        string(12) "Beitragstext"
        ["labelAttributes":protected]=>
        array(0) {
        }
        ["labelOptions":protected]=>
        array(0) {
        }
        ["messages":protected]=>
        array(0) {
        }
        ["options":protected]=>
        array(0) {
        }
        ["value":protected]=>
        NULL
      }
    }
    ["fieldsets":protected]=>
    array(0) {
    }
Code:
  ["object":protected]=>  object(Admin\Form\Container)#389 (18) {
    ["microFiledset"]=>
    NULL
    ["memberFieldset"]=>
    NULL
    ["factory":protected]=>
    NULL
    ["elements":protected]=>
    array(0) {
    }
    ["fieldsets":protected]=>
    array(0) {
    }
    ["messages":protected]=>
    array(0) {
    }
    ["iterator":protected]=>
    NULL
    ["hydrator":protected]=>
    NULL
    ["object":protected]=>
    NULL
    ["useAsBaseFieldset":protected]=>
    bool(false)
    ["allowedObjectBindingClass":protected]=>
    NULL
    ["attributes":protected]=>
    array(0) {
    }
    ["label":protected]=>
    NULL
    ["labelAttributes":protected]=>
    array(0) {
    }
    ["labelOptions":protected]=>
    array(0) {
    }
    ["options":protected]=>
    array(0) {
    }
    ["value":protected]=>
    NULL
    ["mircoFieldset"]=>
    object(Admin\Model\MicropageEntity)#417 (5) {
      ["id":protected]=>
      string(1) "1"
      ["mitlgieder_2_id":protected]=>
      NULL
      ["text":protected]=>
      string(25) "Wir bringen Sie gro� raus"
      ["langtext":protected]=>
      string(1145) "
Es gibt im Moment in diese Mannschaft, oh, einige Spieler vergessen ihnen Profi was sie sind. Ich lese nicht sehr viele Zeitungen, aber ich habe geh�rt viele Situationen. Erstens: wir haben nicht offensiv gespielt. Es gibt keine deutsche Mannschaft spielt offensiv und die Name offensiv wie Bayern.
..."
      ["active":protected]=>
      string(1) "1"
    }
  }
  ["useAsBaseFieldset":protected]=>
  bool(false)
  ["allowedObjectBindingClass":protected]=>
  NULL
  ["label":protected]=>
  NULL
  ["labelAttributes":protected]=>
  array(0) {
  }
  ["labelOptions":protected]=>
  array(0) {
  }
  ["options":protected]=>
  array(0) {
  }
  ["value":protected]=>
  NULL
}
 

fitti70

New member
Es klappt aber auch nicht, wenn es nicht als basefieldset definiert ist.
Hier mal der dump Ausschnit eines gekürzten Formulars. Das angehängte Objekt enthält alle Werte, im Formular werden sie aber nicht als value übernommen.
Code:
object(Admin\Form\MemberAssembleForm)#381 (29) {
  ["attributes":protected]=>
  array(2) {
    ["method"]=>
    string(4) "POST"
    ["name"]=>
    string(15) "member-assemble"
  }
  ["bindAs":protected]=>
  int(17)
  ["bindOnValidate":protected]=>
  int(0)
  ["baseFieldset":protected]=>
  NULL
  ["data":protected]=>
  NULL
  ["filter":protected]=>
  NULL
  ["useInputFilterDefaults":protected]=>
  bool(true)
  ["hasAddedInputFilterDefaults":protected]=>
  bool(false)
  ["hasValidated":protected]=>
  bool(false)
  ["isValid":protected]=>
  bool(false)
  ["isPrepared":protected]=>
  bool(false)
  ["preferFormInputFilter":protected]=>
  bool(true)
  ["hasSetPreferFormInputFilter":protected]=>
  bool(false)
  ["wrapElements":protected]=>
  bool(false)
  ["validationGroup":protected]=>
  NULL
  ["factory":protected]=>
  NULL
  ["elements":protected]=>
  array(0) {
  }
  ["fieldsets":protected]=>
  array(1) {
    ["micropage"]=>
    object(Admin\Form\MicropageFieldset)#337 (15) {
      ["factory":protected]=>
      NULL
      ["elements":protected]=>
      array(2) {
        ["text"]=>
        object(Zend\Form\Element\Textarea)#408 (7) {
          ["attributes":protected]=>
          array(3) {
            ["type"]=>
            string(8) "textarea"
            ["name"]=>
            string(4) "text"
            ["class"]=>
            string(8) "ckeditor"
          }
          ["label":protected]=>
          string(9) "Anreißer"
          ["labelAttributes":protected]=>
          array(0) {
          }
          ["labelOptions":protected]=>
          array(0) {
          }
          ["messages":protected]=>
          array(0) {
          }
          ["options":protected]=>
          array(0) {
          }
          ["value":protected]=>
          NULL
        }
        ["langtext"]=>
        object(Zend\Form\Element\Textarea)#409 (7) {
          ["attributes":protected]=>
          array(3) {
            ["type"]=>
            string(8) "textarea"
            ["name"]=>
            string(8) "langtext"
            ["class"]=>
            string(8) "ckeditor"
          }
          ["label":protected]=>
          string(12) "Beitragstext"
          ["labelAttributes":protected]=>
          array(0) {
          }
          ["labelOptions":protected]=>
          array(0) {
          }
          ["messages":protected]=>
          array(0) {
          }
          ["options":protected]=>
          array(0) {
          }
          ["value":protected]=>
          NULL
        }
      }
      ["fieldsets":protected]=>
      array(0) {
      }
      ["messages":protected]=>
      array(0) {
      }
      ["iterator":protected]=>
      object(Zend\Stdlib\PriorityList)#265 (5) {
        ["items":protected]=>
        array(2) {
          ["text"]=>
          array(3) {
            ["data"]=>
            object(Zend\Form\Element\Textarea)#408 (7) {
              ["attributes":protected]=>
              array(3) {
                ["type"]=>
                string(8) "textarea"
                ["name"]=>
                string(4) "text"
                ["class"]=>
                string(8) "ckeditor"
              }
              ["label":protected]=>
              string(9) "Anreißer"
              ["labelAttributes":protected]=>
              array(0) {
              }
              ["labelOptions":protected]=>
              array(0) {
              }
              ["messages":protected]=>
              array(0) {
              }
              ["options":protected]=>
              array(0) {
              }
              ["value":protected]=>
              NULL
            }
            ["priority"]=>
            int(0)
            ["serial"]=>
            int(0)
          }
          ["langtext"]=>
          array(3) {
            ["data"]=>
            object(Zend\Form\Element\Textarea)#409 (7) {
              ["attributes":protected]=>
              array(3) {
                ["type"]=>
                string(8) "textarea"
                ["name"]=>
                string(8) "langtext"
                ["class"]=>
                string(8) "ckeditor"
              }
              ["label":protected]=>
              string(12) "Beitragstext"
              ["labelAttributes":protected]=>
              array(0) {
              }
              ["labelOptions":protected]=>
              array(0) {
              }
              ["messages":protected]=>
              array(0) {
              }
              ["options":protected]=>
              array(0) {
              }
              ["value":protected]=>
              NULL ..
[...]

      }
      ["hydrator":protected]=>
      object(Zend\Stdlib\Hydrator\Reflection)#417 (3) {
        ["strategies":protected]=>
        object(ArrayObject)#292 (1) {
          ["storage":"ArrayObject":private]=>
          array(0) {
          }
        }
        ["namingStrategy":protected]=>
        NULL
        ["filterComposite":protected]=>
        object(Zend\Stdlib\Hydrator\Filter\FilterComposite)#293 (2) {
          ["orFilter":protected]=>
          object(ArrayObject)#416 (1) {
            ["storage":"ArrayObject":private]=>
            array(0) {
            }
          }
          ["andFilter":protected]=>
          object(ArrayObject)#420 (1) {
            ["storage":"ArrayObject":private]=>
            array(0) {
            }
          }
        }
      }
      ["object":protected]=>
      object(Admin\Model\MicropageEntity)#266 (2) {
        ["text":protected]=>
        NULL
        ["langtext":protected]=>
        NULL
      }
      ["useAsBaseFieldset":protected]=>
      bool(false)
      ["allowedObjectBindingClass":protected]=>
      NULL
      ["attributes":protected]=>
      array(1) {
        ["name"]=>
        string(9) "micropage"
      }
      ["label":protected]=>
      NULL
      ["labelAttributes":protected]=>
      array(0) {
      }
      ["labelOptions":protected]=>
      array(0) {
      }
      ["options":protected]=>
      array(0) {
      }
      ["value":protected]=>
      NULL
    }
  }
          ["object":protected]=>
          object(Admin\Model\MicropageEntity)#266 (2) {
            ["text":protected]=>
            NULL
            ["langtext":protected]=>
            NULL
          }
          ["useAsBaseFieldset":protected]=>
          bool(false)
          ["allowedObjectBindingClass":protected]=>
          NULL
          ["attributes":protected]=>
          array(1) {
            ["name"]=>
            string(9) "micropage"
          }
          ["label":protected]=>
          NULL
          ["labelAttributes":protected]=>
          array(0) {
          }
          ["labelOptions":protected]=>
          array(0) {
          }
          ["options":protected]=>
          array(0) {
          }
          ["value":protected]=>
          NULL
        }
        ["priority"]=>
        int(0)
        ["serial"]=>
        int(0)
      }
    }
    ["serial":protected]=>
    int(1)
    ["isLIFO":protected]=>
    int(-1)
    ["count":protected]=>
    int(1)
    ["sorted":protected]=>
    bool(false)
  }
  ["hydrator":protected]=>
  object(Zend\Stdlib\Hydrator\ObjectProperty)#383 (3) {
    ["strategies":protected]=>
    object(ArrayObject)#385 (1) {
      ["storage":"ArrayObject":private]=>
      array(0) {
      }
    }
    ["namingStrategy":protected]=>
    NULL
    ["filterComposite":protected]=>
    object(Zend\Stdlib\Hydrator\Filter\FilterComposite)#391 (2) {
      ["orFilter":protected]=>
      object(ArrayObject)#384 (1) {
        ["storage":"ArrayObject":private]=>
        array(0) {
        }
      }
      ["andFilter":protected]=>
      object(ArrayObject)#390 (1) {
        ["storage":"ArrayObject":private]=>
        array(0) {
        }
      }
    }
  }
  ["object":protected]=>
  object(Admin\Form\Container)#389 (18) {
    ["microFiledset"]=>
    NULL
    ["memberFieldset"]=>
    NULL
    ["factory":protected]=>
    NULL
    ["elements":protected]=>
    array(0) {
    }
    ["fieldsets":protected]=>
    array(0) {
    }
    ["messages":protected]=>
    array(0) {
    }
    ["iterator":protected]=>
    NULL
    ["hydrator":protected]=>
    NULL
    ["object":protected]=>
    NULL
    ["useAsBaseFieldset":protected]=>
    bool(false)
    ["allowedObjectBindingClass":protected]=>
    NULL
    ["attributes":protected]=>
    array(0) {
    }
    ["label":protected]=>
    NULL
    ["labelAttributes":protected]=>
    array(0) {
    }
    ["labelOptions":protected]=>
    array(0) {
    }
    ["options":protected]=>
    array(0) {
    }
    ["value":protected]=>
    NULL
    ["mircoFieldset"]=>
    object(Admin\Model\MicropageEntity)#415 (2) {
      ["text":protected]=>
      string(25) "Wir bringen Sie gro� raus"
      ["langtext":protected]=>
      string(305) "
Es gibt im Moment in diese Mannschaft, oh, einige Spieler vergessen ihnen Profi was sie sind. Ich lese nicht sehr viele Zeitungen, aber ich habe geh�rt viele Situationen. Erstens: wir haben nicht offensiv gespielt. Es gibt keine deutsche Mannschaft spielt offensiv und die Name offensiv wie Bayern.
"
    }
  }
  ["useAsBaseFieldset":protected]=>
  bool(false)
  ["allowedObjectBindingClass":protected]=>
  NULL
  ["label":protected]=>
  NULL
  ["labelAttributes":protected]=>
  array(0) {
  }
  ["labelOptions":protected]=>
  array(0) {
  }
  ["options":protected]=>
  array(0) {
  }
  ["value":protected]=>
  NULL
}
 

Kaiuwe

Super-Moderator
Es klappt aber auch nicht, wenn es nicht als basefieldset definiert ist.
Wenn ich das richtig sehe, dann hast du dir mein Beispiel nicht genau angeschaut:

  • Formular hat zwei Fieldsets mit jeweils eigenen Elementen
  • Container-Objekt hat zwei Eigenschaften mit jeweils eigenen Objekten und ihren Eigenschaften
Es erfolgt also ein Abbilden der Objekten auf das Formular mit Fieldsets. Dabei müssen natürlich die Namen passen:

  • die Namen der Eigenschaften des Container-Objekts entsprechen den Namen der Fieldsets
  • die Namen der Eigenschaften der untergeordneten Objekten entsprechen den Namen der Formularfelder
Bei dir stimmt dies aber nicht, denn dein erstes Fieldset heißt „micropage“, aber im Container-Objekt heißt die Eigenschaft „microFiledset“.

Schau daher bitte nochmals nach und vergleiche, nicht das ich etwas falsch herausgelesen habe.
 

fitti70

New member
Die Änderung der Namen hat mich hier leider auch nicht weiter gebracht.
Zur Vereinfachung und Fehlersuche nutze ich nur noch ein gekürztes Fieldset mit zwei Elementen und entsprechendem Entity.
Code:
use Zend\Form\Element\Text;
use Zend\Form\Element\Textarea;
use Zend\Form\Fieldset;




class MicropageFieldset extends Fieldset implements MicropageFieldsetInterface
{


    public function __construct($name, $options = array())
    {
        parent::__construct($name, $options);
            }




    public function initializeBase()
    {


        $this->addTextElement();
        $this->addLangtextElement();


    }


        /**
     * Add title element
     */


    public function addTextElement($name = 'text')
    {
        $element = new Textarea($name);
        $element->setLabel('Anreißer');
        $element->setAttribute('class', 'ckeditor');
        $this->add($element);
    }


    /**
     * Add content element
     */
    public function addLangtextElement($name = 'langtext')
    {
        $element = new Textarea($name);
        $element->setLabel('Beitragstext');
        $element->setAttribute('class', 'ckeditor');
        $this->add($element);
    }








}
Das Entity sieht entsprechend aus:
Code:
class Micro implements  MicropageEntityInterface {






    protected $text;


    protected $langtext;




    public function setText($text)
    {
        $this->text = $text;
    }




    public function getText()
    {
        return $this->text;
    }


    /**
     * Set Langtext
     *
     * @param string $langtext
     */
    public function setLangtext($langtext)
    {
        $this->langtext = $langtext;
    }


    /**
     * Get Langtext
     *
     * @return string $langtext
     */
    public function getLangtext()
    {
        return $this->langtext;
    }


}
Das Entity wird mir Daten gefüttert.
Code:
$micropageEntity = $this->getMicropageTable()->fetchSingleByMemberId($memberEntity->getMitgliedId());
Das Containerobjekt bekommt die Daten; Fieldset wird initialisiert und übergeben.
Code:
$micropageFieldset = new MicropageFieldset('micropageFieldset');
$micropageFieldset->initializeBase();


$micropageFieldset->setHydrator(new ObjectProperty())
    ->setObject(new Micro());


class Container
{
    public $micropageFieldset;
    public $memberFieldset;


}


$form = new MemberAssembleForm();
        $form->setHydrator(new \Zend\Stdlib\Hydrator\ObjectProperty());


        $container                 = new Container();


        $container->micropageFieldset  = $micropageEntity;
        //$container->memberFieldset = $memberObject;
        $form->bind($container);
        $form->add($micropageFieldset);
        //$form->add($memberFieldset);
echo "<pre>";
        var_dump($container);
        var_dump($micropageFieldset->getObject());
        var_dump($form->get('micropageFieldset')->get('langtext'));
        echo "</pre>";
        return $form;
    }
--------


Ausgabe:
object(Admin\Form\Container)#372 (2) {
  ["micropageFieldset"]=>
  object(Admin\Model\Micro)#398 (2) {
    ["text":protected]=>
    string(25) "Wir bringen Sie gro� raus"
    ["langtext":protected]=>
    string(4) "TEST"
  }
  ["memberFieldset"]=>
  NULL
}
object(Admin\Model\Micro)#404 (2) {
  ["text":protected]=>
  NULL
  ["langtext":protected]=>
  NULL
}
object(Zend\Form\Element\Textarea)#392 (7) {
  ["attributes":protected]=>
  array(3) {
    ["type"]=>
    string(8) "textarea"
    ["name"]=>
    string(8) "langtext"
    ["class"]=>
    string(8) "ckeditor"
  }
  ["label":protected]=>
  string(12) "Beitragstext"
  ["labelAttributes":protected]=>
  array(0) {
  }
  ["labelOptions":protected]=>
  array(0) {
  }
  ["messages":protected]=>
  array(0) {
  }
  ["options":protected]=>
  array(0) {
  }
  ["value":protected]=>
  NULL
}
Steckt hier irgendwo ein Fehler?


Hast du deinen Code eigentlich getestet?
VG
fitti
 

fitti70

New member
Nachdem ich dein Beispiel 1:1 übernommen habe und den Code schrittweise angepasst habe, konnte ich das Problem einkreisen und letztlich lokalisieren.
Es muss bei getter- und setter-Entities an beiden Stellen, also sowohl beim Formular als auch beim Fieldset, der entsprechende Hydrator benutzt werden (in meinem Fall Reflection).
Vielen Dank für die Hilfe. Zu dem Thema findet man im Netz fast gar nichts Auch Ralf Eggert hat Fieldsets eher spärlich behandelt, deshalb bin ich sehr dankbar für die Hilfe.
VG
fitti
 

Kaiuwe

Super-Moderator
Es muss bei getter- und setter-Entities an beiden Stellen, also sowohl beim Formular als auch beim Fieldset, der entsprechende Hydrator benutzt werden (in meinem Fall Reflection).
Richtig. Ich hatte in meinem Beispiel für das Container-Objekt den Hydrator „ObjectProperty“, denn der Container sollte sehr einfach sein.
Für die beiden anderen Objekte habe ich den Hydrator „ClassMethods“, weil dieser wunderbar auf Getter- und Setter-Methoden passt.

Zu dem Thema findet man im Netz fast gar nichts Auch Ralf Eggert hat Fieldsets eher spärlich behandelt
Genau das Thema („Zend\Form - Form Collections“) wird doch in der Doku behandelt. Den direkten Link hatte ich bereits oben schon aufgeführt.

deshalb bin ich sehr dankbar für die Hilfe.
Kein Problem.
 
Oben