template engine rework

- use smarty3 as default engine
- new pluggable template engine system
This commit is contained in:
Fabrixxm 2013-03-27 10:37:59 -04:00
parent a34b1ceb3a
commit ddf1caf0fd
5 changed files with 136 additions and 34 deletions

View file

@ -386,6 +386,11 @@ if(! class_exists('App')) {
'template_engine' => 'internal', 'template_engine' => 'internal',
); );
// array of registered template engines ('name'=>'class name')
public $template_engines = array();
// array of instanced template engines ('name'=>'instance')
public $template_engine_instance = array();
private $ldelim = array( private $ldelim = array(
'internal' => '', 'internal' => '',
'smarty3' => '{{' 'smarty3' => '{{'
@ -539,6 +544,17 @@ if(! class_exists('App')) {
$mobile_detect = new Mobile_Detect(); $mobile_detect = new Mobile_Detect();
$this->is_mobile = $mobile_detect->isMobile(); $this->is_mobile = $mobile_detect->isMobile();
$this->is_tablet = $mobile_detect->isTablet(); $this->is_tablet = $mobile_detect->isTablet();
/**
* register template engines
*/
$dc = get_declared_classes();
foreach ($dc as $k) {
if (in_array("ITemplateEngine", class_implements($k))){
$this->register_template_engine($k);
}
}
} }
function get_basepath() { function get_basepath() {
@ -712,13 +728,63 @@ if(! class_exists('App')) {
return $this->cached_profile_image[$avatar_image]; return $this->cached_profile_image[$avatar_image];
} }
/**
* register template engine class
* if $name is "", is used class static property $class::$name
* @param string $class
* @param string $name
*/
function register_template_engine($class, $name = '') {
if ($name===""){
$v = get_class_vars( $class );
if(x($v,"name")) $name = $v['name'];
}
if ($name===""){
echo "template engine <tt>$class</tt> cannot be registered without a name.\n";
killme();
}
$this->template_engines[$name] = $class;
}
/**
* return template engine instance. If $name is not defined,
* return engine defined by theme, or default
*
* @param strin $name Template engine name
* @return object Template Engine instance
*/
function template_engine($name = ''){
if ($name!=="") {
$template_engine = $name;
} else {
$template_engine = 'smarty3';
if (x($this->theme, 'template_engine')) {
$template_engine = $this->theme['template_engine'];
}
}
if (isset($this->template_engines[$template_engine])){
if(isset($this->template_engine_instance[$template_engine])){
return $this->template_engine_instance[$template_engine];
} else {
$class = $this->template_engines[$template_engine];
$obj = new $class;
$this->template_engine_instance[$template_engine] = $obj;
return $obj;
}
}
echo "template engine <tt>$template_engine</tt> is not registered!\n"; killme();
}
function get_template_engine() { function get_template_engine() {
return $this->theme['template_engine']; return $this->theme['template_engine'];
} }
function set_template_engine($engine = 'internal') { function set_template_engine($engine = 'smarty3') {
$this->theme['template_engine'] = 'internal'; $this->theme['template_engine'] = 'smarty3';
switch($engine) { switch($engine) {
case 'smarty3': case 'smarty3':
@ -730,11 +796,11 @@ if(! class_exists('App')) {
} }
} }
function get_template_ldelim($engine = 'internal') { function get_template_ldelim($engine = 'smarty3') {
return $this->ldelim[$engine]; return $this->ldelim[$engine];
} }
function get_template_rdelim($engine = 'internal') { function get_template_rdelim($engine = 'smarty3') {
return $this->rdelim[$engine]; return $this->rdelim[$engine];
} }

View file

@ -1,9 +1,9 @@
<?php <?php
require_once "object/TemplateEngine.php";
require_once("library/Smarty/libs/Smarty.class.php"); require_once("library/Smarty/libs/Smarty.class.php");
class FriendicaSmarty extends Smarty { class FriendicaSmarty extends Smarty {
public $filename; public $filename;
function __construct() { function __construct() {
@ -37,7 +37,33 @@ class FriendicaSmarty extends Smarty {
} }
return $this->fetch('file:' . $this->filename); return $this->fetch('file:' . $this->filename);
} }
} }
class FriendicaSmartyEngine implements ITemplateEngine {
static $name ="smarty3";
// ITemplateEngine interface
public function replace_macros($s, $r) {
$template = '';
if(gettype($s) === 'string') {
$template = $s;
$s = new FriendicaSmarty();
}
foreach($r as $key=>$value) {
if($key[0] === '$') {
$key = substr($key, 1);
}
$s->assign($key, $value);
}
return $s->parsed($template);
}
public function get_template_file($file, $root=''){
$a = get_app();
$template_file = get_template_file($a, 'smarty3/' . $file, $root);
$template = new FriendicaSmarty();
$template->filename = $template_file;
return $template;
}
}

View file

@ -1,8 +1,10 @@
<?php <?php
require_once 'object/TemplateEngine.php';
define("KEY_NOT_EXISTS", '^R_key_not_Exists^'); define("KEY_NOT_EXISTS", '^R_key_not_Exists^');
class Template { class Template implements ITemplateEngine {
static $name ="internal";
var $r; var $r;
var $search; var $search;
@ -256,7 +258,8 @@ class Template {
return $s; return $s;
} }
public function replace($s, $r) { // TemplateEngine interface
public function replace_macros($s, $r) {
$this->r = $r; $this->r = $r;
// remove comments block // remove comments block
@ -276,12 +279,18 @@ class Template {
$count++; $count++;
$s = $this->var_replace($s); $s = $this->var_replace($s);
} }
return $s; return template_unescape($s);
}
public function get_template_file($file, $root='') {
$a = get_app();
$template_file = get_template_file($a, $file, $root);
$content = file_get_contents($template_file);
return $content;
} }
} }
$t = new Template;
function template_escape($s) { function template_escape($s) {

View file

@ -15,39 +15,20 @@ if(! function_exists('replace_macros')) {
/** /**
* This is our template processor * This is our template processor
* *
* @global Template $t
* @param string|FriendicaSmarty $s the string requiring macro substitution, * @param string|FriendicaSmarty $s the string requiring macro substitution,
* or an instance of FriendicaSmarty * or an instance of FriendicaSmarty
* @param array $r key value pairs (search => replace) * @param array $r key value pairs (search => replace)
* @return string substituted string * @return string substituted string
*/ */
function replace_macros($s,$r) { function replace_macros($s,$r) {
global $t;
$stamp1 = microtime(true); $stamp1 = microtime(true);
$a = get_app(); $a = get_app();
if($a->theme['template_engine'] === 'smarty3') { $t = $a->template_engine();
$template = ''; $output = $t->replace_macros($s,$r);
if(gettype($s) === 'string') {
$template = $s;
$s = new FriendicaSmarty();
}
foreach($r as $key=>$value) {
if($key[0] === '$') {
$key = substr($key, 1);
}
$s->assign($key, $value);
}
$output = $s->parsed($template);
}
else {
$r = $t->replace($s,$r);
$output = template_unescape($r);
}
$a = get_app();
$a->save_timestamp($stamp1, "rendering"); $a->save_timestamp($stamp1, "rendering");
return $output; return $output;
@ -582,6 +563,14 @@ function get_markup_template($s, $root = '') {
$stamp1 = microtime(true); $stamp1 = microtime(true);
$a = get_app(); $a = get_app();
$t = $a->template_engine();
$template = $t->get_template_file($s, $root);
$a->save_timestamp($stamp1, "file");
return $template;
/*
if($a->theme['template_engine'] === 'smarty3') { if($a->theme['template_engine'] === 'smarty3') {
$template_file = get_template_file($a, 'smarty3/' . $s, $root); $template_file = get_template_file($a, 'smarty3/' . $s, $root);
@ -602,6 +591,7 @@ function get_markup_template($s, $root = '') {
return $content; return $content;
} }
*/
}} }}
if(! function_exists("get_template_file")) { if(! function_exists("get_template_file")) {

11
object/TemplateEngine.php Normal file
View file

@ -0,0 +1,11 @@
<?php
require_once 'boot.php';
/**
* Interface for template engines
*/
interface ITemplateEngine {
public function replace_macros($s,$v);
public function get_template_file($file, $root='');
}