Externe Klassen dynamisch instanzieren

shallax

Grünschnabel
Hallo zusammen

Ich arbeite gerade an einer OOP-Webapplikation, welche die Möglichkeit bieten soll, externe Module in bestimmte Bereiche verschiedener HTML Templates einzufügen. Der Aufbau sieht folgendemassen aus: Eine Page besteht aus einem Template, welches aus verschiedenen Views besteht. Die Views beinhalten weiteren Sections und diese bestehen aus n Modulen. Die Module bestehen aus verschiedenen PHP und JavaScript Dateien, die sich in einem seperaten Folder befinden und durch eine index.php (Klasse) instanziert werden können.

Die Struktur von der Page bis zu den einzelnen Modulen befindet sich in einer relationalen Datenbank.
Folgender Massen hab ich mir das vorgestellt:
1. Die Klasse CModul holt von der Datenbank den physischen Foldernamen und den Filename der index datei des entsprechenden Moduls.
2. Anhand dieser angaben soll irgendwie der Code vom spezifischen Modul in die bestehende Klasse CModul importiert werden und direkt mit einem Parameter ausgeführt werden.
3. Das Modul erzeugt einen HTML Output, welcher von der Klasse CModul abgefangen und erfasst werden soll.
4. Die Varibale wird von der Parent Klasse CPage ausgelesen und später in das Template per Variable integriert.

Ich habe schon viel gegoogelt und Sachen wie eval, spl_autoload_register (__autoload) gefunden, jedoch kann ich keine Parameter übergeben und die Ausgabe der gekapselten Instanz in einer Variable abfangen.

Ziel dieses Projektes sollte eingentlich ein Konstrukt für einen einfachen modularen Aufbau bzgl. weiteren Seiten sein.

Viele Grüsse
 
Für mich klingt das alles sehr komplex. So, als ob du unbedingt OOP verwenden willst.

Du hast sowas

CPage->CModul->Modul1

Was spräche gegen ein Attribut ->sHTML unter Modul1? Wenn alle Module ihren Output in einer gleichnamigen Variable abspeichern, kannst du später von CModul aus diese Variablen der einzelnen Module zusammenführen.

Aber wenn die Module eh schon HTML erzeugen und CModul dann quasi alles HTML zusammenführt. Wozu dann eigentlich noch ein Template, in das du diese HTML-Ausgabe per Variable eintragen willst?

Ich sag dir mal, was ich tun würde: Wie wäre es, wenn du diese overdresste Routine überdenkst und stattdessen einfach pro Modul eine Include-Datei einbindest. In einem eigenen CMS ist die Logik bei mir strikt nach OOP aufgebaut. Aber bei der Ausgabe setze ich auf HTML-Code mit integriertem PHP. Du musst dann lediglich eine Methode schreiben, die die zur jeweiligen Include-Datei gehörenden Daten verwaltet und der jeweils zuständigen Include-Datei zur Verfügung stellt.
 
Ich glaube die Idee ist nicht ganz angekommen. Heutzutage bestehen Webseiten nicht mehr aus einem fixen Template. Jenachdem ist der Aufbau jeder Seite wieder anders, indem man die Anordnung der Sections verändert, oder sogar neue Sections hinzufügt. Die mir bekannten CMS sind entweder zu komplex, gigantisch und schnelllebig, oder einfach wieder zu beschränkt. Ich wollte hier eine kleine Plattform aufbauen, die es mir erlabut in Zukunft ganz einfach Module zu schreiben, die ohne grossen Aufwand und Vorkentnisse in ein Webtemplate eingefügt werden können. Dabei sollen MODUL und CMS komplett unabhängig voneinander laufen können. Keine überschneidungen von Variablen oder sonstigen verwirrenden, komplexialitäten.
Folgende Grafik soll das System kurz darstellen:
Anhang anzeigen 62112

Der 1. Container (Physical HTML Template) besteht aus verschiedenen Views. Das sind letztenendes PHP-Dateien, die den Grundlegenden Style einer Seite mit DIVS definieren. Die DIVS stellen sozusagen die einzelnen Sections dar, die später im Backend beladen werden. In den beannten DIVS sind Variabeln hinterleget. ($_HML["Titel"], $_HML["Content"], etc..).

So weit so gut... Nun zum Backend:

Wenn der User eine Seite (PageID 1) lädt, dann ist in der Datenbank gespeichert, welches Template und welche View zu der Seite mit der ID 1 gerhört. CPage also holt aus der Datenbank die Informationen und included z.B. die View1.php auf der Grafik.
Diese View 1 besteht aus TITEL, MENU, CONTENT und beinhaltet demzufolge genau diese Variablen an den richtigen Stellen.

Nun sollen diese Variablen beschrieben werden. Da auch diese Sections in der Datenbank erfasst sind, werden nun entsprechend einzelnen CSection Instanzen erstellt.
CPage::$a_section[i]=CSection[i] (für TITEL, MENU, CONTENT)

Nun kann ja eine Section mehrere Module beihaltet... z.B. (News, Infos, Kalender, etc..)
Auch dies ist in der Datenbank gespeichert und die Klasse Section instanziert deshlab die einzelnen Module, welche schlussendlich den HTML code liefern.
CSection::$a_modules[i]=CModule[i] (für News, Infos, Kalender)

Und nun zum Problem.. Die Module laufen wie zuvor beschrieben unabhängig. Sie existieren auch ohne das CMS..
Dies garantiert mir später, auch externe Module in mein CMS integrieren zu können, was bis jetzt praktisch kein einziges CMS kann.
Nun die Klasse CMODUL sollte eine Funktion haben, die eine externe PHP-Datei mit einer Klasse aufrufen kann und die Rückgabe der externen Klasse wiederum in einer Variable abfangen kann.

Schlussendlich kann ich dann von der Mainklasse CPage über die CSections auf die einzelnen Modul-Instanzen zugreifen und deren Inhalt (der aus einem externen Code genertiert wurde) in die richtige Section der View ausgeben.

Hoffe es ist verständlich... :D
 
Zuletzt bearbeitet:
Also so wirklich richtig verstehen kann ich dein Problem nicht.

Du willst dynamisch irgendwelche Objekte erstellen. Ich gehe davon aus, dass du sowas wie ...

$CModul->$DynamischesObj = new baba;

... oder ...

$CModul->DynamischesObj[$i] = new baba;

... kennst.

Mein Problem an deinem Ansatz: Eine Klasse ist ja nun keine Funktion. Da macht man nicht einfach einen Aufruf und hinten komme was raus. Evtl. sind mehrere Attribute zu setzen oder Methoden aufzurufen. Kann man sicher auch alles in der DB speichern. Da diese Module aber eh nichts mit dem CMS zu tun haben müssen, würde ich sie wahrscheinlich fertig konfiguriert includen.

Und wenn du nicht zum CMS gehörende Klassen einbinden willst, wird auch jede eine andere Methode zur Ausgabe haben. Das würde ich evtl. über Output-Buffering lösen.

http://php.net/manual/de/ref.outcontrol.php

Aber auch das kennst du sicher.

Ehrlich gesagt, auch nach vielem Lesen verstehe ich dein Problem nicht.
 
Kann den Anhang nicht öffnen. Eigentlich mag ich Konzeptfragen (schön zum Disktuieren) nur leider kann ich wie mein Vorposter auch das Problem nicht ganz überblicken.
 

Neue Beiträge

Zurück