Antworten auf deine Fragen:
Neues Thema erstellen

Fehlerbehandlung

Top_Gun

Aktives Mitglied

So ich steh mal wieder auf meiner Leitung und brauche Hilfe.

Ich habe in meinem Templatesystem eine Funktion, welche mir Sprachvariablen ersetzen soll. Hierzu definiere ich folgendes Array:
PHP:
$lang['Variable'] = 'Inhalt';
$lang['hier'] = 'ersetzen';
Meine Funktion zum ersetzen sieht nun so aus:
PHP:
private function replaceLangVars($lang) {
        $this->template = preg_replace("/\{L_(.*)\}/isUe", "\$lang[strtolower('\\1')]", $this->template);
    }
Steht in meinem Template nun irgendwo {L_variable} wird dies durch Inhalt ersetzt. Hierbei wird über die regexp das "variable" gesucht und als Index für mein Array eingesetzt um den richtigen Inhalt zu finden.
Klappt soweit auch alles.

Mein Problem ist jetzt:
Wenn ich eine Variable im Template definiert habe, die ich nicht im Array definiert habe, bekomme ich folgenden Fehler:
Code:
[b]Notice[/b]:  Undefined index:  fehler in [b]\template.class.php(227) : regexp code[/b] on line [b]1[/b]
Ist ja auch logisch...

Ich muss also irgendwie abfangen, dass er versucht Variablen zu ersetzen die noch nicht im Array stehen. Ich weiß nur nicht wie... Kann mir mal bitte jemand nen Denkanstoß geben?
 

CIX88

Aktives Mitglied

AW: Fehlerbehandlung

Nanu, die Klasse kenne ich doch ...
Vielleicht das Array erst mit in_array() oder ähnlichen nach der gesuchten Variable abfragen, dann sollte es keine Probleme geben.
 

Top_Gun

Aktives Mitglied

AW: Fehlerbehandlung

Nanu, die Klasse kenne ich doch ...
Kann schon sein, hab das Templatesystem nach nem online Tutorial zusammengebaut und die Namen so übernommen...

Vielleicht das Array erst mit in_array() oder ähnlichen nach der gesuchten Variable abfragen, dann sollte es keine Probleme geben.
JA, das ne Idee. Ich sag ja ich stand auf dem Schlauch, tausend Dank für den Denkanstoß...

Also um nicht ein wildes Schleifen-Konstrukt zu bauen und mehrfach mit preg_match() und preg_replace() zu arbeiten, habe ich versucht das ganze mit preg_replace_callback() zu bauen. Allerdings habe ich dabei wieder ein Problem:
PHP:
    private function replaceLangVars($lang) {
        $this->template = preg_replace_callback("/\{L_(.*)\}/isU",  array(&$this, 'replaceCallback'), $this->template);
    }
    
    private function replaceCallback($treffer,$lang) {
        if(in_array(strtolower($treffer[1]),$lang)){
            return $lang[strtolower($treffer[1])];
        } else {
            return "{L_".$treffer[1]."}";
        }
    }
Die Callback-Funktion wird richtig aufgerufen und der else-Teil funktioniert. Allerdings steht der Funktion das Array $lang noch nicht zur Verfügung da ich dieses nicht mit übergebe. Dadurch folgender Fehler:
Code:
[B]Warning[/B]:  Missing argument 2 for Template::replaceCallback() in [B]\template.class.php[/B] on line [B]231[/B]
[B]Notice[/B]:  Undefined variable: lang in [B]\template.class.php[/B] on line [B]232[/B]
[B]Warning[/B]:  in_array() [[a href='function.in-array']function.in-array[/a]]: Wrong datatype for second argument in [B]\template.class.php[/B] on line [B]232[/B]
Nun mein Problem: Wie übergebe ich das Array?
Ich hab schon vieles ausprobiert und bin immer gescheitert und im Netz hab ich auch nichts gefunden... Mein Problem ist, dass der Callbackaufruf so aussehen muss, da die Funktion in der selben Klasse steht. Hier habe ich aber keine Möglichkeit gefunden das Array zu übergeben...
 

Christian

verpeilt & verschallert

AW: Fehlerbehandlung

Probiers doch mal so:
PHP:
    private function replaceLangVars($lang) {
        $this->template = preg_replace_callback("/\{L_(.*)\}/isU",  array(&$this, 'replaceCallback'), $this->template);
    }
    
    private function replaceCallback($treffer) {
	global $lang;
        if(in_array(strtolower($treffer[1]),$lang)){
            return $lang[strtolower($treffer[1])];
        } else {
            return "{L_".$treffer[1]."}";
        }
    }
 

Top_Gun

Aktives Mitglied

AW: Fehlerbehandlung

Geht so leider nicht...
Die index.php ruft eine Funktion aus der Template.class.php auf, die über include_once das Array $lang zur Verfügung hat und dann an die index.php übergibt. Vor dieser Übergabe ist der Aufruf der replaceLangVars() daher steht hier das $lang zur Verfügung. Und an der Stelle kommt die Callback der ebenfalls das $lang übergeben werden muss, da sie global noch nicht definiert ist...

index.php
PHP:
// Sprachvariablen laden und ersetzen
$langs[] = "allgemein.php";
$lang = $tpl->loadLanguage($langs);
template.class.php
PHP:
     public function loadLanguage($files) {
        $this->languageFiles = $files;

        for( $i = 0; $i < count( $this->languageFiles ); $i++ ) {
            if ( !file_exists( $this->languageDir .$this->languageFiles[$i] ) ) {
                return false;
            } else {
                 include_once( $this->languageDir .$this->languageFiles[$i] );
            }
        }

        $this->replaceLangVars($lang);

        return $lang;
    }

    private function replaceLangVars($lang) {
        $this->template = preg_replace_callback("/\{L_(.*)\}/isU",  array(&$this, 'replaceCallback'), $this->template);
    }
    
    private function replaceCallback($treffer,$lang) {
        print_r($lang);
        if(in_array(strtolower($treffer[1]),$lang)){
            return $lang[strtolower($treffer[1])];
        } else {
            return "{L_".$treffer[1]."}";
        }
    }
Jemand ne andere Idee? Oder kann mir jemand sagen ob es überhaupt möglich ist in dieser Konstellation der Callback einen weiteren Parameter mitzugeben?

EDIT: Nach meinen tollen Ausführungen und 1,5 Stunden Kopfzerbrechen später, habe ich es nun so gelöst:
Die replaceLangVars() ist nun public und wird nicht mehr aus der Funktion loadLanguage() aufgerufen sondern aus der index.php. Da zu diesem Zeitpunkt $lang schon definiert ist, kann ich sie mit global $lang in der Callback-Funktion benutzen.

index.php
PHP:
// Sprachvariablen laden und ersetzen
$langs[] = "allgemein.php";
$lang = $tpl->loadLanguage($langs);
$tpl->replaceLangVars();

template.class.php
PHP:
    public function loadLanguage($files) {
        $this->languageFiles = $files;

        for( $i = 0; $i < count( $this->languageFiles ); $i++ ) {
            if ( !file_exists( $this->languageDir .$this->languageFiles[$i] ) ) {
                return false;
            } else {
                 include_once( $this->languageDir .$this->languageFiles[$i] );
            }
        }

        return $lang;
    }

    public function replaceLangVars() {
        $this->template = preg_replace_callback("/\{L_(.*)\}/isU",  array(&$this, 'replaceCallback'), $this->template);
    }
    
    private function replaceCallback($treffer) {
        global $lang;
        if(isset($lang[strtolower($treffer[1])])){
            return $lang[strtolower($treffer[1])];
        } else {
            return "{L_".$treffer[1]."}";
        }
    }

Das gefällt mir so zwar noch nicht so richtig, aber es funktioniert erstmal. Wenn jemand noch ne andere Lösung kennt, teilt sie bitte mit mir...
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.614
Beiträge
1.538.351
Mitglieder
67.525
Neuestes Mitglied
mgtaucher
Oben