summaryrefslogtreecommitdiff
path: root/demo
diff options
context:
space:
mode:
authormonte.ohrt <monte.ohrt@localhost>2011-09-16 14:19:56 +0000
committermonte.ohrt <monte.ohrt@localhost>2011-09-16 14:19:56 +0000
commit8842e79107dd588fba782ca335133a3f0f70de98 (patch)
tree1c8c8ddc301b0ce1f6c5ebf4e6228db12aa2817f /demo
parent5693de91f5a6a894db763c6b8b24eba49ab5f754 (diff)
downloadsmarty-8842e79107dd588fba782ca335133a3f0f70de98.tar.gz
smarty-8842e79107dd588fba782ca335133a3f0f70de98.tar.bz2
smarty-8842e79107dd588fba782ca335133a3f0f70de98.zip
commit 3.1 into the trunk
Diffstat (limited to 'demo')
-rw-r--r--demo/index.php6
-rw-r--r--demo/index_php_template.php49
-rw-r--r--demo/plugins/cacheresource.apc.php76
-rw-r--r--demo/plugins/cacheresource.memcache.php91
-rw-r--r--demo/plugins/cacheresource.mysql.php152
-rw-r--r--demo/plugins/resource.extendsall.php60
-rw-r--r--demo/plugins/resource.mysql.php76
-rw-r--r--demo/plugins/resource.mysqls.php62
-rw-r--r--demo/templates/index_view.php13
9 files changed, 523 insertions, 62 deletions
diff --git a/demo/index.php b/demo/index.php
index b9ec74ae..74c8e897 100644
--- a/demo/index.php
+++ b/demo/index.php
@@ -1,4 +1,10 @@
<?php
+ /**
+ * Example Application
+
+ * @package Example-application
+ */
+
require('../libs/Smarty.class.php');
$smarty = new Smarty;
diff --git a/demo/index_php_template.php b/demo/index_php_template.php
deleted file mode 100644
index 2f95bf67..00000000
--- a/demo/index_php_template.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-/**
-* Test script for PHP template
-* @author Monte Ohrt <monte at ohrt dot com>
-* @package SmartyTestScripts
-*/
-require('../libs/Smarty.class.php');
-
- class Person
-{
- private $m_szName;
- private $m_iAge;
-
- public function setName($szName)
- {
- $this->m_szName = $szName;
- return $this; // We now return $this (the Person)
- }
-
- public function setAge($iAge)
- {
- $this->m_iAge = $iAge;
- return $this; // Again, return our Person
- }
-
- public function introduce()
- {
- return 'Hello my name is '.$this->m_szName.' and I am '.$this->m_iAge.' years old.';
- }
-}
-
-$smarty = new Smarty();
-$smarty->allow_php_templates= true;
-$smarty->force_compile = false;
-$smarty->caching = true;
-$smarty->cache_lifetime = 100;
-//$smarty->debugging = true;
-
-$smarty->assign('foo',"'bar'");
-
-$person = new Person;
-
-$smarty->assign('person',$person);
-
-$smarty->assign('array',array('a'=>array('aa'=>'This is a long string'),'b'=>2));
-
-$smarty->display('php:index_view.php');
-
-?>
diff --git a/demo/plugins/cacheresource.apc.php b/demo/plugins/cacheresource.apc.php
new file mode 100644
index 00000000..40369e3a
--- /dev/null
+++ b/demo/plugins/cacheresource.apc.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * APC CacheResource
+ *
+ * CacheResource Implementation based on the KeyValueStore API to use
+ * memcache as the storage resource for Smarty's output caching.
+ * *
+ * @package CacheResource-examples
+ * @author Uwe Tews
+ */
+class Smarty_CacheResource_Apc extends Smarty_CacheResource_KeyValueStore {
+
+ public function __construct()
+ {
+ // test if APC is present
+ if(!function_exists('apc_cache_info'))
+ throw new Exception('APC Template Caching Error: APC is not installed');
+ }
+
+ /**
+ * Read values for a set of keys from cache
+ *
+ * @param array $keys list of keys to fetch
+ * @return array list of values with the given keys used as indexes
+ * @return boolean true on success, false on failure
+ */
+ protected function read(array $keys)
+ {
+ $_res = array();
+ $res = apc_fetch($keys);
+ foreach ($res as $k => $v) {
+ $_res[$k] = $v;
+ }
+ return $_res;
+ }
+
+ /**
+ * Save values for a set of keys to cache
+ *
+ * @param array $keys list of values to save
+ * @param int $expire expiration time
+ * @return boolean true on success, false on failure
+ */
+ protected function write(array $keys, $expire=null)
+ {
+ foreach ($keys as $k => $v) {
+ apc_store($k, $v, $expire);
+ }
+ return true;
+ }
+
+ /**
+ * Remove values from cache
+ *
+ * @param array $keys list of keys to delete
+ * @return boolean true on success, false on failure
+ */
+ protected function delete(array $keys)
+ {
+ foreach ($keys as $k) {
+ apc_delete($k);
+ }
+ return true;
+ }
+
+ /**
+ * Remove *all* values from cache
+ *
+ * @return boolean true on success, false on failure
+ */
+ protected function purge()
+ {
+ return apc_clear_cache('user');
+ }
+}
diff --git a/demo/plugins/cacheresource.memcache.php b/demo/plugins/cacheresource.memcache.php
new file mode 100644
index 00000000..230607d6
--- /dev/null
+++ b/demo/plugins/cacheresource.memcache.php
@@ -0,0 +1,91 @@
+<?php
+
+/**
+ * Memcache CacheResource
+ *
+ * CacheResource Implementation based on the KeyValueStore API to use
+ * memcache as the storage resource for Smarty's output caching.
+ *
+ * Note that memcache has a limitation of 256 characters per cache-key.
+ * To avoid complications all cache-keys are translated to a sha1 hash.
+ *
+ * @package CacheResource-examples
+ * @author Rodney Rehm
+ */
+class Smarty_CacheResource_Memcache extends Smarty_CacheResource_KeyValueStore {
+ /**
+ * memcache instance
+ * @var Memcache
+ */
+ protected $memcache = null;
+
+ public function __construct()
+ {
+ $this->memcache = new Memcache();
+ $this->memcache->addServer( '127.0.0.1', 11211 );
+ }
+
+ /**
+ * Read values for a set of keys from cache
+ *
+ * @param array $keys list of keys to fetch
+ * @return array list of values with the given keys used as indexes
+ * @return boolean true on success, false on failure
+ */
+ protected function read(array $keys)
+ {
+ $_keys = $lookup = array();
+ foreach ($keys as $k) {
+ $_k = sha1($k);
+ $_keys[] = $_k;
+ $lookup[$_k] = $k;
+ }
+ $_res = array();
+ $res = $this->memcache->get($_keys);
+ foreach ($res as $k => $v) {
+ $_res[$lookup[$k]] = $v;
+ }
+ return $_res;
+ }
+
+ /**
+ * Save values for a set of keys to cache
+ *
+ * @param array $keys list of values to save
+ * @param int $expire expiration time
+ * @return boolean true on success, false on failure
+ */
+ protected function write(array $keys, $expire=null)
+ {
+ foreach ($keys as $k => $v) {
+ $k = sha1($k);
+ $this->memcache->set($k, $v, 0, $expire);
+ }
+ return true;
+ }
+
+ /**
+ * Remove values from cache
+ *
+ * @param array $keys list of keys to delete
+ * @return boolean true on success, false on failure
+ */
+ protected function delete(array $keys)
+ {
+ foreach ($keys as $k) {
+ $k = sha1($k);
+ $this->memcache->delete($k);
+ }
+ return true;
+ }
+
+ /**
+ * Remove *all* values from cache
+ *
+ * @return boolean true on success, false on failure
+ */
+ protected function purge()
+ {
+ return $this->memcache->flush();
+ }
+}
diff --git a/demo/plugins/cacheresource.mysql.php b/demo/plugins/cacheresource.mysql.php
new file mode 100644
index 00000000..03455c80
--- /dev/null
+++ b/demo/plugins/cacheresource.mysql.php
@@ -0,0 +1,152 @@
+<?php
+
+/**
+ * MySQL CacheResource
+ *
+ * CacheResource Implementation based on the Custom API to use
+ * MySQL as the storage resource for Smarty's output caching.
+ *
+ * Table definition:
+ * <pre>CREATE TABLE IF NOT EXISTS `output_cache` (
+ * `id` CHAR(40) NOT NULL COMMENT 'sha1 hash',
+ * `name` VARCHAR(250) NOT NULL,
+ * `cache_id` VARCHAR(250) NULL DEFAULT NULL,
+ * `compile_id` VARCHAR(250) NULL DEFAULT NULL,
+ * `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ * `content` LONGTEXT NOT NULL,
+ * PRIMARY KEY (`id`),
+ * INDEX(`name`),
+ * INDEX(`cache_id`),
+ * INDEX(`compile_id`),
+ * INDEX(`modified`)
+ * ) ENGINE = InnoDB;</pre>
+ *
+ * @package CacheResource-examples
+ * @author Rodney Rehm
+ */
+class Smarty_CacheResource_Mysql extends Smarty_CacheResource_Custom {
+ // PDO instance
+ protected $db;
+ protected $fetch;
+ protected $fetchTimestamp;
+ protected $save;
+
+ public function __construct() {
+ try {
+ $this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "smarty");
+ } catch (PDOException $e) {
+ throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
+ }
+ $this->fetch = $this->db->prepare('SELECT modified, content FROM output_cache WHERE id = :id');
+ $this->fetchTimestamp = $this->db->prepare('SELECT modified FROM output_cache WHERE id = :id');
+ $this->save = $this->db->prepare('REPLACE INTO output_cache (id, name, cache_id, compile_id, content)
+ VALUES (:id, :name, :cache_id, :compile_id, :content)');
+ }
+
+ /**
+ * fetch cached content and its modification time from data source
+ *
+ * @param string $id unique cache content identifier
+ * @param string $name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @param string $content cached content
+ * @param integer $mtime cache modification timestamp (epoch)
+ * @return void
+ */
+ protected function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime)
+ {
+ $this->fetch->execute(array('id' => $id));
+ $row = $this->fetch->fetch();
+ $this->fetch->closeCursor();
+ if ($row) {
+ $content = $row['content'];
+ $mtime = $row['modified'];
+ } else {
+ $content = null;
+ $mtime = null;
+ }
+ }
+
+ /**
+ * Fetch cached content's modification timestamp from data source
+ *
+ * @note implementing this method is optional. Only implement it if modification times can be accessed faster than loading the complete cached content.
+ * @param string $id unique cache content identifier
+ * @param string $name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @return integer|boolean timestamp (epoch) the template was modified, or false if not found
+ */
+ protected function fetchTimestamp($id, $name, $cache_id, $compile_id)
+ {
+ $this->fetchTimestamp->execute(array('id' => $id));
+ $mtime = $this->fetchTimestamp->fetchColumn();
+ $this->fetchTimestamp->closeCursor();
+ return $mtime;
+ }
+
+ /**
+ * Save content to cache
+ *
+ * @param string $id unique cache content identifier
+ * @param string $name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @param integer|null $exp_time seconds till expiration time in seconds or null
+ * @param string $content content to cache
+ * @return boolean success
+ */
+ protected function save($id, $name, $cache_id, $compile_id, $exp_time, $content)
+ {
+ $this->save->execute(array(
+ 'id' => $id,
+ 'name' => $name,
+ 'cache_id' => $cache_id,
+ 'compile_id' => $compile_id,
+ 'content' => $content,
+ ));
+ return !!$this->save->rowCount();
+ }
+
+ /**
+ * Delete content from cache
+ *
+ * @param string $name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @param integer|null $exp_time seconds till expiration or null
+ * @return integer number of deleted caches
+ */
+ protected function delete($name, $cache_id, $compile_id, $exp_time)
+ {
+ // delete the whole cache
+ if ($name === null && $cache_id === null && $compile_id === null && $exp_time === null) {
+ // returning the number of deleted caches would require a second query to count them
+ $query = $this->db->query('TRUNCATE TABLE output_cache');
+ return -1;
+ }
+ // build the filter
+ $where = array();
+ // equal test name
+ if ($name !== null) {
+ $where[] = 'name = ' . $this->db->quote($name);
+ }
+ // equal test compile_id
+ if ($compile_id !== null) {
+ $where[] = 'compile_id = ' . $this->db->quote($compile_id);
+ }
+ // range test expiration time
+ if ($exp_time !== null) {
+ $where[] = 'modified < DATE_SUB(NOW(), INTERVAL ' . intval($exp_time) . ' SECOND)';
+ }
+ // equal test cache_id and match sub-groups
+ if ($cache_id !== null) {
+ $where[] = '(cache_id = '. $this->db->quote($cache_id)
+ . ' OR cache_id LIKE '. $this->db->quote($cache_id .'|%') .')';
+ }
+ // run delete query
+ $query = $this->db->query('DELETE FROM output_cache WHERE ' . join(' AND ', $where));
+ return $query->rowCount();
+ }
+}
diff --git a/demo/plugins/resource.extendsall.php b/demo/plugins/resource.extendsall.php
new file mode 100644
index 00000000..d8c40b5b
--- /dev/null
+++ b/demo/plugins/resource.extendsall.php
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * Extends All Resource
+ *
+ * Resource Implementation modifying the extends-Resource to walk
+ * through the template_dirs and inherit all templates of the same name
+ *
+ * @package Resource-examples
+ * @author Rodney Rehm
+ */
+class Smarty_Resource_Extendsall extends Smarty_Internal_Resource_Extends {
+
+ /**
+ * populate Source Object with meta data from Resource
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param Smarty_Internal_Template $_template template object
+ * @return void
+ */
+ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null)
+ {
+ $uid = '';
+ $sources = array();
+ $exists = true;
+ foreach ($_template->smarty->getTemplateDir() as $key => $directory) {
+ try {
+ $s = Smarty_Resource::source(null, $source->smarty, '[' . $key . ']' . $source->name );
+ if (!$s->exists) {
+ continue;
+ }
+ $sources[$s->uid] = $s;
+ $uid .= $s->filepath;
+ }
+ catch (SmartyException $e) {}
+ }
+
+ if (!$sources) {
+ $source->exists = false;
+ $source->template = $_template;
+ return;
+ }
+
+ $sources = array_reverse($sources, true);
+ reset($sources);
+ $s = current($sources);
+
+ $source->components = $sources;
+ $source->filepath = $s->filepath;
+ $source->uid = sha1($uid);
+ $source->exists = $exists;
+ if ($_template && $_template->smarty->compile_check) {
+ $source->timestamp = $s->timestamp;
+ }
+ // need the template at getContent()
+ $source->template = $_template;
+ }
+}
+
+?> \ No newline at end of file
diff --git a/demo/plugins/resource.mysql.php b/demo/plugins/resource.mysql.php
new file mode 100644
index 00000000..312f3fc7
--- /dev/null
+++ b/demo/plugins/resource.mysql.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * MySQL Resource
+ *
+ * Resource Implementation based on the Custom API to use
+ * MySQL as the storage resource for Smarty's templates and configs.
+ *
+ * Table definition:
+ * <pre>CREATE TABLE IF NOT EXISTS `templates` (
+ * `name` varchar(100) NOT NULL,
+ * `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ * `source` text,
+ * PRIMARY KEY (`name`)
+ * ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
+ *
+ * Demo data:
+ * <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello world"}{$x}');</pre>
+ *
+ * @package Resource-examples
+ * @author Rodney Rehm
+ */
+class Smarty_Resource_Mysql extends Smarty_Resource_Custom {
+ // PDO instance
+ protected $db;
+ // prepared fetch() statement
+ protected $fetch;
+ // prepared fetchTimestamp() statement
+ protected $mtime;
+
+ public function __construct() {
+ try {
+ $this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "smarty");
+ } catch (PDOException $e) {
+ throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
+ }
+ $this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
+ $this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name');
+ }
+
+ /**
+ * Fetch a template and its modification time from database
+ *
+ * @param string $name template name
+ * @param string $source template source
+ * @param integer $mtime template modification timestamp (epoch)
+ * @return void
+ */
+ protected function fetch($name, &$source, &$mtime)
+ {
+ $this->fetch->execute(array('name' => $name));
+ $row = $this->fetch->fetch();
+ $this->fetch->closeCursor();
+ if ($row) {
+ $source = $row['source'];
+ $mtime = strtotime($row['modified']);
+ } else {
+ $source = null;
+ $mtime = null;
+ }
+ }
+
+ /**
+ * Fetch a template's modification time from database
+ *
+ * @note implementing this method is optional. Only implement it if modification times can be accessed faster than loading the comple template source.
+ * @param string $name template name
+ * @return integer timestamp (epoch) the template was modified
+ */
+ protected function fetchTimestamp($name) {
+ $this->mtime->execute(array('name' => $name));
+ $mtime = $this->mtime->fetchColumn();
+ $this->mtime->closeCursor();
+ return strtotime($mtime);
+ }
+}
diff --git a/demo/plugins/resource.mysqls.php b/demo/plugins/resource.mysqls.php
new file mode 100644
index 00000000..f9fe1c2f
--- /dev/null
+++ b/demo/plugins/resource.mysqls.php
@@ -0,0 +1,62 @@
+<?php
+
+/**
+ * MySQL Resource
+ *
+ * Resource Implementation based on the Custom API to use
+ * MySQL as the storage resource for Smarty's templates and configs.
+ *
+ * Note that this MySQL implementation fetches the source and timestamps in
+ * a single database query, instead of two seperate like resource.mysql.php does.
+ *
+ * Table definition:
+ * <pre>CREATE TABLE IF NOT EXISTS `templates` (
+ * `name` varchar(100) NOT NULL,
+ * `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ * `source` text,
+ * PRIMARY KEY (`name`)
+ * ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
+ *
+ * Demo data:
+ * <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello world"}{$x}');</pre>
+ *
+ * @package Resource-examples
+ * @author Rodney Rehm
+ */
+class Smarty_Resource_Mysqls extends Smarty_Resource_Custom {
+ // PDO instance
+ protected $db;
+ // prepared fetch() statement
+ protected $fetch;
+
+ public function __construct() {
+ try {
+ $this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "smarty");
+ } catch (PDOException $e) {
+ throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
+ }
+ $this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
+ }
+
+ /**
+ * Fetch a template and its modification time from database
+ *
+ * @param string $name template name
+ * @param string $source template source
+ * @param integer $mtime template modification timestamp (epoch)
+ * @return void
+ */
+ protected function fetch($name, &$source, &$mtime)
+ {
+ $this->fetch->execute(array('name' => $name));
+ $row = $this->fetch->fetch();
+ $this->fetch->closeCursor();
+ if ($row) {
+ $source = $row['source'];
+ $mtime = strtotime($row['modified']);
+ } else {
+ $source = null;
+ $mtime = null;
+ }
+ }
+}
diff --git a/demo/templates/index_view.php b/demo/templates/index_view.php
deleted file mode 100644
index 833fe961..00000000
--- a/demo/templates/index_view.php
+++ /dev/null
@@ -1,13 +0,0 @@
-PHP file test
-$foo is <?=$foo?>
-<br> Test functions
-<? echo trim($foo,"'");?>
-<br>Test objects
-<?=$person->setName('Paul')->setAge(39)->introduce()?>
-<br>Test Arrays
-<?=$array['a']['aa']?> <?=$array['b']?>
-<br>function time
-<? echo time();?>
-<br>nocache function time
-<? echo '<? echo time();?>';?>
-<br>DONE