Seite 1 von 1

Fragen zum Autoloader

Verfasst: So 21. Okt 2012, 05:30
von bodil
In der Datei includes/api/functions.api.general.php gibt es die Funktion contenido_include(). Darin gibt es nun die Möglichkeit, Klassen per Autoload zu laden. Die prinzipielle Idee dahinter ist mir in groben Zügen klar, aber vielleicht kann mir trotzdem jemand mal erklären was hier (ab Zeile 111) passiert:

Code: Alles auswählen

      case "classes":
            if (cAutoload::isAutoloadable($cfg['path'][$where] . $what)) {
                // The class file will be loaded automatically by the autoloader - get out here
                return;
            }
            $sInclude = $backendPath  . $cfg['path'][$where] . $what;
            break;
Bzw. um genauer zu fragen: was bedeutet das, wenn eine Klasse nicht geladen werden kann? Woran liegt das? Und warum wird dann der Variable $sInclude ein Wert zugewiesen, der nie wieder benutzt wird?
In meinem konkreten Fall habe ich im Ordner classes einen eigenen Ordner myClasses liegen, ich will mit

Code: Alles auswählen

cinclude("classes", "myClasses/myNaviClass.php");
eine Datei daraus laden. Das scheint (laut Errorlog) fehlzuschlagen, obwohl es bisher immer ging. Und mein Errorlog weiß nichtmal, was da gerade nicht geklappt hat, denn die Variable $include ist ja leer, die relevanten Daten stehen in $sInclude.

Re: Fragen zum Autoloader

Verfasst: So 21. Okt 2012, 11:12
von xmurrix
In der Zeile 111 (und folgende) wird überprüft, ob die Klassen-Datei, die per

Code: Alles auswählen

cInclude("classes", "...");
eingebunden werden soll, im Autoloader registriert ist. Falls ja, wird die Funktion cInclude verlassen, da das Einbinden von Klassen-Dateien vom Autoloader übernommen wird.

In der Version 4.8.17 ist der Autoloader integriert, der sich darum kümmert, CONTENIDO Core Klassen-Dateien zu laden, die braucht man nicht manuell mit

Code: Alles auswählen

cInclude("classes", "someClass.php");
einbinden.

Das funktioniert aber nur mit Klassen, die in CONTENIDO mitgeliefert werden und im Verzeichnis contenido/classes/ liegen. Eigene/Benutzerdefinierte Klassen-Dateien werden nicht vom Autoloader automatisch geladen, die musst du weiterhin mit

Code: Alles auswählen

cinclude("classes", "myClasses/myNaviClass.php");
einbinden, oder diese Klassen im Autoloader registrieren.

Details zum Autoloader und wie man eigene Klassen-Dateien registrieren kann, findest du auch unter "docs/techref/backend/backend.autoloader.html".

Gruß
xmurrix

Re: Fragen zum Autoloader

Verfasst: So 21. Okt 2012, 12:23
von dominik.ziegler
bodil hat geschrieben:eine Datei daraus laden. Das scheint (laut Errorlog) fehlzuschlagen, obwohl es bisher immer ging. Und mein Errorlog weiß nichtmal, was da gerade nicht geklappt hat, denn die Variable $include ist ja leer, die relevanten Daten stehen in $sInclude.
Scheinbar hast du die fehlerhafte Version der 4.8.17 herunter geladen. Für diesen Bereich gibt es bereits einen Fix.
:arrow: http://forum.contenido.org/viewtopic.php?f=63&t=32351
:arrow: oder die 4.8.17 neu herunterladen bzw. auf die 4.8.18 warten, die voraussichtlich morgen erscheint

Re: Fragen zum Autoloader

Verfasst: Fr 9. Nov 2012, 13:59
von derSteffen
Ich will noch ergänzen ...

Wenn man seinen Ordner "Contenido" umbenennt, müssen die Pfade in der config.autoloader.php auch angepasst werden.

Z.B. von so:

Code: Alles auswählen

'Action' => 'contenido/classes/class.action.php',
auf so:

Code: Alles auswählen

'Action' => 'meinneuerordnername/classes/class.action.php',
MfG Steffen