/lib/Motif/Template.php

https://github.com/smarterwebdev/php-motif · PHP · 225 lines · 118 code · 41 blank · 66 comment · 6 complexity · 8ac341adc2fe14d99db5d4bc4fd11ad1 MD5 · raw file

  1. <?php
  2. /* $Id$ */
  3. /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
  4. class Motif_Template
  5. {
  6. protected $_useCache = true;
  7. protected $_vars = array();
  8. protected $_templateFile;
  9. public function __construct($useCache = true)
  10. {
  11. $this->_useCache = $useCache;
  12. }
  13. protected static $_compilationDir;
  14. /**
  15. * Set the directory where compiled templates are cached to
  16. */
  17. public static function setCompilationDir($dir)
  18. {
  19. if (@is_dir($dir) === false)
  20. {
  21. throw new Motif_Template_Exception(sprintf(
  22. 'Motif template compilation directory does not exist. Expected to find "%s"', $dir
  23. ));
  24. }
  25. if (@is_writable($dir) === false)
  26. {
  27. throw new Motif_Template_Exception(sprintf(
  28. 'Motif template compilation directory is not writable. Expected to be able to write to "%s"', $dir
  29. ));
  30. }
  31. self::$_compilationDir = rtrim($dir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
  32. }
  33. /**
  34. * Get the template file
  35. *
  36. */
  37. public function getTemplate()
  38. {
  39. return $this->_templateFile;
  40. }
  41. /**
  42. * Set the template file
  43. *
  44. * @param mixed $file The template file
  45. * @return void
  46. */
  47. public function setTemplate($file)
  48. {
  49. $this->_templateFile = $file;
  50. }
  51. /**
  52. * Check the template exists
  53. *
  54. * @return boolean
  55. */
  56. public function templateExists()
  57. {
  58. return file_exists($this->_templateFile);
  59. }
  60. /**
  61. * Get a set template var
  62. *
  63. * @return mixed
  64. */
  65. public function getVar($name)
  66. {
  67. if (isset($this->_vars[$name]))
  68. {
  69. return $this->_vars[$name];
  70. }
  71. return false;
  72. }
  73. /**
  74. * Get all template vars
  75. *
  76. * @return array
  77. */
  78. public function getVars()
  79. {
  80. return $this->_vars;
  81. }
  82. /**
  83. * Set a template var to given value
  84. *
  85. * @param string $name Template var name
  86. * @param mixed $value Template var value
  87. * @return void
  88. */
  89. public function setVar($name, $value = null)
  90. {
  91. $this->_vars[$name] = $value;
  92. }
  93. /**
  94. * Set all template vars
  95. *
  96. * @param array $vars Template vars
  97. * @return void
  98. */
  99. public function setVars(array $vars)
  100. {
  101. $this->_vars = $vars;
  102. }
  103. /**
  104. * Include an inner template in this template
  105. */
  106. public function includeTemplate($innerTemplate)
  107. {
  108. $innerTemplate = dirname($this->_templateFile) . DIRECTORY_SEPARATOR . $innerTemplate;
  109. /**
  110. * Inner template files does not exist
  111. */
  112. if (file_exists($innerTemplate) === false)
  113. {
  114. throw new Motif_Template_Exception(sprintf(
  115. 'Motif include template does not exist. Expected to find "%s"', $innerTemplate
  116. ));
  117. }
  118. $template = new self($this->_useCache);
  119. $template->setTemplate($innerTemplate);
  120. return $template->_check();
  121. }
  122. /**
  123. * Build out the template
  124. */
  125. public function build()
  126. {
  127. $this->_check();
  128. return $this->_parse();
  129. }
  130. /**
  131. * Check if a template needs to be re-compiled, and do so if necessary
  132. */
  133. protected function _check()
  134. {
  135. if (
  136. (file_exists($this->_file()) === false) ||
  137. (file_exists($this->_templateFile) === false) ||
  138. (filemtime($this->_templateFile) > filemtime($this->_file())) ||
  139. ($this->_useCache === false)
  140. )
  141. {
  142. $this->_compile();
  143. }
  144. return $this->_file();
  145. }
  146. /**
  147. * Parse template with input vars
  148. */
  149. protected function _parse()
  150. {
  151. $engine = new Motif_Engine($this);
  152. $engine->importVars($this->getVars());
  153. $parsed = $engine->parse($this->_file());
  154. $this->setVars($engine->exportVars());
  155. return $parsed;
  156. }
  157. /**
  158. * Compile template to native PHP
  159. */
  160. protected function _compile()
  161. {
  162. $engine = new Motif_Engine($this);
  163. $stripSpace = true;
  164. if (substr($this->_templateFile, -4) === '.txt')
  165. {
  166. $stripSpace = false;
  167. }
  168. $contents = $engine->compile(file_get_contents($this->_templateFile), $stripSpace);
  169. // create temp file
  170. $tmpFile = tempnam('/tmp', 'MOTIF');
  171. file_put_contents($tmpFile, $contents);
  172. // strip php whitespace
  173. // $contents = php_strip_whitespace($tmpFile);
  174. // write final template
  175. file_put_contents($this->_file(), $contents);
  176. chmod($this->_file(), 0777);
  177. // remove temp file
  178. @unlink($tmpFile);
  179. }
  180. protected function _file()
  181. {
  182. return self::$_compilationDir . md5($this->_templateFile) . '.php';
  183. }
  184. }