[Frage] "@var mixed" get nicht [Gelöst]

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    21. 02. 2014, 09:59

    Hallo, ich bins mal wieder :-)

    Ich habe diesmal eine Frage zu der Notation "@var mixed" im Model.
    Und zwar habe ich ein Model mit einer Eigenschaft, die intern (also in der Datenbank) als kommaseparierter String gespeichert wird, nach außen hin aber als Array in Erscheinung treten soll. Ich habe das so gelöst, dass die Setter-Methode das übergebene Array in einen kommaseparierten String wandelt und die Getter-Methode aus dem String ein Array erstellt und dieses zurück gibt.

    Die Werte, die in der Eigenschaft gespeichert werden sollen, kommen aus einer Multiple-Selectbox. D.h. beim Absenden des Formulars mit den gewählten Werten, übergibt Extbase das Array mit den Werten der Multiple-Selectbox an meine Setter-Methode, welche das Array in einen String wandelt. Das funktioniert aber nur, wenn ich die Eigenschaft im Model mit "@var array" definiere. Aber eigentlich ist das ja nicht ganz korrekt, denn wenn ich mir ein Objekt aus der Datenbank erstellen lassen, kommen die Werte aus der Datenbank ja als String, weshalb in diesem Fall "@var string" korrekt wäre. Da die Eigenschaft also je nach Betrachtung und Datenquelle ein Array oder ein String ist, wäre genau genommen die Definition "@var mixed" angebracht. So wie ich das sehe, sollte diese Notation auch von Extbase unterstützt werden, da z.B. die LazyObjectStorage-Klasse ebenfalls die Notation für ihre Eigenschaft "fieldValue" verwendet. Verwende ich diese Notation aber in MEINEM Model, erhalte ich folgende Fehlermeldung:
    #1264093630: Found an invalid element type declaration in %s. A type "'mixed'" does not exist.

    Was mache ich falsch bzw. wie löst man so ein Problem mit der Typ-Umwandling korrekt?
    Hinweis: Ich nutze Typo3 6.2 Beta5

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    21. 02. 2014, 19:16 - Lösung

    Hallo erstmal,

    hatte mir kürzlich auch überlegt, mixed zu verwenden.
    Nachdem ich ein wenig Recherche betrieben hab, bin ich so gut wie überzeugt davon, [b]mixed nicht zu verwenden[/b]. Es scheint mehr Stimmen dagegen zu geben als dafür.

    Du kannst doch einer Methode (ich nehm jetzt mal createAction) ein Array übergeben, und diese macht dann deinen String, setzt damit dein Attribut (also den String) und ab-dafür!
    Du kannst deinem Objekt (Bla ;)) auch ein nicht-persistentes Array spendieren, welches du - wenn nötig - befüllen und wieder auslesen kannst.
    ...also ungefähr sowas:

    1. /**
    2.  * @param \...\Domain\Model\Bla $bla
    3.  * @param Array $auswahl ... kommt aus der select-Box
    4.  * @dontvalidate $bla ... falls dieser String - wenn ungesetzt - Probleme macht
    5.  * @return void
    6.  */
    7. public function createAction(\...\Domain\Model\Bla $bla, Array $auswahl) {
    8. foreach($auswahl as $foo){
    9. $mystring.= $foo.',';
    10. }
    11. $bla->setVeryImportantString($mystring); /* der veryImportantString soll persistiert werden */
    12. $bla->setAuswahlarray($auswahl); /* das nicht persistente Array */
    13. $this->blaRepository->add($bla);
    14. $this->redirect('list');
    15. }


  • 1
  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    21. 02. 2014, 19:16

    Hallo erstmal,

    hatte mir kürzlich auch überlegt, mixed zu verwenden.
    Nachdem ich ein wenig Recherche betrieben hab, bin ich so gut wie überzeugt davon, [b]mixed nicht zu verwenden[/b]. Es scheint mehr Stimmen dagegen zu geben als dafür.

    Du kannst doch einer Methode (ich nehm jetzt mal createAction) ein Array übergeben, und diese macht dann deinen String, setzt damit dein Attribut (also den String) und ab-dafür!
    Du kannst deinem Objekt (Bla ;)) auch ein nicht-persistentes Array spendieren, welches du - wenn nötig - befüllen und wieder auslesen kannst.
    ...also ungefähr sowas:

    1. /**
    2.  * @param \...\Domain\Model\Bla $bla
    3.  * @param Array $auswahl ... kommt aus der select-Box
    4.  * @dontvalidate $bla ... falls dieser String - wenn ungesetzt - Probleme macht
    5.  * @return void
    6.  */
    7. public function createAction(\...\Domain\Model\Bla $bla, Array $auswahl) {
    8. foreach($auswahl as $foo){
    9. $mystring.= $foo.',';
    10. }
    11. $bla->setVeryImportantString($mystring); /* der veryImportantString soll persistiert werden */
    12. $bla->setAuswahlarray($auswahl); /* das nicht persistente Array */
    13. $this->blaRepository->add($bla);
    14. $this->redirect('list');
    15. }

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    14. 03. 2014, 08:38

    Oha ich hab ganz vergessen zu antworten. Also ich habe es nun ohne mixed gelöst - einzig und allein aus dem Grund, dass Extbase den Typ angeblich nicht kennt (ihn aber intern im Core trotzdem selbst in den eigenen Klassen verwendet... verstehe einer das System!). Ich habe nun zwei Eigenschaften mit entsprechenden getter- und setter-Methoden verwendet - wie von dir vorgeschlagen. Damit ist die Sache erledigt :-)

    Danke für die Antwort ;-)!

  • 1