Ankündigung

Einklappen
Keine Ankündigung bisher.

Umsetzung eines Pluginsystems

Einklappen

Neue Werbung 2019

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

  • #16
    Es geht nur um die prinzipielle Möglichkeit beliebigen Code an bestimmten Stellen einzufügen. Wann welche Code zu benutzen ist, ist kein Problem.
    *hmm*

    Ich weis nicht ob wir uns da doch zumindest grob an Regeln halten sollten
    sonst gibt es ja keine Bedingungen selbst für Dynamischen aufruf, oder ?!

    Ich meine das letzte ECHO muss doch wissen wann es gemeint sein muss
    das sagst Du hast Du schon ... wie bist Du da vorgegangen ?

    Ich mache das meist anhand von zahlen.

    *maleinerauchengeh*
    *und dann Thread noch mal durchles*

    Kommentar


    • #17
      hi,

      na gut letzter versuch (:

      um dynamisch zu includen (lazy loading genannt) brauchst du 2 sachen.

      1. module müssen wissen was sie alles brauchen und es selber includen
      2. module sollten in einer festen verzeichniss struktur abgelegt sein um sie
      einfach über namen zu includen.

      beispiel:

      PHP-Code:
      <?
        function require_filter($name)
        {
          $className = 'Filter'.$name;
          if (!class_exists($className))
          {
            include_once(FILTER_PATH.'/'.$className.'.filter.php');    
          }
        }
      ?>

      <?
        require_filter('FormatNumber');
        require_filter('FormatCurrency');
        
        class FormatWhatever
        {
          function execute(&$datasource)
          {
          ....
          }
        }
      ?>

      <?
        require_filter('FormatWhatever');
        require_filter('FormatBBCode');
        
        class FormatFoo
        {
          function execute(&$datasource)
          {
          ....
          }
        }

      Kommentar


      • #18
        Das is doch mal ein Ansatz.
        Fürs erste sollte das genügen, denke ich.
        Ich teste das Ganze mal an und sollte was Produktives dabei herauskommen, poste ich es.
        Danke!

        Kommentar


        • #19
          Ich versuche derzeit etwas ähnliches auf die Beine zu stellen. Zu Hilfe nehme ich die __autoload()-Funktion von PHP5. Somit kann ich benötigte Klassen dynamisch nachladen lassen. Vorraussetzung ist hier natürlich, dass jedes Modul als Klasse dargestellt wird.

          Zur Organisation der Klassen verwende ich den Unterstrich. Jeder Unterstrich wird bei der Suche nach einer Klasse in ein DIRECTORY_SEPARATOR umgewandelt (grobe Beschreibung). Somit kann man die einzelnen Klassen in Ordnern strukturieren.

          Vorteil:
          Die Plugins müssen nicht direkt wissen, was für Abhängigkeiten sie benötigen. Fehlt eine Klasse (Äbhängigkeit von einer anderen Klasse) wird sie automatisch nachgeladen.

          Derzeit spiele ich noch mit zusätzlichen Optionen/Funktionen die der Modulmanager enthalten kann, weshalb Teile unkommentiert sind o.ä., einen Einblick sollte das aber verschaffen können:
          http://beta.webmasterpro.de:60080/sv...dules/molp.php


          Zur Verwirklichung von Filtern würde ich versuchen ein ähnliches Konzept wie Java zu benutzen, bin mir aber unsicher, ob das in PHP klappt.

          Würde grob heißen:
          * Man schreibt ein Interface über dessen Methoden ein Ausgabemodul die Daten bekommt
          * Von dieser Klasse leitet man eine Klasse ab, die die Daten direkt aus der Datenbank liest
          * Nun leitet man weitere Klassen ab, die im Konstruktur eine Klasse vom Typ des Interfaces bekommen und die Daten dieser Klasse in den eigenen Rückgabefunftionen verändern

          Beispiel:
          PHP-Code:
          <?php

          // Deklaration

          interface datasource {
              function 
          getData();
          }

          class 
          datasource_database {
              private 
          $data;
              
              function 
          __construct($id) {
                  
          /*
                  Daten lesen und nach $data schreiben
                  (Ich nehme $data ab hier als einfachen String an)
                  */
              
          }
              
              function 
          getData() {
                  return 
          $data;
              }
          }

          class 
          datasource_filter1 {
              private 
          $source;
              
              function 
          __construct(datasource $source)
              {
                  
          $this->source $source;
              }
              
              function 
          getData()
              {
                  return 
          $source->getData() . '...1';
              }
          }

          class 
          datasource_filter2 {
              private 
          $source;
              
              function 
          __construct(datasource $source)
              {
                  
          $this->source $source;
              }
              
              function 
          getData()
              {
                  return 
          $source->getData() . '...2';
              }
          }

          // Aufruf

          $datasource = new datasource_database(1);
          if (
          /* Bedingung 1 */)
              
          $datasource = new datasource_filter1($datasource);
          if (
          /* Bedingung 2 */)
              
          $datasource = new datasource_filter2($datasource);
          // Anmerkung: Wegen dem Interface ist $datasource in jedem Fall 'instanceof datasource'
          echo $datasource->getData();

          ?>

          Kommentar

          Lädt...
          X