Zum Inhalt springen

Extensions verschachteln

Erstellt am 10. November 2005 · 8 Antworten · letzte Antwort am 14. November 2005

Tags: Frage

gelleneu ·

Hallo,

auch auf die Gefahr, das die Lösung ganz einfach ist:

Ich habe eine "Services" Extension geschrieben, die
verschiedene Datenbankfunktionen (Connect, Query usw..) enthält.

Jetzt möchte ich diese Extension in anderen, bestehenden selbstgeschriebenen Extensions (z.B. Frontend Plugins) zum Ansprechen von externen Datenabanken nutzen.

Meine Frage: wie binde ich die Services Extension in die anderen Extensions ein? In welcher Datei und an welcher Stelle? Oder geht das nur über Kickstarter?

Gruß
Gelle

steffenk ·

Sobald eine Extension installiert ist, steht sie automatisch zur Verfügung.
Wenn Du Dir eine Extension(-Klasse) anschaust, so wird sie üblicherweise mit

class tx_extname_pi1 extends tslib_pibase

initialisiert. Also sthen Dir die Funktionen über tslob_pibase zur Verfügung.

gelleneu ·

Das hab ich mir auch schon gedacht, nur es ist so:

beide Extensions
(eine vom Typ: Services, eine als FE-Plugin)
sind installiert.

Nun will ich innerhalb des PHP Codes der FE-Extension
auf Funktionen der Serviceextension zugreifen.

Ein Initialisieren der Klasse mittels sql = new SQLAPI()
wirft eine Fehlermeldung...

steffenk ·

da müsstest Du doch direkt mit

$this->Funktion()

zugreifen können. Ansonsten doch direkt über Klassenname::Funktion

gelleneu ·

Undefined Function bei der ersten Variante, undefined Class bei der Zweiten.
Vermutlich doch was nicht richtig installiert?
Aber im ExtManager scheint alles i.O... #angry#

steffenk ·

tja, ich habs noch nicht gemacht, daher kann ich Dir nur Vermutungen preisgeben.
Es ist ja initialisiert, vll. unter $GLOBALS['FE_USER']->Function()

Einen Weg gibts auf jeden Fall - leider ist die Beteiligung anderer user hier Glückssache 😉

Spyker ·
steffenK schrieb

Es ist ja initialisiert, vll. unter $GLOBALS['FE_USER']->Function()

Glaube ich nicht. wenn er mit Klasse::function() noch nicht einmal eine Statische Funktion aufrufen kann ist anscheint noch nicht einmal die Klasse bekannt, oder liegt nur in andern Objekten

Ich würde mir mal mit debug die Vars $this und $GLOBALS ausgeben lassen und dann nach dem Namen der Kalsse suchen die du brauchst. Vielleicht findeste ja was, was eine Instanz deiner Klasse ist.

Aber wer weiß ob es da schon Objekte gibt, schau dir doch mal Funktionen von dieser ObjektFactory an, vielleicht kann man manuell schon eine Klassen laden.

Wenn nicht vielleicht kannste deine Klasse ja auch X-Class´en... Such dannach mal. Da kannste von der anderen Ext erben und hast dann alle funktionen in $this.

Ich hoffe ich konnte helfen.

Beste,
Tim

gelleneu ·

Wo finde ich denn debug und diese ObjectFactory?
Variablen auslesen könnte man ja auch einfach als PHP "echo" realisieren?

Weiterhin scheint schonmal sicher, das die Funktionen im $GLOBALS oder $this
stehen müßen, um erreichbar zu sein?

Wenn ich eine Service Extension anlege, bekomme ich gleich die Methoden
init() und process() mit. habe aber natürlich meine eigenen Methoden
definiert. Geht das überhaupt?

Man findet in der Literatur halt viel über Frontend und Backend Extensions,
aber wenn man reine Funktionsbibliotheken bauen will, wird die Dokumentation
echt dünn..

Also danke schon mal für die Hilfe
Gruß
Gelle

gelleneu ·

Also es verwirrt immer mehr. Wenn ich in einer Main Funktion einer Extension den Service einbinde, wie eine normale Extension dann funktioniert es.

Laut Doku sollte es bei einem Service so gehen:

$serviceObj = t3lib_div::makeInstanceService('databaseApi');
$serviceObj->selectSQL();

Das geht natürlich nicht. Gleichzeitig wird in der Doku
erklärt wie es "normalerweise" ginge, nämlich so:

require_once(t3lib_extMgm::extPath('qweb_dapi').'/sv1/class.tx_qwebdapi_sv1.php');
 
$obj = t3lib_div::makeInstance('tx_qwebdapi_sv1');
$language = $obj->selectSQL();

Und so geht es auch. Aber verdammt, wozu hab ich denn einen Service gemacht, wenn dieser nicht wie ein normaler Service
aufgerufen werden kann??!
#angry#