Globale Variable für Config erstellen

Ador

Erfahrenes Mitglied
Hallo,

folgendes möchte ich gerne umsetzen und bin noch unsicher, wie ich es am beste mache.
Und zwar soll es einen Config-File geben, wo ich meinen Grundpfad für das System eintrage (also z.B: "ordner/") sofern das System nicht direkt auf der Domain liegt, sondern in einem Unterordner.

Grund dafür, damit ich eine Variable (z.B. für includes) habe, die ich überall benutzen kann. Sonst kenne ich ja den Pfad zur Datei nicht, die ich per include einbinden möchte. Den Pfad per "../../ordner" usw angeben ist keine Option).

Im grunde brauche ich ja "$_SERVER['HTTP_HOST']" und dann noch etwas um immer den unterordner zu wissen (falls das System im Unterordner liegt).

Wie löst man sowas grundsätzlich?
 
Du willst also in einer Konfigurationsdatei angeben, wo sich ausgehend von dieser Datei das System befindet? Dann nutze doch die magische Konstante __FILE__ und dann weißt Du, wo sich die Datei befindet.
 
Danke für die Antwort.
Das habe ich schon überlegt, aber das Problem ist ja, dass __FILE__ mir den Pfad zur aktuellen Seite gibt. Dann weiß ich aber immer noch nicht, wie ich voin dort zu meinem include ordner komme.
 
Könntest Du kurz einmal deine Verzeichnisstruktur grob niederschreiben? Und dann darin eintragen, wo sich die nötigen Dateien befinden und welchen Pfad Du gerne hättest?
 
Also ich bin im root / und darunter ein unterordner /unterodner
nun möchte ich im unterordner mit dem selben include befehl, die datei einbinden. Der Witz daran ist, dass es für den User einfach sein soll und deshalb darf sich der include Befehl nicht ändern sondern muss so sein, dass er von überall aus geht.

der include müsste also einen festen pfad haben. Wobei aber nicht sicher ist, ob das ganze System an sich direkt im root der Domain liegt / oder z.B. in /cms
 
Du willst also eine include-Funktion haben, die alle Dateien – unabhängig von der aktuellen Positionen – relativ zu einem definierten Pfad lädt?

Nachtrag: Ich habe mal schnell folgendes gebastelt:
PHP:
<?php
  class ImportManager {
    private static $instance = null;
    private        $path     = null;
    
    private function __clone() {}
    private function __wakeup() {}
    
    public static function instance() {
      return (
        self::$instance === null
          ? self::$instance = new self
          : self::$instance
      );
    }
    
    private function __construct() {
      $this->path = __DIR__;
    }
    
    public function set_system_root( $path ) {
      $new_path = realpath( $path );
      
      if ( $new_path === false ) {
        return false;
      }
      
      $this->path = $new_path;
      return true;
    }
    
    public function import( $file ) {
      $path = realpath( $this->path . "/" . $file . ".php" );
      
      if ( $path === false ) {
        return false;
      }
      
      require_once $path;
      return true;
    }
  }
  
  function import( $file ) {
    static $manager;
    $manager = ( $manager === null )
      ? ImportManager::instance()
      : $manager;
    
    return $manager->import( $file );
  }

Jetzt kannst Du wie folgt Dateien laden:
PHP:
# lädt ./controller.php
import( "controller" );
# lädt ./library/cookies.php
import( "library/cookies" );

# oder falls Du das Ausgangsverzeichnis ändern willst ..
ImportManager::instance()->set_system_root( "/www/library" );

# lädt /www/library/cookies.php
import( "cookies" );
 
Zuletzt bearbeitet:
Ok ich hohl mal noch etwas weiter aus.
In meiner Template-Datei (index), kann man mit: <?php showContent('52'); ?> jeden beliebigen Beitrag aus der DB einbinden (z.B: 52..).
In der Templatedatei muss ich nun per include: <?php include("frontend.php"); ?> einbinden, damit dort die benötigten Funktionen zur Verfügung stehen (z.B: showConten()).

Nun kann die Template-Datei aber überall liegen, so z.B. auch in einem Unterodner.
Ich habe aber keinen Einfluss darauf, wo die Template-Dateien liegen werden und kann daher auch nicht selbst den include-Pfad anpassen. Daher brauche ich einen include, wo der Pfad überall stimmt.
 
wo ist denn die "ImportManager" Klasse überall verfügbar?
Muss davon nicht erst mal überall (in der Template-Datei) ein Objekt erzeugt werden, oder include?
 
Du musst die Klasse einmal laden (von dieser weißt Du ja die Position) und von da an kannst Du alles über diese Klasse laden.
 
Zurück