FAL und Extbase

  • Stargast Stargast
    T3PO
    0 x
    10 Beiträge
    0 Hilfreiche Beiträge
    10. 12. 2012, 17:35

    Hallo,
    ich aktualisiere gerade eine meiner Extensions und möchte diese auf den FAL aufbauen.
    Derzeit scheint das noch als "experimental" gekennzeichnet zu sein... trotzdem möchte ich mich mal daran versuchen. :)

    Für meine Extension benötige ich eine Referenz auf einen Folder und mehrere auf jeweils ein Bild. Das Bild-Model muss außerdem noch weitere Daten aufnehmen können.

    Mir ist jetzt nur etwas unklar, wie ich da überhaupt anfang...
    Ich hab mir gedacht ich leite mein Bild-Model von der Klasse TYPO3\CMS\Extbase\Domain\Model\FileReference ab und erweitere dieses um meine benötigten zusätzlichen Daten.
    Ist es dann schlau die Tabelle sys_file_reference um diese Felder zu erweitern? Oder gibts da eine elegantere Lösung?

    Gibts dazu schon Beispiele und/oder Erfahrungen?

    Danke im Voraus!
    MfG Andreas


  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    08. 02. 2013, 11:57

    Hi

    Habe ebenfalls in einem meiner Models ein ObjectStorage, in dem ich Bildreferenzen speichern möchte. Nun habe ich angenommen, dass ich so vorgehe:

    1. /**
    2. * Set images
    3. * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage $images
    4. * @return void
    5. */
    6. public function setImages(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $images) {
    7. $this->images = $images;
    8. }
    9.  
    10. /**
    11. * Get the images related to this regional object
    12. * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage with \TYPO3\CMS\Extbase\Domain\Model\FileReference instances
    13. */
    14. public function getImages() {
    15. return $this->images;
    16. }
    17.  
    18. /**
    19. * Add an image to this regional object
    20. * @param \TYPO3\CMS\Extbase\Domain\Model\FileReference $image
    21. * @return void
    22. */
    23. public function addImage(\TYPO3\CMS\Extbase\Domain\Model\FileReference $image) {
    24. $this->images->attach($image);
    25. }
    26.  
    27. /**
    28. * Remove one image from this regional object
    29. * @param \TYPO3\CMS\Extbase\Domain\Model\FileReference $image
    30. * @return void
    31. */
    32. public function removeImage(\TYPO3\CMS\Extbase\Domain\Model\FileReference $image) {
    33. $this->images->detach($image);
    34. }
    35.  
    36. /**
    37. * Remove all images from this regional object
    38. * @return void
    39. */
    40. public function removeAllImages() {
    41. $this->images = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
    42. }

    Jedoch bekomme ich so einen SQL Fehler von TYPO3 mitgeteilt.

    Wie verwendet mal FAL korrekt über Extbase?

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    08. 02. 2013, 12:19

    Wie kann es sein, dass man keine konkreten Beispiele und NICHTS dazu finden kann? Keine vernüfntige Testextension (blog_example kannst mittlerweile vergessen), die die gängigsten Szenarien abdeckt und keine Erkärungen.

    Wie verwende ich FAL Referenzen in Extbase Models? Muss ich mir hierfür eklige Viewhelper bauen?

    TYPO3 wird für mich immer mehr zur unüberschaubaren Katastrophe.

  • Stargast Stargast
    T3PO
    0 x
    10 Beiträge
    0 Hilfreiche Beiträge
    08. 02. 2013, 12:59

    Ja, da kann ich dir nur zustimmen! Katastrophe!

    Ich hab den Plan verworfen meine Extension auf FAL aufzubauen - insbesondere weil FAL in Extbase noch als "experimental" gekennzeichnet ist. Finds schon etwas schade, dass sich da mittlerweile (knapp 2 Monate später) noch immer NICHTS getan hat. Obwohl FAL ein lange hinfälliger Schritt in die richtige Richtung ist, mit dem dämlichen bisherigen "File-Verwaltungs-System" von TYPO3 aufzuräumen, scheint es in der Extbase-Entwickler-Szene wohl bisher nicht angenommen zu werden - was die Resonanz auf diese Frage klar verdeutlicht.

    Also mir persönlich bleibt mittlerweile nur noch die Hoffnung auf TYPO3 Neos... ansonsten wär ich vom TYPO3-Zug längst abgesprungen.
    Neos (und Flow) verfolgen derzeit wirklich gute Ansätze - hoffentlich bleibts dabei! :)

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    08. 02. 2013, 15:10

    Ich versuche einfach das Filerepository in meinen Controller zu hängen und über die Methode findByRelation alle Files raus zu bekommen.

    Muss doch irgendwie gehen.

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    08. 02. 2013, 15:55

    Das habe ich nun soweit mal hinbekommen (obwohl ich ganz stark vermute, dass man das auf keinen Fall so machen sollte).

    Im Model habe ich aus der images property einfach ein array gemacht, habe keine types für set und get definiert und im Controller das fileRepository als dependencyInjection eingefügt.

    Ich hole mir dann aus meinem Repository all meine Objekte und rufe dann eine Methode in meinem Controller auf, die die einzelnen Objekte um die Files erweitert.

    Jedoch bekomme ich einen Update-Error im Frontend und habe keine Ahnung warum.
    Hier sollte doch kein update passieren!?

    Ich werd mir das weiter ansehen. Bin zwar kein Profi aber die Enttäuschung über Typo3 6.0 ist mittlerweile sehr groß. Wenns Neos nicht besser macht wirds das wohl bald gewesen sein für mich.

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    11. 02. 2013, 10:58

    Also, Extbase sieht anhand der Cleanproperties, dass das Model geändert wurde und will die Änderungen persistent machen. Um das zu verhindern markiert man die Property im Model mit einem vorangestellten _, aus images wird also _images.

    Dann aus dem ObjectStorage ein simples array und die Setter, Getter anpassen.

    Im Controller hängt man nun das FileRepository ein und erweitert seine Results manuell um die FileReferences. Nun hat man ein vollständiges Model samt FileReferences.

    Wahrscheinlich muss ich noch einen ViewHelper schreiben, der mir aus meiner FileReference die URL und Metainformation extrahiert aber das ist dann das kleinste Problem.

    Auf diese Weise braucht man, wenn FAL mal voll in Extbase unterstützt wird, nicht viel in seinen Models umschreiben.

    Hier ein Snippet. Ist zwar sehr starr auf meine Datenstruktur abgestimmt aber man kann das wohl recht einfach in einen Service umschreiben, dem man table- und fieldnames als Parameter mitgibt.

    1. /**
    2. * show a list of specific regional objects
    3. */
    4. public function listAction() {
    5. $objectList = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(',',$this->settings['objects']);
    6. $objects = $this->regionalObjectRepository->findByUidList($objectList)->toArray();
    7. $this->addImagesToRegionalObjects($objects,1);
    8. $this->view->assign('objects',$objects);
    9. }
    10.  
    11. /**
    12. * Load Images from filerepository and add them to a regional object
    13. *
    14. * @param \Pixelpoint\RegionalObject\Domain\Model\RegionalObject $regionalObject
    15. * @param type $limit Limit for query
    16. */
    17. public function loadImagesOfRegionalObject (\Pixelpoint\RegionalObject\Domain\Model\RegionalObject &$regionalObject, $limit=FALSE) {
    18. $images = $this->fileRepository->findByRelation('tx_regionalobject_domain_model_regionalobject', 'images', $regionalObject->getUid());
    19. $limit = ($limit !== FALSE && is_numeric($limit)) ? $limit : FALSE;
    20. $i = 0;
    21. foreach ($images as $image) {
    22. if ($limit && $i++ >= $limit) break;
    23. $regionalObject->addImage($image);
    24. }
    25. }
    26.  
    27. /**
    28. * Add images to regional objects
    29. *
    30. * @param array $regionalObjects Array holding the regional objects
    31. * @param type $limit limit for query
    32. */
    33. public function addImagesToRegionalObjects (array &$regionalObjects, $limit=FALSE) {
    34. if (count($regionalObjects > 0)) {
    35. foreach ($regionalObjects as $regionalObject) {
    36. $this->loadImagesOfRegionalObject($regionalObject,$limit);
    37. }
    38. }
    39. }

    Leider hat die findByRelation Methode des Filerepositories keinen Limitparameter, die Limiteinstellung ist also reine Ergebniskorrektur.

    Das ganze kann man sicher noch stark verbessern, für meinen Zweck reichts aber vorerst mal.

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    11. 02. 2013, 13:18

    Nur kann ich nun nicht in Fluid auf die property _images zugreifen.

    Sagt mal, soll das eine mieße Verarschung sein??!?

    Ich habe wirlich keine Zeit mich mit der fehlenden Implementierung von Core-Features herumzuschlagen.

    Weiß wer, wie ich in Fluid auf eine solche Property zugreifen kann? Oder brauch ich auch hierfür einen Viewhelper?

    Oder kann ich eine Property nach dem überschreiben im Controller als clean kennzeichnen?

    Gibts irgendeine elegante Lösung für dieses Problem?
    Und ab wann kann man damit rechnen, dass Core-Features voll vom eigenen System unterstützt werden?

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    11. 02. 2013, 16:04

    Okay, um auf die Property vom Model zu zugreifen wird logischerweise die entsprechende get-Methode verwendet. Ich kann also eine getImages Methode implementieren, die _images liefert.

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    14. 02. 2013, 13:36

    Eine Referenz auf einen Folder ist ein sys_file_storage, eine Referenz auf eine Datei ist ein sys_file_reference datensatz

    Man kann aber noch nicht ein objectStorage mit FileReferences befüllen lassen, das funtioniert noch nicht. Ich habe ein Array als nicht persistente property in meinem Model, das ich von meinem Controller aus mit sys_file anhand der sys_file_references Datensätze befülle. So funktioniert das bei mir.