Template-Klasse

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

  • Template-Klasse

    Hallo,

    ich bin seit einigen Tagen dabei, mir eine schöne Template Klasse zu schreiben. Alles funktinoiert soweit auch, aber ich würde gern meine pparse-Methode anders gestalten. Im Moment nutze ich dazu eine foreach Schleife: (Das Template habe ich Teils selber geschrieben, Teils ein wenig geschaut, wie andere Templates es machen, etwas übernommen, was mir gut erschien. In ner vorigen Version gab es das mit den Handlen noch nicht, die hab ich von dem phpbb Template)

    Quellcode

    1. /**
    2. * prints out the parsed template
    3. *
    4. * @access public
    5. * @param string $handle hash to identify the template
    6. * @return boolean
    7. */
    8. function pparse($handle)
    9. {
    10. if (!$this->loadfile($handle))
    11. die("Template->pparse(): Couldn't load template file for handle $handle");
    12. $this->_temporary_data[$handle] = $this->uncompiled_code[$handle];
    13. foreach ($this->_tpldata as $key => $value)
    14. {
    15. $this->_temporary_data[$handle] = str_replace($this->left_delimiter.$key.$this->right_delimiter, $value, $this->_temporary_data[$handle]);
    16. }
    17. $this->compiled_code[$handle] = $this->_temporary_data[$handle];
    18. echo $this->compiled_code[$handle];
    19. $this->_tpldata = array();
    20. return true;
    21. }
    Alles anzeigen


    $this->left_delimiter ist {$ und $this->right_delimiter ist gleich }

    Mich würde gern interessieren, wie 'große' Template Klassen das machen, leider werd ich bei dem Code Gewirr von vLib-Template oder Smarty überhaupt nicht schlau *gg*

    Wie würdet ihr die Methode pparse schreiben?

    Gruß,
    David
  • also da wir Coder alle ans Geheimniskeitprinzip glauben vertraue ich bei meinem Template System darauf, dass str_replace das schnell umsetzt (str_replace kann arrays als ein- und Ausgabeparameter nutzen)

    left- und right delimiter setze ich beim hinzufügen.

    Hier meine Template Klasse (noch nie getestet *gg*)

    Quellcode

    1. <?php
    2. define('PATTERN', '{$%s}');
    3. define('PATH_TPL', '/templates/%s.tpl');
    4. define('PATH_CACHE', '/cache/%s');
    5. define('PATH_FILETYPES', '/cache/known/%s');
    6. define('PATH_ICONS', '/images/download/%s');
    7. /**
    8. * Templatine engine
    9. * @version: 02.11.2006
    10. * @author: Torben Brodt
    11. */
    12. class Template {
    13. private $arr, $html;
    14. /**
    15. * constructor
    16. * @param file -> filename (without template folder and file ending)
    17. */
    18. public function Template($file) {
    19. global $Header; //to update global "last modified"
    20. $path = sprintf(PATH_TPL, $file);
    21. $pattern = sprintf(PATTERN, '([a-Z]*)');
    22. if(!is_file($path) || !is_readable($path))
    23. return new Exception('The template file is not within allowed paths');
    24. preg_match_all("/$pattern/siU", $file, $regex); //fetch all template vars and add to array
    25. $this->arr = array_values($regex[0]);
    26. $this->html = file_get_contents($path);
    27. $Header->add(filemtime($path));
    28. }
    29. /**
    30. * adds template variable and replacement to the list
    31. * @param search -> template variable to replace
    32. * @param replace -> replacement
    33. */
    34. public function add($search, $replace) {
    35. $search = sprintf(PATTERN, $search);
    36. if(!isset($this->arr[$search]))
    37. return new Exception('this template variable does not exist');
    38. else if($this->arr[$search] == '')
    39. $this->arr[$search] = $replace;
    40. else
    41. return new Exception('this template variable is already set');
    42. }
    43. /**
    44. * overwrites the output method
    45. * @return html output
    46. */
    47. public function __toString() {
    48. return str_replace(
    49. array_keys($this->arr),
    50. array_values($this->arr),
    51. $this->html);
    52. }
    53. }
    54. ?>
    Alles anzeigen
  • Man muss sich auch nicht scheuen OpenSource zu nutzen ;)
    Da stecken viele interessante Sachen dahinter.

    Wie gesagt, meine Template Engine kam nie zum Einsatz. Alle Ideen die mir kamen, hat Smarty schon beinhaltet. Also nutze ich jetzt Smarty. Und wenn wir neue Ideen kommen, dann schreib ich mir ein Smarty Plugin.

    Eine interessante SQL Klasse ist die von PEAR.
    pear.php.net/package/DB