1: | <?php |
2: | |
3: | /** |
4: | * MySQL Resource |
5: | * Resource Implementation based on the Custom API to use |
6: | * MySQL as the storage resource for Smarty's templates and configs. |
7: | * Table definition: |
8: | * <pre>CREATE TABLE IF NOT EXISTS `templates` ( |
9: | * `name` varchar(100) NOT NULL, |
10: | * `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
11: | * `source` text, |
12: | * PRIMARY KEY (`name`) |
13: | * ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre> |
14: | * Demo data: |
15: | * <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello |
16: | * world"}{$x}');</pre> |
17: | * |
18: | * |
19: | * @package Resource-examples |
20: | * @author Rodney Rehm |
21: | */ |
22: | class Smarty_Resource_Mysql extends Smarty_Resource_Custom |
23: | { |
24: | /** |
25: | * PDO instance |
26: | * |
27: | * @var \PDO |
28: | */ |
29: | protected $db; |
30: | |
31: | /** |
32: | * prepared fetch() statement |
33: | * |
34: | * @var \PDOStatement |
35: | */ |
36: | protected $fetch; |
37: | |
38: | /** |
39: | * prepared fetchTimestamp() statement |
40: | * |
41: | * @var \PDOStatement |
42: | */ |
43: | protected $mtime; |
44: | |
45: | /** |
46: | * Smarty_Resource_Mysql constructor. |
47: | * |
48: | * @throws \SmartyException |
49: | */ |
50: | public function __construct() |
51: | { |
52: | try { |
53: | $this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty"); |
54: | } catch (PDOException $e) { |
55: | throw new SmartyException('Mysql Resource failed: ' . $e->getMessage()); |
56: | } |
57: | $this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name'); |
58: | $this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name'); |
59: | } |
60: | |
61: | /** |
62: | * Fetch a template and its modification time from database |
63: | * |
64: | * @param string $name template name |
65: | * @param string $source template source |
66: | * @param integer $mtime template modification timestamp (epoch) |
67: | * |
68: | * @return void |
69: | */ |
70: | protected function fetch($name, &$source, &$mtime) |
71: | { |
72: | $this->fetch->execute(array('name' => $name)); |
73: | $row = $this->fetch->fetch(); |
74: | $this->fetch->closeCursor(); |
75: | if ($row) { |
76: | $source = $row[ 'source' ]; |
77: | $mtime = strtotime($row[ 'modified' ]); |
78: | } else { |
79: | $source = null; |
80: | $mtime = null; |
81: | } |
82: | } |
83: | |
84: | /** |
85: | * Fetch a template's modification time from database |
86: | * |
87: | * @note implementing this method is optional. Only implement it if modification times can be accessed faster than |
88: | * loading the comple template source. |
89: | * |
90: | * @param string $name template name |
91: | * |
92: | * @return integer timestamp (epoch) the template was modified |
93: | */ |
94: | protected function fetchTimestamp($name) |
95: | { |
96: | $this->mtime->execute(array('name' => $name)); |
97: | $mtime = $this->mtime->fetchColumn(); |
98: | $this->mtime->closeCursor(); |
99: | return strtotime($mtime); |
100: | } |
101: | } |
102: |