Modul-Programmierung - externe Klasse einbinden

Hilfe zu Modulen und Tags
Post Reply
User avatar
dc2
Forum Members
Forum Members
Posts: 116
Joined: Tue Jun 02, 2009 8:21 pm

Modul-Programmierung - externe Klasse einbinden

Post by dc2 »

Hallo,

ich bin gerade dabei ein Modul zu schreiben und bin dabei über folgendes Problem gestolpert:
Für das Modul möchte ich eine externe Klasse einsetzen (nennt sich dbtree und ist zum Speichern von hierachischen Daten (MPTT) in der Datenbank).

Mein Modul sieht so aus (Ausschnitt):

[php]
class DlM extends CMSModule
{
var $tree;

function DlM()
{
$this->CMSModule();
$this->InstalledModules = array();

error_reporting(E_ALL);
require('classes/dbtree.class.php');
$table = 'module_dlm_categories';
$prefix = 'dl_category';
$db = $this->GetDb();

//$this->tree = new dbtree(cms_db_prefix().$table, $prefix, $db);
}
}[/php]

Die letzte (auskommentierte) Zeile macht mir dabei Probleme. Das Skript lädt dann etwa 10-20s lang und, dann erscheint eine weiße Seite ohne jeden Inhalt (allerdings wird nicht die max_execution_time von 60s ausgenutzt).

Wenn ich $this->tree durch $tree ersetze, gibt es keinerlei Probleme. Kann mir jemand dabei helfen, ich steig irgendwie nicht so durch ???
NaN

Re: Modul-Programmierung - externe Klasse einbinden

Post by NaN »

Also zunächst würde ich das "require" nicht in den Konstruktor schreiben.
Wenn Dein Modul mehrfach gebraucht wird, könntest Du da Probleme kriegen.
Auch die Schrägstriche sind nicht wirklich optimal, da Du normalerweise nie weißt, auf welchem System Dein Modul später laufen wird.
Besser wäre es, vor der Klasse mit folgender Funktion zu machen:

[php]require_once( cms_join_path( dirname(__FILE__), 'classes', 'dbtree.class.php' ) );[/php]

Damit ist sichergestellt, dass die Pfadangabe zur Datei den korrekten DIRECTORY_SEPARATOR des jeweiligen Betriebssystems enthält.

Die DB Instanz würde ich so übergeben (spart bissel Speicher):

[php]$db =& $this->GetDb();[/php]

Nun weiß ich leider nicht wie die Klasse dbtree arbeitet.
(hatte keine Lust, mich irgendwo registrieren zu müssen, um die Klasse runterzuladen - außerdem wurde meine Emailaddresse als ungültig zurückgewiesen  ::) )
D.h. ich habe keine Ahnung was mit der Variable $this->tree in der Klasse dbtree gemacht wird.
Womöglich kommt es hierbei zu Rekursion.
Oder aber es gibt Probleme bei der Kommunikation mit der DB.
Aber ich bin kein Programmierer, um das jetzt wirklich professionell beurteilen zu können.
User avatar
dc2
Forum Members
Forum Members
Posts: 116
Joined: Tue Jun 02, 2009 8:21 pm

Re: Modul-Programmierung - externe Klasse einbinden

Post by dc2 »

Okay, vielen Dank schonmal für die Tips :)

Der Konstruktor der dbtree-Klasse sieht wie folgt aus:

[php]
function dbtree($table, $prefix, &$db) {
$this->db = &$db;
$this->table = $table;
$this->table_id = $prefix . '_id';
$this->table_left = $prefix . '_left';
$this->table_right = $prefix . '_right';
$this->table_level = $prefix . '_level';
unset($prefix, $table);
}
[/php]

Also keinerlei Rekursion etc. Das Datenbank-Handle wird auch korrekt übergeben (wenn ich in den Konstruktor hinter $this->db = &$db; ein print_r($this->db); einfüge, wird das selbe ausgegeben, wie auch im Modul (also wenn ich dort in den Konstruktur print_r($db); einfüge).

Komisch alles..

Edit: Ich habe einen Hinweis gefunden, dem ich jetzt mal nachgehe. Anscheinend wird der Konstruktor vollständig abgeschlossen. Danach kommt dann allerdings eine Schleife, die sich wohl aufhängt.

Edit 2: Sehr schön - ich habe den Fehler gefunden. Eine Variable war falsch benannt ($tree statt $dbtree), wodruch mein Suchen & Ersetzen von $tree durch $this->tree einen unerwünschten Nebeneffekt hatte  ;D
Last edited by dc2 on Mon Aug 03, 2009 10:13 pm, edited 1 time in total.
Post Reply

Return to “Module und Tags”