PHP-Anweisung in Templates auswerten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 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:

    Quellcode

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


    Eingepflegt ins Script wird das Template per str_replace

    Quellcode

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


    Wie kann man erreichen, dass man die PHP-Anweisungen in diesem Template trotzdem interpretiert werden?
  • puhh.. du kannst das schon interpretieren lassen. Das geht mit [phpdoc]eval[/phpdoc]. 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

    Quellcode

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


    Eine alternative Template Engine ist T-REx, da wird dich PHP0Kid auch sicherlich unterstützen ;)
  • 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?
  • Klappt dein Code überhaupt? Weil $pdata_output ist ja ein Array und kein String. Eigentlich muss es in Zeile 10 so heißen:

    Quellcode

    1. $templatecontent = file_get_contents($templatename);


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

    Quellcode

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


    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:

    Quellcode

    1. if ($_SESSION['kndtyp'] = '1') { ?>
    2. <div id="firmenkunde">
    3. ...
    4. </div>
    5. <?PHP }
  • Ich hab dafür mal ne andere Möglichkeit gefunden. Ichhabe in der php-Datei folgende Funktion eingebaut:

    Quellcode

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


    Die $searchReplace-Variable habe ich erweitert um:

    Quellcode

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


    Demnach sieht das template jetzt so aus:

    Quellcode

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


    Das ist doch richtig so, oder? Im Prinzip funktioniert das so auch.
  • 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.

    Quellcode

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


    Langfristig empfehle ich dir weiterhin Smarty ;)