Erste Schritte mit Extbase - Wie füttere ich das Plugin mit Daten? [Gelöst]

  • martinibianco007 martinibi...
    Sternenflotten-Admiral
    0 x
    213 Beiträge
    0 Hilfreiche Beiträge
    12. 02. 2013, 12:08

    Hi ich bräuchte wieder mal eure Hilfe.

    [b]Vorweg, das verwende ich:[/b]
    - Typo3 6.0.1
    - Extension Builder 2.5.1

    [b]Was will ich:[/b]
    Eine simple Extension. Es gibt ein Showcase (Schaufenster) welches mehrere Showcase Items beinhalten soll.
    Das Showcase kann beliebig viele Showcase Items beinhalten.
    Showcase Item bestehen aus einem Bild, Text, Link....

    Was habe ich bis jetzt gemacht:
    [b]1. Domain Modelling [/b]
    [b]2. Extesnion im Extension Manager installieren[/b]
    - Die erfreuliche Nachricht, unter Liste -> neuen Datensatz erstellen kann ich ein Showcase anlegen und darin die Showcase Items

    [b]3. Plugin auf Seite einfügen[/b]
    [b]4. Game Over[/b] #angry# nun stehe ich an, wie kann ich dem Plugin beibringen dass er die auf der Seite eingefügtn Daten verwenden soll?

    Laut Mittwald Extbase Doku soll man einen sysfolder anlegen und im Plugin dann auf diesen verlinken. Klingt logisch aber wie kann ich im Plugin ein Feld hinzufügen wo ich dann auf die Datensätze verlinke?

    Anhänge (1)
    domain-modelling.jpg image/jpeg 0,00 B 362 heruntergeladen

  • martinibianco007 martinibi...
    Sternenflotten-Admiral
    0 x
    213 Beiträge
    0 Hilfreiche Beiträge
    14. 02. 2013, 13:19

    [quote="beo6"]
    im Template kannst du dann wenn die Verknüpfung im Model richtig eingerichtet ist mit {showcase.showcaseitem.0.beschreibungstext}
    z.B. auf das erste showcaseitem in einem showcase zugreifen.
    [/quote]

    [b]1. Wie schaut denn deiner Meinung nach die Verknüfung im Model richt aus?[/b]
    {showcase.showcaseItem.0.category} funktioniert bei mir nämlich nicht

    [b]2. Muss man im Controller wenn es nur ums auslesen der Werte geht eigentlich händisch etwas einstellen
    oder übernimmt das alles der Extension Builder für mich?[/b]

    [b]3. Die eigentliche Frontendausgabe macht ihr im -> Private -> Layouts -> Default.html?[/b]
    3.a. In dieser Datei müsste {showcase.0.title} doch den titel des ersten showcase ausgeben oder?

    [b]4. Kennt jemand eine einfache Extension be der man die Vorgehensweise gut verstehen/nachbauen kann.[/b]

    danke

  • beo6 beo6
    Padawan
    0 x
    45 Beiträge
    1 Hilfreiche Beiträge
    14. 02. 2013, 14:45

    zu 1.:
    Ich meinte damit wenn du es richtig im Extension Builder eingerichtet hast. Der Builder macht das eigentlich wirklich ziemlich simpel.
    Der teil für die ausgabe war wirklich nur ein beispiel und du müsstest es natürlich auf die richtige benennung Ändern.
    Wenn es mehrere Objekte in {showcase} gibt musst du natürlich {showcase.0.showcaseItem.0.category}
    nutzen um das erste showcase zu bekommen.
    (<f:for each> ist dein freund)

    zu 2.:
    Du bekommst vom Extension Builder eigentlich schon eine funktionierende Extension. Die Details musst du natürlich selbst machen.
    in deiner Controller Action sollte dann so etwas wie $showcases = $this->showcaseRepository->findAll();
    und $this->view->assign('showcases', $showcases);
    stehen.

    zu 3.:
    Nein. Das Layout ist mehr für den Rahmen gedacht.
    Die eigentliche ausgabe wird in den Templates unter \typo3conf\ext\deineextension\Resources\Private\Templates

    gemacht. Hier sollte es Ordner für die jeweiligen Controller geben, und darin Html-Dateien für die jeweiligen Actions.

    Im richtigen Template deiner View und wenn du mit findAll alle Elemente auf die fluid-variable zuweist solltest du mit obigem beispiel mit {showcases.0.title} den Titel der ersten Showcase ausgeben können.

    Ich empfehle ebenfalls mal in ein paar PDFs unter dem Link den fan66766 genannt hat die Grundlagen zu verstehen.

    Als Beispiel kenne ich jetzt nur das Blogexample was aber vermutlich schon etwas veraltet sein wird.

  • martinibianco007 martinibi...
    Sternenflotten-Admiral
    0 x
    213 Beiträge
    0 Hilfreiche Beiträge
    14. 02. 2013, 15:10

    zu 1: das ist mir klar mit for each oder {showcase.0.showcaseItem.0.category}

    In Templates gibt es zwei Ordner
    a) Showcase
    b) ShowcseItem
    beide haben jeweils die Dateien Edit.html - List.html - New.html - Show.html

    im Default.html steht lediglich folgende Zeile die eingentlich nichts anderes
    macht als die List.html von Showcase aufzurufen.

    1. <f:render section="main" />

    Die List.html von Showcase sieht wie folgt aus

    1. <f:layout name="default" />
    2.  
    3. This Template is responsible for creating a table of domain objects.
    4.  
    5. If you modify this template, do not forget to change the overwrite settings
    6. in /Configuration/ExtensionBuilder/settings.yaml:
    7. Resources:
    8. Private:
    9. Templates:
    10. List.html: keep
    11.  
    12. Otherwise your changes will be overwritten the next time you save the extension in the extension builder
    13.  
    14. <f:section name="main">
    15. <h1>Listing for Showcase</h1>
    16.  
    17. <f:flashMessages />
    18.  
    19. <table class="tx_wsshowcase" >
    20. <tr>
    21. <th><f:translate key="tx_wsshowcase_domain_model_showcase.title" /></th>
    22. <th> </th>
    23. <th> </th>
    24. </tr>
    25.  
    26. <f:for each="{showcases}" as="showcase">
    27. <tr>
    28. <td><f:link.action action="show" arguments="{showcase : showcase}"> {showcase.title}</f:link.action></td>
    29. <td><f:link.action action="edit" arguments="{showcase : showcase}">Edit</f:link.action></td>
    30. <td><f:link.action action="delete" arguments="{showcase : showcase}">Delete</f:link.action></td>
    31. </tr>
    32.  
    33. </f:for>
    34.  
    35. <f:link.action action="new">New Showcase</f:link.action>
    36. </f:section>

    Wie muss ich in dieser Datei ein showcaseItem aufrufen oder sollte ich in der schleife die List.html des ShowcaseItem
    aufrufen? wenn ja wie?

    danke für die geduld
    ich finde die docus ziemlich schwach und wenn man mal ein beispiel
    findet ist es gleich schon sehr komplex dass es für den anfang eher abschreckt als weiterhilft.

  • beo6 beo6
    Padawan
    0 x
    45 Beiträge
    1 Hilfreiche Beiträge
    14. 02. 2013, 16:46

    Hallo.

    kein Problem.
    Das die Dokumentation derzeit etwas Chaotisch ist liegt denke ich daran das Extbase und Fluid backported wird und sich schnell einiges ändern kann. Bin auch noch nicht allzu lange bei Extbase und Fluid, wenn man sich aber einmal hineinbeißt findet man es gar nicht so schlecht. Also nur Mut. ;)

    Die liste in der Default.html bedeutet eben nicht das die List.html aufgerufen wird. (da steht schließlich auch nichts von "list"). in der regel steht dort aber auch noch ein <div class="derExtensionKey"> Es ist wie gesagt einfach ein Layout für den Rahmen deiner Views. Wenn du dir die erste zeile der List.html anschaust siehst du das dort das zu verwendende Layout (default) zugewiesen wird.

    in der List.html deines Showcase solltest du innerhalb der for each schleife mit
    {showcase.showcaseItem.0.category} auf das erste showcaseitem dieses showcase zugreifen können. (vorausgesetzt die parameter showcaseItem und category heißen auch so im Model.)

  • martinibianco007 martinibi...
    Sternenflotten-Admiral
    0 x
    213 Beiträge
    0 Hilfreiche Beiträge
    20. 02. 2013, 10:09

    dank beo6 gibts eine lösung:

    1. <f:for each="{showcases}" as="showcase">
    2. <tr>
    3. <td><f:link.action action="show" arguments="{showcase : showcase}"> {showcase.title}</f:link.action></td>
    4. <td><f:link.action action="edit" arguments="{showcase : showcase}">Edit</f:link.action></td>
    5. <td><f:link.action action="delete" arguments="{showcase : showcase}">Delete</f:link.action></td>
    6.  
    7. <td>
    8. <ul>
    9. <f:for each="{showcase.showcaseItems}" as="showcaseItem" iteration="iterator">
    10. <li>geht: {showcaseItem.itemtitle}</li>
    11. <f:if condition="{iterator.isFirst}">
    12. <li>erstes Item: {showcaseItem.itemtitle}</li>
    13. </f:if>
    14. </f:for>
    15. </ul>
    16. </td>
    17. <!--Geht auch nicht {showcase.showcaseItem.0.itemtitle}-->
    18. </tr>
    19. </f:for>

  • beo6 beo6
    Padawan
    0 x
    45 Beiträge
    1 Hilfreiche Beiträge
    20. 02. 2013, 11:17

    wobei mich interessieren würde wie man bei den neuen Versionen auf einzelne Elemente im Object Storage zugreifen kann ohne foreach.

    {showcase.showcaseItems.0.itemtitle} funktioniert nicht mehr um das erste Element aufzurufen. Ich denke das liegt am lazy loading und die Elemente erhalten alle immer zufällige IDs. (wobei ich gedacht hätte das die IDs sich nicht bei jedem neu-laden ändern)

  • kainobi kainobi
    Jedi-Ritter
    0 x
    141 Beiträge
    0 Hilfreiche Beiträge
    20. 02. 2013, 13:29

    Nope, liegt nicht am lazy loading. Lass dir mal einen Object-Storage mit f:debug ausgeben, dann siehst du dass die Keys einen Hash-Wert haben (genauer: spl_object_hash). Ich glaube das wurde gemacht, damit nicht mehrmals das gleiche Object drin gespeichert werden kann. Das war aber glaube ich schon immer so, bzw. seit sehr langer Zeit.

    Ich würde es über einen VH machen, der dir das gewünschte Element aus dem ObjectStorage holt.

  • martinibianco007 martinibi...
    Sternenflotten-Admiral
    0 x
    213 Beiträge
    0 Hilfreiche Beiträge
    20. 02. 2013, 14:03

    @kainobi

    wie würde deine lösung dann aussehen?

    würdest du ebenfalls sämtlichen output fürs frontend in der List.html der Showcase unterbringen?

    oder würdest du in der for each der showcase ein
    <f:render .... />

    welches die List.html der showcaseItems ausliest unterbringen?
    bzw. geht das überhaupt?

  • beo6 beo6
    Padawan
    0 x
    45 Beiträge
    1 Hilfreiche Beiträge
    20. 02. 2013, 20:46

    Ich bin mir fast sicher das der direkte Zugriff unter typo3 4.5 {var.items.0} noch funktionierte.

    Außer ich hatte irgendwie ein array daraus gemacht. Werde ich noch mal testen müssen.