Zum Inhalt springen

Viewhelper in ext_autoload.php?

Erstellt am 7. Februar 2014 · 6 Antworten · letzte Antwort am 7. Februar 2014

Tags: ViewHelper, PHP, Frage

Kaimane ·

Ich benötige einen einfachen Viewhelper, der Javascript Inline am Ende des <body>-Tags erzeugt. Der Viewhelper funktioniert jedoch nur dann, wenn ich ihn in der ext_autoload.php bekannt mache:

<?php
$extensionClassesPath = t3lib_extMgm::extPath('myext') . 'Classes/';

$default = array(
  'tx_myext_viewhelpers_scriptviewhelper' => $extensionClassesPath . 'ViewHelpers/ScriptViewHelper.php'
);

return $default;
?>

Passiert dies nicht, erhalte ich im Log die Ausgabe:

Core: Exception handler (WEB): Uncaught TYPO3 Exception: #1289386765: Could not analyse class:Tx_Myext_ViewHelpers_ScriptViewHelper maybe not loaded or no autoloader? | Tx_Extbase_Object_Container_Exception_UnknownObjectException thrown in file /var/www/clients/client1/web308/private/typo3_src-4.5.32/typo3/sysext/extbase/Classes/Object/Container/ClassInfoFactory.php in line 45

Core: Error handler (FE): PHP Warning: in_array() expects parameter 2 to be array, boolean given in /var/www/clients/client1/web308/private/typo3_src-4.5.32/typo3/sysext/extbase/Classes/Object/Container/Container.php line 259

Core: Error handler (FE): PHP Warning: class_implements(): Class Tx_Myext_ViewHelpers_ScriptViewHelper does not exist and could not be loaded in /var/www/clients/client1/web308/private/typo3_src-4.5.32/typo3/sysext/extbase/Classes/Object/Container/Container.php line 259

Auf die Groß- und Kleinschreibung der Ordner und Dateien habe ich penibelst geachtet.
TYPO3 4.5.32 ist im Einsatz, Extbase 1.3.4 und Fluid 1.3.1.

Normalerweise müsste Extbase den Viewhelper doch selber laden.
Warum muss ich ihn in der ext_autoload.php laden lassen, worauf habe ich nicht geachtet?

Vielen Dank für eure Hilfe!

harald1972 ·

Ich benötige einen einfachen Viewhelper, der Javascript Inline am Ende des <body>-Tags erzeugt. Der Viewhelper funktioniert jedoch nur dann, wenn ich ihn in der ext_autoload.php bekannt mache

Soll es sich um ein FE-Plugin handeln und soll das heißen: außerhalb des Plugins?

<body>
<!--  Plugin inserted: [begin] -->
	<div class="tx-myextension">
 hier steht Plugin-Code
<!--  Plugin inserted: [end] -->
	</div>
hier soll javascript hin
</body>

Da wüsste ich gar nicht, wie das mit einem VH gehen soll. Denn dieser wird aus dem fluid-template heraus aufgerufen und was dieser ausgibt, erscheint an der Stelle des Aufrufs.
Die Ausgabe des VH ist Teil des fluid-scripts, welches Teil des Plugin ist. Ich wüsste nicht, wie ich mit einem Plugin eine Ausgabe außerhalb des <div class="my-plugin"> erzeugen soll.

Ansonsten gibt es nur zu beachten, den Namespace des VH im fluid-script bekannt zu machen.
Ungefähr so...

{namespace xyz=Tx_myext_ViewHelpers}
<xyz:script arguments="..." />
Velletti ·
harald1972 schrieb

Ich wüsste nicht, wie ich mit einem Plugin eine Ausgabe außerhalb des <div class="my-plugin"> erzeugen soll.

das geht doch auf 2 Arten:
z.b. im layout unterhalb von

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

oder via Javascript analog wie es der FlashMessagedisplay Controller in der Community extension macht:

im Template:

<script type="text/javascript">
	jQuery('{settings.flashMessagesDisplayer.where}').append('<f:flashMessages renderMode="div"/>');
</script>

und im setup.txt

settings.flashMessagesDisplayer.where = #DivID_des_PageWrappers
harald1972 ·

Ok, danke Velletti!

Das beantwortet meine Frage - obwohl ich gar keine gestellt, sondern nur Unwissen ausgedrückt hab 😉 - wenn ich das richtig verstanden hab...
Ein VH könnte z.B. ein javascript mit append 'hinten anhängen'.

Velletti ·

gern geschehen. Die eigentliche Frage hattest du nach meinem Empfinden mit dem Hinweis

{namespace xyz=Tx_myext_ViewHelpers}

(vermutlich) ohnehin schon beantwortet ..

Grüße
Jörg
PS: kannst ja bei mir auf "war hilfreich" drücken :-)

Kaimane ·

Zunächst erstmal vielen Dank für eure Hinweise und Antworten.

Der ViewHelper greift auf den pageRenderer->addJsFooterInlineCode bzw. $GLOBALS['TSFE']->additionalFooterData zurück (ne nachdem ob Caching oder nicht), wodurch es möglich ist dynamisch generiertes JavaScript aus dem Fluid-Template ans Ende (also vor dem </body>-Tag) zu platzieren, auch außerhalb des Plugin-HTMLs.

Aber das ist überhaupt nicht mein Problem, denn der VH funktioniert einwandfrei.
Meine Frage bezieht sich viel mehr darauf, warum ich den VH in der ext_autoload.php bekannt machen und laden lassen muss. Und, wenn ich es nicht tue, Extbase mir die im ersten Post gezeigten Errors auswirft ( [...] Could not analyse class:Tx_Myext_ViewHelpers_ScriptViewHelper maybe not loaded or no autoloader? [...] ).

Kann mir jemand einen Hinweis dazu geben?
Warum muss der VH über die ext_autoload.php geladen werden? Das ist doch unüblich.
Warum lädt Extbase den VH nicht selber, wenn er benötigt wird? Ordner- und Dateibenennung sowie die Schreibweise in der VH-Klasse ist nach Extbase-Vorgabe.

Nochmals vielen Dank für eure Unterstützung!

harald1972 ·

Warum muss der VH über die ext_autoload.php geladen werden? Das ist doch unüblich.

Ich denke auch, dass das unüblich ist... hab ich glaub auch noch nie so gemacht.
Aber wie kommst du denn eigentlich auf eine so unübliche Lösung?

Could not analyse class:Tx_Myext_ViewHelpers_ScriptViewHelper maybe not loaded or no autoloader?

Den Fehler hab ich immer, wenn ich mich bei der Benutzung eigener VH irgendwo vertippt hab.
Deswegen der Hinweis, den Namespace zu definieren

    {namespace xyz=Tx_Myext_ViewHelpers}
    <xyz:script arguments="..." />

und das sollte tun, wenn im Ordner myext/Classes/ViewHelpers
die Datei ScriptViewHelper.php steht und darin die Klasse Tx_Myext_ViewHelpers_ScriptViewHelper definiert ist.
Bei mir heißt der Ordner übrigens ViewHelper (Singular) - wie im Core auch.