Zum Inhalt springen

Erste Schritte mit Extbase - Wie füttere ich das Plugin mit Daten?

Erstellt am 12. Februar 2013 · 30 Antworten · letzte Antwort am 21. Februar 2013 · Seite 1 von 2

Tags: Frage

martinibianco007 ·
fan66766 schrieb

Folgendes ist mir aufgefallen:
1 Du möchtest Dir Datensätze von ShowcaseItem anzeigen lassen.
2 Du hast dem Frontend-Plugin (FP) gesagt, er soll die list() laden.
3 Du hast das FP auf einer Seite eingerichtet.
4 Du hast im Backend dem FP gesagt, aus welchem Ordner er die Daten hernehmen muss.
5 Du hast jedoch nicht nachgeschaut, ob Du auch eine ShoecaseItemRepository.php erstellt bekommen hast, oder?

1 ich möchte den Showcase anzeigen dieser ist der Container der Shwocase Items
z.B. <div class="showcase">
<h2>showcasetitle</h2>
<div class="showcaseItem">ITEM</div>

2 Model Object ist wie folgt eingestellt
ShowcaseItem=>list,show,new,create,edit,update,delete
Showcase=>list,show,new,create,edit,update,delete
Passt das nicht so?

3 FP ist eingefügt ja statische Template ebenfalls

4 richtig

5 richtig unter ws_showcase -> Classes -> Domain -> Model -> Repository liegt nur ShowcaseRepositry.php
Da es kaum brauchbare Docs gib weiß ich ja nicht was ich eigentlich alles brauche.

martinibianco007 ·
<f:layout name="Default" />

This Template is responsible for creating a table of domain objects.

If you modify this template, do not forget to change the overwrite settings
in /Configuration/ExtensionBuilder/settings.yaml:
  Resources:
    Private:
      Templates:
        List.html: keep

Otherwise your changes will be overwritten the next time you save the extension in the extension builder

<f:section name="main">
<h1>Listing for ShowcaseItem</h1>

<f:flashMessages />

<table  class="tx_wsshowcase" >
	<tr>
		<th><f:translate key="tx_wsshowcase_domain_model_showcaseitem.itemtitle" /></th>
		<th><f:translate key="tx_wsshowcase_domain_model_showcaseitem.category" /></th>
		<th><f:translate key="tx_wsshowcase_domain_model_showcaseitem.description" /></th>
		<th><f:translate key="tx_wsshowcase_domain_model_showcaseitem.link" /></th>
		<th> </th>
		<th> </th>
	</tr>

	<f:for each="{showcaseItems}" as="showcaseItem">
		<tr>
			<td><f:link.action action="show" arguments="{showcaseItem : showcaseItem}"> {showcaseItem.itemtitle}</f:link.action></td>
			<td><f:link.action action="show" arguments="{showcaseItem : showcaseItem}"> {showcaseItem.category}</f:link.action></td>
			<td><f:link.action action="show" arguments="{showcaseItem : showcaseItem}"> {showcaseItem.description}</f:link.action></td>
			<td><f:link.action action="show" arguments="{showcaseItem : showcaseItem}"> {showcaseItem.link}</f:link.action></td>
			<td><f:link.action action="edit" arguments="{showcaseItem : showcaseItem}">Edit</f:link.action></td>
			<td><f:link.action action="delete" arguments="{showcaseItem : showcaseItem}">Delete</f:link.action></td>
		</tr>
	</f:for>
</table>

<f:link.action action="new">New ShowcaseItem</f:link.action>
</f:section>
fan66766 ·

Scheint alles gut auszusehen.

Setze mal bitte im Extension Builder für diese Tabelle das "aggregate root" Häkchen -> abspeichern -> Datenbank aktualisieren lassen über Menüpunkt "Adminwerkzeuge -> Installation" und erneut aufrufen. Eventuell Cahce leeren.

Achtung: Falls Du Änderungen am Controller, der Repository, oder am Fluid Template gemacht hast, speichere Sie Dir vorher seperat ab. Diese werden gelöscht.

martinibianco007 ·

Wenn ich is aggregated Root bei ShowcaseItem anhake (verstehe zwar nicht warum das soll ja nicht die root sein)
bekomme ich eine Ausgabe und zwar sieht die ca. wie folgt aus

Listing for ShowcaseItem
Itemtitel (nur Intern) category Beschreibungstext link
schaufensteritem 1 test 1 beschreibung 1 http://www.gmx.net Edit Delete
item 2 test 2 descr 2 http://www.xxx.at Edit Delete
New ShowcaseItem

mhhh sobald ich das Häckchen mit der Root wieder entferne is alles futsch.

@fan66766 hast meine PM gelesen?

beo6 ·

Du greifst anscheinend direkt auf die Showcase Items zu. Wo du jedoch im ersten Posting schreibst das es Showcases gibt (dein Root) das mehrere Showcase Items beinhalten soll.

Daher möchtest du doch sicher eher eine Liste aller Showcases in denen wiederrum alle Showcase Items angezeigt werden.

Dann ist wohl auch laut deinem späteren Posting die ext_localconf falsch. Hier wird immer die controller->action als Default verwendet was als erstes eingetragen ist. Bei dir also showcaseitem=>list

es sollte aber am Anfang wohl eher showcase=>list stehen.

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.

Hoffe ich habe alles richtig verstanden.

Unbekannter Benutzer ·

Was dir fehlt ist eine Möglichkeit im Plugin ein Showcase auszuwählen, dass dan angezeigt wird. Du könntest natürlich auch die Logik so bauen, dass das von der aktuellen Seite genommen wird. Ich denke dieser Punkt fehlt dir im Moment.

D.h. in deiner listAction() musst du irgendwie ein Showcase object bekommen und das dann nach seinen items fragen...

Um eine Auswahlmöglichkeit im Plugin einzubauen würde ich mal nach Beispielen für Flexforms und Extbase suchen, da gibts welche.

martinibianco007 ·

zu früh gefreut,

der extension builder kann mein modul nun nicht mehr laden.
es wird angezeigt nur bei klick darauf passiert nichts.

anders gefragt, welche dateien darf ich im code verändern ohne
die funktionalität des extensions builders zu zerstören?

habe die ext_localconf und default.html geändert kann das der grund sein?

kann mir jeman eine lektüre empfehlen sonst werde ich hier alt. :o

beo6 ·

Freut mich das ich helfen konnte.

Der Extension Builder greift glaube ich nur auf die "ExtensionBuilder.json"
und u.U. auf "Configuration/ExtensionBuilder/settings.yaml" zu.

Wenn du nicht die settings.yaml entsprechend anpasst und roundtrip aktiv ist überschreibst du beim erneuten speichern im Extension builder wieder alle Dateien.

die ext_localconf und Templates dürften auf jeden Fall kein Grund sein das es beim laden im Builder Probleme gibt.

martinibianco007 ·
beo6 schrieb

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.

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

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?

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

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

danke

beo6 ·

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 ·

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.

<f:render section="main" />

Die List.html von Showcase sieht wie folgt aus

<f:layout name="default" />

This Template is responsible for creating a table of domain objects.

If you modify this template, do not forget to change the overwrite settings
in /Configuration/ExtensionBuilder/settings.yaml:
  Resources:
    Private:
      Templates:
        List.html: keep

Otherwise your changes will be overwritten the next time you save the extension in the extension builder

<f:section name="main">
<h1>Listing for Showcase</h1>

<f:flashMessages />

<table  class="tx_wsshowcase" >
	<tr>
		<th><f:translate key="tx_wsshowcase_domain_model_showcase.title" /></th>
		<th> </th>
		<th> </th>
	</tr>

	<f:for each="{showcases}" as="showcase">
		<tr>
			<td><f:link.action action="show" arguments="{showcase : showcase}"> {showcase.title}</f:link.action></td>
			<td><f:link.action action="edit" arguments="{showcase : showcase}">Edit</f:link.action></td>
			<td><f:link.action action="delete" arguments="{showcase : showcase}">Delete</f:link.action></td>
		</tr>
		
	</f:for>
</table>

<f:link.action action="new">New Showcase</f:link.action>
</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 ·

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 ·

dank beo6 gibts eine lösung:

<f:for each="{showcases}" as="showcase">
<tr>
<td><f:link.action action="show" arguments="{showcase : showcase}"> {showcase.title}</f:link.action></td>
<td><f:link.action action="edit" arguments="{showcase : showcase}">Edit</f:link.action></td>
<td><f:link.action action="delete" arguments="{showcase : showcase}">Delete</f:link.action></td>
            
<td>
   <ul>
     <f:for each="{showcase.showcaseItems}" as="showcaseItem" iteration="iterator">
     <li>geht: {showcaseItem.itemtitle}</li>
     <f:if condition="{iterator.isFirst}">
     <li>erstes Item: {showcaseItem.itemtitle}</li>
     </f:if>
     </f:for>
   </ul>
 </td>
 <!--Geht auch nicht {showcase.showcaseItem.0.itemtitle}-->
</tr>
</f:for>
beo6 ·

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 ·

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 ·

@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 ·

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.