Pluginsystem

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Pluginsystem

    Hallo liebe Forumsgemeinde ;-)

    ich arbeite seit längerem schon mit PHP, habe allerdings noch nie Schritte in Richtung OOP unternommen. Das hat sich jetzt geändert. In den letzten Tagen hab ich mich intensiv damit beschäftigt, weil mir die einfachen PHP-Bordmittel für ein größeres Projekt (scheinbar) nicht mehr ausreichen.

    Ich bin dabei, ein modulares CMS zu schreiben. Bedienkomfort und leichte handhabung stehen dabei im Vordergrund, deshalb möchte ich das CMS modular über Plugins aufbauen. Also einen "PHP-Core" schreiben (mit den Grundfunktionen), der sich dann - auch vom Kunden - über Plugins einfach erweitern lässt.

    Wenn ich ein Plugin auf Knopfdruck installiere, will ich natürlich nicht auch noch irgendwelche Code-Anpassungen vornehmen müssen! Das erfordert dann aber, dass ich bestimmte Code-Stellen bzw. Funktionen "überschreiben" müsste. Dadurch bin ich dann auf die OOP-Schiene gekommen, wobei ich da momentan auch noch keinen Ansatzpunkt finde.

    Um das ganze mal etwas konkreter zu machen, will ich's euch kurz anhand eines Beispiels erläutern:


    Angenommen die Grundfunktion würde nur das Anlegen einer statischen Seite (à la Wordpress) erlauben. Die Ausgabe dieser Seite würde über die Funktion get_content() erfolgen.
    Jetzt will der Kunde eine oder mehrere Seiten aber in Blog-Form gestalten, also installiert er das Blog-Plugin. Die Ausgabe der Blog-Inhalte erfordert im Hintergrund aber anderen Code als die Ausgabe einer statischen Seite. Die Funktion get_content() muss aber die gleiche bleiben, weil ich ja explizit NICHT den Code (in z.B. get_blog_content() ändern will.
    Versteht ihr was ich meine?
    Ein Ansatzpunkt wäre z.B., dass ich die zwei Funktionen bzw. Klassen in zwei getrennten Dateien speichere, und jenachdem ob das Blog-Plugin aktiviert ist oder nicht, die eine oder andere Datei einlesen. Dann müsste ich das aber im Core-Code definieren. Also z.B. über ein Switch. Das setzt aber voraus, dass ich weiß, welche Plugins es später alles geben wird => schlecht!


    Hat von euch jemand vielleicht eine Idee wie man das ganze so modular anpassen könnte? Und ist OOP da wirklich notwendig?
    Wäre super wenn mir da jemand weietrhelfen könnte, bei mir hängt's leider grad n bisschen

  • #2
    Hi,

    du musst dir vorher genau überlegen an welcher stelle plugins
    sich in dein bestehendes system einklinken lassen. Man kann
    nich hingehen und sagen: "alles wird auch von plugins lösbar sein".
    Nehmen wir mal ein ausgabeplugin an das rss-atom-feeds aus
    den daten erzeugt. Das plugin muss eine möglichkeit bekommen
    aufgerufen/benutzt zu werden. Das musst du als derjenige der
    die schnittstelle designed entsprechend vorbereiten. Dann musst
    du den plugins ermöglichen diverse informationen zu erhalten.
    Dazu könntest du vll deine modelle für die pluginsverfügbar machen.
    Um den rest kann sich beispielsweise ein outputplugin selbst kümmern.
    Wenn es um systeminterna geht musst du vll noch hooks in deine
    controllerapi einbauen. Das hängt alles von deinem konkreten
    design ab.

    greets
    (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

    Kommentar


    • #3
      ungefehr
      PHP-Code:
      class Anwendung{
      var 
      $plugin;
      function 
      Anwendung(){
      //1)jeder modul liegt in einem ordner Module
      //2)in jedem moduleordner liegt class der von
      //Plugin abgeleitet ist, und hat die name von Module
      if(isset($_REQUEST['mod']) && file_exist("/module/".$_REQUEST['mod']))
      {
      //url?mod=blog
      include("module/".$_REQUEST['mod']."/class.".$_REQUEST['mod'].".php");
      $this->plugin=new $_REQUEST['mod']."Plugin";
      $this->plugin->get_content();
      ..........
       }
      }

      //Abstract, und muss bei neuem Plugin überschrieben werden
      class Plugin{
      function 
      get_content(){}

      jetzt machst du ein neue Modul und erstellst in dem Modulordner eine klasse , die
      1)von Plugin abgeleitet ist und die methode get_content hat
      2)die classe muss name von Modul+Plugin heisen. also bei blog ist das "blogPlugin"
      3) ordner in dem modul dateien gespeichert sind muss gleiche name wie modul haben, (in unserem fall "blog")
      4)der ordner muss in ordner module plaziert sein.

      etwa so
      PHP-Code:
      class blogPlugin extends Plugin{
        function 
      get_content(){
        
      //implemintation von get_content für blogPlugin
        
      }

      Zuletzt geändert von Slava; 16.02.2007, 00:08.
      Slava
      bituniverse.com

      Kommentar


      • #4
        Vielleicht is MVC Design Pattern was für dich.


        Hier findest du eine Reihe guter Links zum Thema

        http://www.ralfeggert.de/2006/09/04/...iew-controller

        Kommentar


        • #5
          danke für eure tipps, jungs! :-)

          MVC werd ich mir morgen mal näher anschauen, ich glaub das kann man nicht mal nur schnell überfliegen... *g*

          @Slava: danke für deine Hilfe! ich habs mal weiterentwickelt und ausprobiert, hat aber leider nicht geklappt. dank deinem ansatz bin ich aber - bisher nur auf dem papier - auf eine lösung gekommen und werde die morgen gleich mal austesten.

          ich halte euch auf dem laufenden ;-)

          Kommentar


          • #6
            lass papier an die seite, und lade dir ArgoUML.
            Dann kannst du auch direkt die klassen generieren lassen.
            Slava
            bituniverse.com

            Kommentar


            • #7
              Original geschrieben von Slava
              lass papier an die seite, und lade dir ArgoUML.
              Dann kannst du auch direkt die klassen generieren lassen.
              Wenn du aber noch keine ahnung von UML hast dann lass es erstmal.
              Konzentrier dich auf dein problem und schreib es dir so auf dass du es verstehst. Später kannst du immernoch einen abstecher
              in die uml-welt machen.

              greets
              (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

              Kommentar


              • #8
                Original geschrieben von closure
                Wenn du aber noch keine ahnung von UML hast dann lass es erstmal.
                Konzentrier dich auf dein problem und schreib es dir so auf dass du es verstehst. Später kannst du immernoch einen abstecher
                in die uml-welt machen.

                greets
                bingo! so hab ichs auch gemacht ;-) da bin ich noch etwas "altmodisch" was so konzeptionsdinge angeht... ich scribble lieber aufm papier rum also mich da durch kästchen und verbindungen durchzuklicken... und von UML hab ich eben wirklich noch keine Ahnung ;-) *g*

                werd mich heute abend mal an die Umsetzung machen, wenn ich ausm büro zurück bin ;-)


                Grüße, tobias

                Kommentar

                Lädt...
                X