Hallo zusammen,
ich hoffe Ihr könnt mir weiterelfen. Ich suche schon seit Ewigkeiten, aber komme einfach nicht weiter.
Ich habe eine kleine Extension gebaut, mit der ich für eine Studienarbeit gern sehr große Mengen an Text (LONGTEXT) in der DB abspeichern & im Frontend ausgeben möchte.
Da sich die Textmenge nicht in einem einzigen Feld abspeichern lässt, habe ich den Text in einzelne Kapitel zerlegt. Das Datenmodell sieht wie folgt aus:
publication 1 - n chapter
also eine Tabelle mit dem Titel der Publikation & referenzierte Kapitel in einer anderen Tabelle
Jede publikation kann also mehrere Kapitel haben. Die Kapitel tragen den eigentlichen Inhalt als LONGTEXT.
Leider kommt es bei der Abfrage zum Timeout / Speicherüberlauf, so dass nichts ausgegeben wird.
Meine Partial für die Abfrage & Ausgabe sieht wie folgt aus:
<div class="output">
<f:for each="{publikation.chapters}" as="chapter">
<f:format.raw>{chapter.content}</f:format.raw>
</f:for>
</div>
Gibt es irgendeine Möglichkeit die einzelnen Kapitel nacheinander zu laden & auszugeben, so dass ich die Speicherprobleme vermeide? D.h. sobald Kapitel 1 geladen & ausgegeben ist, soll Kapitel 2 geladen & die Aussgabe entsprechend erweitert werden, so dass zum Schluss die komplette Publikation im Frontend ausgegeben wird.
Es wäre toll, wenn es hier eine einfache Lösng geben würde.
Das ganze über "Paginate" zu machen ist in meinem Fall keine Option.
Schon mal vielen Dank für Eure Hilfe!
Steffen
Du könntest die Inhalte per Ajax nachladen (lazy loading).
Ein grobes Beispiel dazu findest du hier: http://blog.teamgeist-medien.de/2014/02/typo3-ajax-schnittstelle-in-extbase-extension-einrichten.html
Hallo toifel,
herzlichen Dank für den Hinweis. Das Beispiel sieht echt gut aus. Ich versuche das & werde berichten 😉
Viele Grüße,
Steffen
Hallo,
mir fällt es schwer das nachzuvollziehen.
Die eigentliche "for each" Query steht im Partial PublicationViewer.html:
<div class="output">
<f:for each="{publication.chapters}" as="chapter">
<f:format.raw>{chapter.content}</f:format.raw>
</f:for>
</div>
Das Partial mit der Query wird durch das Template showPublication.html aufgerufen:
<f:section name="main">
<f:flashMessages renderMode="div" />
<f:render partial="Publication/PublicationViewer" arguments="{publication:publication}" />
</f:section>
Das Template wird über die Action showPublication im Extension Controller PublicationController aufgerufen:
public function showPublicationAction(\test\Publicationviewer\Domain\Model\Publication $publication) {
$this->view->assign('publication', $publication);
}
Zum AJAX Tutorial:
1. Hier steht, dass eine AJAX-API über einen eigenen Page-Type erstellt werden soll:
ajax_api = PAGE
ajax_api {
typeNum = 6666
config {
disableAllHeaderCode = 1
xhtml_cleaning = 0
admPanel = 0
additionalHeaders = Content-type: text/plain
no_cache = 1
debug = 0
}
10 < tt_content.list.20.extkey_publicationviewer
}
2. Es soll ein Controller erstellt werden, welcher die asynchrone Abfrage & Ausgabe macht:
public function showPublicationAction(\test\Publicationviewer\Domain\Model\Publication $publication) {
$this->view->assign('publication', $publication);
return trim($this->view->render());
}
3. Die Inhalte der Extension sollen nur über folgenden Link ausgegeben werden:
http://meineSeite.de/index.php?type=6666&extkey_publicationviewer[controller]=PublicationController&extkey_publicationviewer[action]=showPublicationAction
Sorry für die Frage, aber wie & wo muss nun die Query ablaufen?
Das ist mir zu komplex 🙁
Für jeden Hinweis wäre ich echt dankbar.
Viele Grüße
Steffen
Nachtrag:
Gibt es keine Möglichkeit die Fluid "for each" Query im Partial einfach in eine asynchrone / lazy load Query per Fluid umzugestalten?
<f:for each="{publication.chapters}" as="chapter">
<f:format.raw>{chapter.content}</f:format.raw>
</f:for>
Hallo,
ist es denn möglich den FOR Viewhelper um die erforderliche AJAX Funktionalität zu erweitern?
Ich hatte gelesen, dass die Viewhelper eine klare Abgrenzung zwischen Template und eingebetteter Funktionalität ermöglichen sollen.
Viele Grüße.. Steffen
Du müßtest irgendwie paginate "ajaxifizieren",
also daß die "nächste Seite laden"-Aufrufe per Ajax abgesetzt werden,
und dann das Result in das DOM an der gewünschten Stelle anhängen.
So könntest du mit Standard-Fluid-Mechanismen arbeiten.
Allerdings verlagerst du eventuell das Problem des Speicherüberlaufes vom Server auf das Gerät,
auf dem der Browser läuft - irgendwann wird dann eben Firefox abkacken :p
Welchen Sinn es machen soll, 800 Trillionen Zeilen Text nacheinander im Browser auszugeben,
erschließt sich mir nicht wirklich.