Hi,
ich habe folgendes Problem:
Ich möchte nicht zig mal den gleichen Code schreiben, nur weil sich die Ausgabe etwas ändert.
Weil aber Extbase nicht kapiert wenn ich nur eine Action mit der Stammklasse der Objekte definiere, ist zu mindest für Außerhalb für jedes Objekt eine andere (edit)-Action nötig. Ich rufe dann die eben die Super-Methode intern auf:
editXXXAction -> editRecordAction
Ich hoffe das ist soweit nachvollziehbar.
So nun erwartet die View wie vom Request mitgeteilt Action editXXX -> Template editXXX.
Auch hier möchte ich wieder nur ein Template, nämlich Ergebnis bzw. editRecord.
Nun hab ich versucht durch resolveView() und manuellen Pfaden das Template zu ändern.
Hier liegt der Hund begraben. Das klappt auch. Aber nur 1 mal. Danach ist die View "eingefroren"
und es kommt auch nix mehr in die Datenbank. Der Cache ruft immer nur die letzte View auf ( aber die Action nicht mehr).
Andere Möglichkeiten hab ich auch schon probiert:
-) intern redirect(): genau das gleiche
-) den controllerActionName geändert - auch hier lädt er dann brav das Template der Super-Methode einmalig, aber wieder funktioniert der Cache nach dem ersten Mal nicht
Lässt man die View in ruh und zum Ende kommen, funktioniert hingegen alles tadelos.
Edit: Noch eine Verständisfrage:
Ohne den Cache zu leeren seh ich keinerlei Veränderungen obwohl vorhanden.
Ist es Sinn der Sache, dass ich dann hierfür den Cache deaktviere? Aber das kanns ja nicht sein -
dann braucht jeder Aufruf fast ne halbe Minute...
Hi,
ich bin mir nicht sicher, ob ich das richtig verstanden hab.
(Für mich ist das nicht soweit nachvollziehbar)
Um Template-Code wieder zu verwenden, gibt es die Partials,
um z.B innerhalb der Foo->editAction() und der View in
Resources/Private/Template/Foo/edit.html
mittels
<f:render partial="Bar/FormFields" arguments="{bar:bar}" />
auf andere Elemente zugreifen zu können.
Zum Cache:
In der ext_localconf.php sind doch all deine Actions definiert und explizit die non-cacheable-actions.
Und, ja, der Sinn des Cache ist der, daß nicht immer alles neu geladen werden muss.
Lässt sich auch per TS ausschalten, weiß ich grad nur nicht auswendig.
hi, nein ob man nun partials nutzt oder nicht macht keinen Unterschied.
Das mit dem Redirect ist auch nur ein sekundäres Problem, es scheitert schon an den primären Funktionen:
Kleines Beispiel zur Veranschaulichung:
Ganz normale list-Action holt Datensätze aus der Datenbank.
Alle Werte die nun gelistet werden, sind im View dann eingebrannt - also bei jedem
Aufruf erscheinen die gleichen Werte wieder (timestamps bleiben zB gleich - oder es werden Geister-Werte geladen, die zwischenzeitlich aus der Datenbank manuell entfernt wurden und neue werden nicht angezeigt).
Ich hab leider keine Referenz, was da gecached wird und was nicht - aber es kann ja nicht der Sinn sein, dass
diese Werte eingebrannt werden. Das ist doch ein Bug oder? Dann wäre es ja kein Cache sondern nur ein Konverter in eine statische Seite.
Bitte berichtigte mich, wenn ich falsch liege. #paralyzed#
Edit:
Ein weiteres Problem ist, dass auch die Action nicht mehr aufgerufen wird - das erklärt auch warum sich in der View nix mehr tut - allerdings wird wie geschrieben, trotzdem die letzte View anzeigt, so als wär nix gewesen - daraus resultieren die "eingebrannten" Werte.
Cache ist Cache, allerdings gibt es natürlich unterschiedliche Strategien um caches zu leeren. In TYPO3 (denn das Problem klingt nach TYPO3 page cache, nicht extbase oder Fluid) werden immer ganze Seiten (also fertiges HTML) gecached außer du definierst dein Plugin als ungecached oder löschst den Seitencache für diese Seite immer dann wenn sich deine Daten ändern. TYPO3 kann ja nicht unbedingt wissen, wann sich welche Daten ändern und welche Caches dann gelöscht werden müssten.
kitsunet schrieb
TYPO3 kann ja nicht unbedingt wissen, wann sich welche Daten ändern und welche Caches dann gelöscht werden müssten.
Wenn das wirklich gewollt ist, wäre es blöd. So ressourcenhungrig wie T3 ist dauert ein non-cached Aufruf mehrere Sekunden, da ist ja nicht tragbar.
Also im Cache wird dann die Action nicht mehr aufgerufen, echt nicht??? ->fail
Meiner Meinung nach könnte Typo das sehr wohl wissen. Es könnte Platzhalter, die durch Fluid mit assign zugewiesen wurden als dynamisch allozieren. Es legt ohnehin keine reine HTML-Seiten an. Das wandert alles durch den PHP-Parser.
So handhabe ich das in meinen Framework auch und es dauert keine 20ms bis die Seite erscheint.
Kann bitte jemand kurz testen, wie sich Fluid/Cache normalerweise verhält, bei einem Listening-Beispiel?
Bedeutet non-cached wirklich statisch, so dass nur beim ersten Zusammenbau der Seite sich etwas tut?
Wäre euch sehr dankbar.
Du verstehst nicht was ich meine. Fluid hat durchaus einen Cache der das macht, was Du meinst. Trotzdem wird eine Extension die als gecached markiert ist in TYPO3 einfach einmal aufgerufen und danach das Ergebnis im Cache abgelegt. Ich sag ja nicht, dass TYPO3 eine pure HTML Datei generiert, aber es legt mehr oder weniger fertiges HTML in die Datenbank und holt es von da. Das ist kein Problem von Extbase und Fluid sondern vom TYPO3 Cache. Wenn du es spezieller haben willst, dann musst Du die Extension für TYPO3 als ungecached markieren und selbst Daten in deinem Code cachen (und eben auch clearen). Du musst ja nicht direkt die ganze Seite ungecached machen sondern eben nur die Plugins in denen sich was ändert.
Die Seite ansich hat den 1 Monats-Cache.
In meiner Extension ist der Cache für die betreffende Action deaktiviert.
So dauert aber der Aufruf viel zu lange - trotz APC - und das auf einem Dual-Core Test-System mit 3 GHz, welches sich die meiste Zeit langweilt.
In meiner Extension kann ich nix optimieren. Der innere Aufruf zwischen Action-Beginn und -Ende ist sau schnell aber es braucht 3,5 Sek bis tslib_fe->INTincScript( ) mal aufgerufen wird. <= Seiten-Cache ist auf 1 Monat gestellt, trotzdem lahmt es mal rum. Dann gehts wieder schneller 0,5 Sek - und nach einiger Zeit wieder das gleiche Spiel.
Dabei ist stets der Speicherverbrauch signifikant erhöht. Beim 0,5 Sek sind es an die 8MB, bei 3,5 Sek werden stets 15MB verbraucht. Also erneuert hier T3 den Cache oder macht andere Aufräumarbeiten.
Es geschieht relativ häufig, wenn man unterschiedliche Links nacheinander aufruft.
Ich verstehe das Cache-Verhalten wirklich nicht. #angry#