Closed ToVie closed 9 years ago
Wir haben erneut das Problem Aufruf von externen Funktionen aus dem XSLT Prozess Beispiel:
[Thu Dec 04 15:28:20 2014] [error] [client 131.152.226.242] PHP Fatal error: Call to a member function get() on a non-object in /usr/local/vufind/httpd/module/Swissbib/src/Swissbib/XSLT/MARCFormatter.php on line 74, referer: https://test.swissbib.ch/Record/262436434/Description
Ob nur auf einzelne Daten bezogen im Moment unklar
Das Problem trat meines Erachtens nur bei den Ajax-Requests auf. Wenn man also zuerst auf einem anderen Tab war und dann auf den "Details" Tab klickt. Wenn man direkt den "Details" Tab (vufind/Record/227383443/Details) aufruft tritt der Fehler nicht auf. Ich habe das Problem mit dem selben Hack gelöst, wie das bereits Günter gemacht hat. (https://github.com/swissbib/sbvf2/commit/f44f348cd262f4488a2dc28fc1e146c868f2031b --> RecordController)
Das Problem ist, dass im XSLT-Template die Funktionsaufrufe statisch sein müssen. Bei einem statischen Aufruf wird aber der Instanzierungsprozess vom ZF2 umgangen, deshalb fehlte der ServiceManager im MarcFormatter.
Eine andere Möglichkeit das Problem zu lösen wäre, im Bootstraper den ServiceManager als statische Variable zu setzen. Dann könnte man im MarcFormatter darauf zugreifen: Bootstrapper::$serviceManager Hier hat es ein Beispiel dafür: http://devblog.x2k.co.uk/getting-the-servicemanager-into-the-test-environment-and-dependency-injection/ Das untergräbt aber auch das ServiceManagement vom ZF2. Im Moment sehe ich keine Möglichkeit das sauber zu machen, da der Aufruf im XSLT statisch sein muss, statische Aufrufe aber nicht in das Service-Konzept passen.
@maechler Hallo Markus erstmal noch, sehr nachträglich: ich wünsche Dir ein gutes Neues Jahr 2015 und ich hoffe Du bist gut gestartet!
Danke für Deine gute Analyse! Ist es so, dass Ajax - requests den bootstrap - Prozess umgehen / verkürzen / anders durchlaufen? Wenn ja war ich mir dessen nicht bewusst. Das werde ich mir mal anschauen.
Was man alles für Hacks in seinem Leben produziert... Die Lösung mit dem globalen service manager würde mir auch gar nicht gefallen.
Schön dass es wieder läuft!
Günter
@guenterh Hallo Günter
Der Bootstrap-Prozess wird bei Ajax-Requests nicht umgangen, wir landen aber in einer anderen Action. (Deshalb wäre es auch möglich den ServiceManager im Bootstrapper statisch zu setzen)
Ohne Ajax gehen wir über RecordController->homeAction, dort hast du den Hack eingebaut. Mit Ajax gehen wir über RecordController->ajaxtabAction, dort habe ich den selben Hack eingebaut.
@maechler Hallo Markus, danke für die Rückmeldung! Hatte heute morgen einen kleinen Knoten im Kopf. Mein erster Gedanke war, im Bootstrap Prozess sollte doch der Grossteil der notwendigen Referenzen bereitgestellt werden und warum passiert das nicht bei Ajax. Später habe ich dann gesehen, dass in diesem Kontext unterschiedliche Actions aufgerufen werden und ich seinerzeit ja sogar noch einen richtig schönen Kommentar geschrieben habe.... Mehr Austausch mit PartnerInnen über solche Sachen würde ich schätzen.
Einen schönen Abend!
Günter
Analog zur Lösung von issue swissbib/sbvf2/issues/50 sollen die Backlinks in MARC-Sätzen verlinkt werden.