| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- <?php
- /**
- * HandlebarMustache class.
- *
- * This is an extended Mustache class which contains file handling for templates
- * and partial templates.
- *
- * Once it's a bit more complete, this class will be merged with the parent Mustache class
- * to provide a full-featured view layer...
- *
- * @extends Mustache
- */
- class HandlebarMustache extends Mustache {
- /**
- * templateBase directory.
- *
- * If none is specified, this will default to `dirname(__FILE__)`.
- *
- * @var string
- * @access protected
- */
- protected $templateBase;
- /**
- * templateName.
- *
- * If none is specified, this will default to an underscorified version of the class name.
- *
- * @var string
- * @access protected
- */
- protected $templateName;
- /**
- * HandlebarMustache class constructor.
- *
- * @access public
- * @param string $template (default: null)
- * @param mixed $view (default: null)
- * @param array $partials (default: null)
- * @return void
- */
- public function __construct($template = null, $view = null, $partials = null) {
- parent::__construct($template,$view,$partials);
- // default template base is the current directory.
- if (!isset($this->templateBase)) {
- $this->setTemplateBase(dirname(__FILE__));
- }
- // default template name is the underscorified class name.
- if (!isset($this->templateName)) {
- $this->templateName = strtolower(preg_replace('#(?<!^)([A-Z]+)#', '_\1', get_class($this)));
- }
- }
- /**
- * Override the current templateBase.
- *
- * @access public
- * @param string $dir
- * @return void
- */
- public function setTemplateBase($dir) {
- if (substr($dir, -1) !== '/') {
- $dir .= '/';
- }
- $this->templateBase = $dir;
- }
- /**
- * Override the default templateName.
- *
- * @access public
- * @param string $name
- * @return void
- */
- public function setTemplateName($name) {
- $this->templateName = $name;
- }
- /**
- * Load a template file. This file will be relative to $this->templateBase.
- * A '.mustache' file extension is assumed if none is provided in $file.
- *
- * @access public
- * @param string $name
- * @return void
- */
- public function loadTemplate($name) {
- if (strpos($name, '.') === false) {
- $name .= '.mustache';
- }
- $filename = $this->templateBase . $name;
- if (file_exists($filename)) {
- $this->template = file_get_contents($filename);
- } else {
- $this->template = null;
- }
- }
- /**
- * Load a partial, either from $this->partials or from a file in the templateBase
- * directory.
- *
- * @access protected
- * @param string $tag_name
- * @return string Partial template.
- */
- protected function getPartial($tag_name) {
- try {
- if ($result = parent::getPartial($tag_name)) {
- return $result;
- }
- } catch (MustacheException $e) {
- // Ignore the UNKNOWN_PARTIAL exceptions, we'll just look for a template file.
- if ($e->getCode() !== MustacheException::UNKNOWN_PARTIAL) {
- throw $e;
- }
- }
- $filename = $this->templateBase . $tag_name . '.mustache';
- if (file_exists($filename)) {
- $this->partials[$tag_name] = file_get_contents($filename);
- return $this->partials[$tag_name];
- } else {
- if ($this->throwPartialExceptions) {
- throw new MustacheException(
- 'Unknown partial: ' . $tag_name,
- MustacheException::UNKNOWN_PARTIAL
- );
- } else {
- return '';
- }
- }
- }
- /**
- * Render the given template and view object.
- *
- * Defaults to the template and view passed to the class constructor unless a new one is provided.
- * Optionally, pass an associative array of partials as well.
- *
- * @access public
- * @param string $template (default: null)
- * @param mixed $view (default: null)
- * @param array $partials (default: null)
- * @return string Rendered Mustache template.
- */
- public function render($template = null, $view = null, $partials = null) {
- if ($template === null && !isset($this->template)) {
- $this->loadTemplate($this->templateName);
- }
- return parent::render($template, $view, $partials);
- }
- }
|