You are not logged in.

  • Login

1

Tuesday, February 12th 2008, 8:19pm

PHP-Anweisung in Templates auswerten

Ich habe mein neues Script auf Basis von Templates aufgebaut. Jetzt muss aber eine PHP-Funktion in einem Templates eingebaut werden, da ich eine Ebene (div-ontainer) bei Übereinstimmung einer gewissen Variable ausblenden muss.

Das Templatecode:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?PHP if ($_SESSION['kndtyp'] = '1') { ?>
<div id="firmenkunde">
    <p>
        <label for="kundenFirma">Firma:</label>
        <input type="text" name="kundenFirma" value="{firma}" id="kundenFirma" class="border" readonly="readonly" />
    </p>
</div>
<?PHP } else { ?>
<div id="privatkunde">
    <p>
        <label for="kundenAnrede">Anrede:</label>
        <input type="text" name="kundenAnrede" value="{anrede}" id="kundenAnrede" class="border" readonly="readonly" />
    </p>
</div>
<?PHP } ?>


Eingepflegt ins Script wird das Template per str_replace

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$searchReplace = array(
	'{lbldomain}' => $lbldomain,
	'{cur}' => $currency,
	'{lblws}' => $lblws
)
 
function get_tpldata($templatename) {
 
if(file_exists($templatename)) {
   $templatecontent = file($templatename);
   return $templatecontent;
} else {
    print_scripterror("Fehler!", "Die Datei: $templatename kann nicht ge&ouml;ffnet werden");
exit;
}
}
 
 
$pdata_output =  get_tdata('templates/content/'.$lang.'/summary.tpl');
$ausgabe = str_replace(array_keys($searchReplace), array_values($searchReplace), $pdata_output);
return $ausgabe;


Wie kann man erreichen, dass man die PHP-Anweisungen in diesem Template trotzdem interpretiert werden?

2

Tuesday, February 12th 2008, 8:26pm

puhh.. du kannst das schon interpretieren lassen. Das geht mit eval. Aber eval ist evil... wirklich ganz böse.
Ich würde dir empfehlen auf eine richtige Template Engine wie smarty umzusteigen, oder aber deine Template Engine mit eigener if-Syntax zu erweitern

Smarty Code

1
2
3
4
5
6
7
8
9
10
{if $variable}
<div id="firmenkunde">
    <p>
        <label for="kundenFirma">Firma:</label>
        <input type="text" name="kundenFirma" value="{firma}" id="kundenFirma" class="border" readonly="readonly" />
    </p>
</div>
{else}
    ....
{/if}


Eine alternative Template Engine ist T-REx, da wird dich PHP0Kid auch sicherlich unterstützen ;)

3

Wednesday, February 13th 2008, 12:09am

Das mit den Smarties habe ich schon gehört. Allerdings habe ich meine Homepage fertig - bis auf dieses templates. Ich brauche auch nur in diesem einen Template eine if/else-Anweisung.

Gibt´s da keine andere Möglichkeit. Eval habe ich auch schon gehört.

Aber wo und wie setze ich die ein. Die Syntax müsste so ähnlich lauten:
$ausgabe = eval ("\$ausgabe = \"$ausgabe\";");

Aber ich weiß nicht wie ich das jetzt einsetzen soll und vor allem wo?

4

Wednesday, February 13th 2008, 9:13am

Klappt dein Code überhaupt? Weil $pdata_output ist ja ein Array und kein String. Eigentlich muss es in Zeile 10 so heißen:

PHP Quellcode

1
$templatecontent = file_get_contents($templatename);


Und wenn du wirklich php ausführen willst, dann so:

PHP Quellcode

1
2
3
4
5
6
7
8
function templateeval($templatename) {
	ob_start();
	$var = file_get_contents($templatename);
	eval($var);
	$contents = ob_get_contents();
	ob_end_clean();
	return $contents;
}


Die Templates sollten aber wirklich nicht von irgendwem geändert werden können.

Beachte, dass eval quasi mit offenem php tag startet und auch so enden muss. Die Datei würde also so aussehen:

HTML Code

1
2
3
4
5
6
if ($_SESSION['kndtyp'] = '1') { ?>
<div id="firmenkunde">
	...
</div>
<?PHP }

5

Thursday, February 14th 2008, 1:47pm

Ich hab dafür mal ne andere Möglichkeit gefunden. Ichhabe in der php-Datei folgende Funktion eingebaut:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function divkndtyp($typ) {
	if ($typ == 'firmenkunde') {
		if ($_SESSION['kndtyp'] == '0') {
			$ausgabe1 = '<div id="'.$typ.'" style="display:none">';
		} else {
			$ausgabe1 = '<div id="'.$typ.'">';
		}
	} else {
		if ($_SESSION['kndtyp'] == '0') {
			$ausgabe1 = '<div id="'.$typ.'">';
		} else {
			$ausgabe1 = '<div id="'.$typ.'" style="display:none">';
		}
	}
	return $ausgabe1;
}


Die $searchReplace-Variable habe ich erweitert um:

PHP Quellcode

1
2
3
4
5
6
7
8
$searchReplace = array(
	'{lbldomain}' => $lbldomain,
	'{cur}' => $currency,
	'{lblws}' => $lblws
	'{divfirmenkunde}' => divkndtyp('firmenkunde'),
	'{divprivatkunde}' => divkndtyp('privatkunde'),
	'{/divkndtyp}' => '</div>',
)


Demnach sieht das template jetzt so aus:

HTML Code

1
2
3
4
5
6
7
8
9
10
11
12
{divfirmenkunde}
    <p>
        <label for="kundenFirma">Firma:</label>
        <input type="text" name="kundenFirma" value="{firma}" id="kundenFirma" class="border" readonly="readonly" />
    </p>
{divkndtyp}
{divprivatkunde}
    <p>
        <label for="kundenAnrede">Anrede:</label>
        <input type="text" name="kundenAnrede" value="{anrede}" id="kundenAnrede" class="border" readonly="readonly" />
    </p>
{divkndtyp}


Das ist doch richtig so, oder? Im Prinzip funktioniert das so auch.

6

Thursday, February 14th 2008, 4:16pm

Es werden aber immer die doppelten Daten übertragen. Außerdem versucht man ja mit einer Template Engine den HTML Kram aus dem Backend zu verbannen. Was du damit nicht machst.

Mach doch einfach statt dem gesamten if/else Block nur einen Template Platzhalter: {loginabfrage}

Und in deiner "Template Engine" lädst du dann nur eins von beiden herein.

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
function foo() {
    if ($_SESSION['kndtyp'] == '0') { 
        return file_get_contents('template1');
    } else {
        return file_get_contents('template2');
    }
}
$searchReplace = array(
	'{loginabfrage}' => foo()
)


Langfristig empfehle ich dir weiterhin Smarty ;)

Similar threads

Social bookmarks