0251 / 590 837 15
info@a-coding-project.de
;

Einführung Namespaces (CMS)

In unserem CMS werden bisher alle PHP-Klassen aus dem Verzeichnis /system/classes geladen. Das ist auch so nicht schlecht, doch wenn Plugins auf eigene Klassen setzten müssten sie rein theoretisch ihre Klassen dort ablagern. Das macht natürlich nicht wirklich viel Sinn, weshalb ich mir ein Namespace-System ausgedacht habe.

Klassen die aus einem Plugin geladen werden sollen müssen Plugin_{pluginname}_{klassenname} heißen. In dem Skin sollte es eigentlich nur um die Anzeige der Daten gehen. Doch bei der Entwicklung eigener Layouts (zum Beispiel für WordPress) mache ich auch PHP-Änderungen im Theme. Eigentlich Unsinn, aber trotzdem oft sehr hilfreich. Aus diesem Grund habe ich auch einen Namespace für skin-Klassen gemacht. Dort müsen die Klassen Skin_{skinname}_{klassenname} heißen.

Alle Klassen der Plugins bzw. Skins müssen jeweils in einem Unterordner classes liegen. Bei unserem lookaround-Plugin wäre das /system/plugins/lookaround/classes/.

Fehlt nur noch die Umsetzung. Der ganze import findet in der /index.php und in der /admin/index.php in der __autoload Funktion statt. Für die /index.php sieht die neue autoload-Funktion so aus:

  function __autoload($class_name){
    $namespaces = split("_",strtolower($class_name));
    if(sizeOf($namespaces) == 3){
      if($namespaces[0] == "plugin"){
        require_once "system/plugins/".$namespaces[1]."/classes/".$namespaces[2].".php";
        $imported = true;
      }
      else if($namespaces[0] == "skin"){
        require_once "system/skins/".$namespaces[1]."/classes/".$namespaces[2].".php";
        $imported = true;
      }
    }
    if(!$imported){
      require_once "system/classes/".strtolower($class_name).".php";
    }
  }

Der für die /admin/index.php sieht ähnlich aus. eigentlich wollte ich beide in eine Funktion der Klasse sys packen, doch das Problem ist: Die Funktion lädt auch die Klasse sys, weshalb es so nicht möglich ist.

  function __autoload($class_name){
    $namespaces = split("_",strtolower($class_name));
    if(sizeOf($namespaces) == 3){
      if($namespaces[0] == "plugin"){
        require_once "../system/plugins/".$namespaces[1]."/classes/".$namespaces[2].".php";
        $imported = true;
      }
      else if($namespaces[0] == "skin"){
        require_once "../system/skins/".$namespaces[1]."/classes/".$namespaces[2].".php";
        $imported = true;
      }
    }
    if(!$imported){
      require_once "../system/classes/".strtolower($class_name).".php";
    }
  }

Zum Abschluss gibt es heute noch eine Änderung in der /system/classes/pageselector.php. Dieser hat noch die Funktion display, die nicht mehr den Code ausgibt, sondern mit getCode den Code zurückgibt:

<?PHP
  class pageselector extends Control{
    public $style = '';
    
    public function getCode(){
      $res =  "<select name="".$this->name."" style="".$this->style."">";
      $pages = $GLOBALS['db']->ReadRows("SELECT * FROM {'dbprefix'}pages ORDER BY title");
      if($pages){
        foreach($pages as $page){
          if($page->id == $this->value){
            $res .= "<option value="".$page->id."" selected="1">".$page->title."</option>";
          }
          else{
            $res .= "<option value="".$page->id."">".$page->title."</option>";
          }
        }
        $res .= "</select>";
        return $res;
      }
    }
  }
?>