Chris@0
|
1 <?php
|
Chris@0
|
2 /*
|
Chris@0
|
3 * This file is part of the Text_Template package.
|
Chris@0
|
4 *
|
Chris@0
|
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
|
Chris@0
|
6 *
|
Chris@0
|
7 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
8 * file that was distributed with this source code.
|
Chris@0
|
9 */
|
Chris@0
|
10
|
Chris@0
|
11 /**
|
Chris@0
|
12 * A simple template engine.
|
Chris@0
|
13 *
|
Chris@0
|
14 * @since Class available since Release 1.0.0
|
Chris@0
|
15 */
|
Chris@0
|
16 class Text_Template
|
Chris@0
|
17 {
|
Chris@0
|
18 /**
|
Chris@0
|
19 * @var string
|
Chris@0
|
20 */
|
Chris@0
|
21 protected $template = '';
|
Chris@0
|
22
|
Chris@0
|
23 /**
|
Chris@0
|
24 * @var string
|
Chris@0
|
25 */
|
Chris@0
|
26 protected $openDelimiter = '{';
|
Chris@0
|
27
|
Chris@0
|
28 /**
|
Chris@0
|
29 * @var string
|
Chris@0
|
30 */
|
Chris@0
|
31 protected $closeDelimiter = '}';
|
Chris@0
|
32
|
Chris@0
|
33 /**
|
Chris@0
|
34 * @var array
|
Chris@0
|
35 */
|
Chris@0
|
36 protected $values = array();
|
Chris@0
|
37
|
Chris@0
|
38 /**
|
Chris@0
|
39 * Constructor.
|
Chris@0
|
40 *
|
Chris@0
|
41 * @param string $file
|
Chris@0
|
42 * @throws InvalidArgumentException
|
Chris@0
|
43 */
|
Chris@0
|
44 public function __construct($file = '', $openDelimiter = '{', $closeDelimiter = '}')
|
Chris@0
|
45 {
|
Chris@0
|
46 $this->setFile($file);
|
Chris@0
|
47 $this->openDelimiter = $openDelimiter;
|
Chris@0
|
48 $this->closeDelimiter = $closeDelimiter;
|
Chris@0
|
49 }
|
Chris@0
|
50
|
Chris@0
|
51 /**
|
Chris@0
|
52 * Sets the template file.
|
Chris@0
|
53 *
|
Chris@0
|
54 * @param string $file
|
Chris@0
|
55 * @throws InvalidArgumentException
|
Chris@0
|
56 */
|
Chris@0
|
57 public function setFile($file)
|
Chris@0
|
58 {
|
Chris@0
|
59 $distFile = $file . '.dist';
|
Chris@0
|
60
|
Chris@0
|
61 if (file_exists($file)) {
|
Chris@0
|
62 $this->template = file_get_contents($file);
|
Chris@0
|
63 }
|
Chris@0
|
64
|
Chris@0
|
65 else if (file_exists($distFile)) {
|
Chris@0
|
66 $this->template = file_get_contents($distFile);
|
Chris@0
|
67 }
|
Chris@0
|
68
|
Chris@0
|
69 else {
|
Chris@0
|
70 throw new InvalidArgumentException(
|
Chris@0
|
71 'Template file could not be loaded.'
|
Chris@0
|
72 );
|
Chris@0
|
73 }
|
Chris@0
|
74 }
|
Chris@0
|
75
|
Chris@0
|
76 /**
|
Chris@0
|
77 * Sets one or more template variables.
|
Chris@0
|
78 *
|
Chris@0
|
79 * @param array $values
|
Chris@0
|
80 * @param bool $merge
|
Chris@0
|
81 */
|
Chris@0
|
82 public function setVar(array $values, $merge = TRUE)
|
Chris@0
|
83 {
|
Chris@0
|
84 if (!$merge || empty($this->values)) {
|
Chris@0
|
85 $this->values = $values;
|
Chris@0
|
86 } else {
|
Chris@0
|
87 $this->values = array_merge($this->values, $values);
|
Chris@0
|
88 }
|
Chris@0
|
89 }
|
Chris@0
|
90
|
Chris@0
|
91 /**
|
Chris@0
|
92 * Renders the template and returns the result.
|
Chris@0
|
93 *
|
Chris@0
|
94 * @return string
|
Chris@0
|
95 */
|
Chris@0
|
96 public function render()
|
Chris@0
|
97 {
|
Chris@0
|
98 $keys = array();
|
Chris@0
|
99
|
Chris@0
|
100 foreach ($this->values as $key => $value) {
|
Chris@0
|
101 $keys[] = $this->openDelimiter . $key . $this->closeDelimiter;
|
Chris@0
|
102 }
|
Chris@0
|
103
|
Chris@0
|
104 return str_replace($keys, $this->values, $this->template);
|
Chris@0
|
105 }
|
Chris@0
|
106
|
Chris@0
|
107 /**
|
Chris@0
|
108 * Renders the template and writes the result to a file.
|
Chris@0
|
109 *
|
Chris@0
|
110 * @param string $target
|
Chris@0
|
111 */
|
Chris@0
|
112 public function renderTo($target)
|
Chris@0
|
113 {
|
Chris@0
|
114 $fp = @fopen($target, 'wt');
|
Chris@0
|
115
|
Chris@0
|
116 if ($fp) {
|
Chris@0
|
117 fwrite($fp, $this->render());
|
Chris@0
|
118 fclose($fp);
|
Chris@0
|
119 } else {
|
Chris@0
|
120 $error = error_get_last();
|
Chris@0
|
121
|
Chris@0
|
122 throw new RuntimeException(
|
Chris@0
|
123 sprintf(
|
Chris@0
|
124 'Could not write to %s: %s',
|
Chris@0
|
125 $target,
|
Chris@0
|
126 substr(
|
Chris@0
|
127 $error['message'],
|
Chris@0
|
128 strpos($error['message'], ':') + 2
|
Chris@0
|
129 )
|
Chris@0
|
130 )
|
Chris@0
|
131 );
|
Chris@0
|
132 }
|
Chris@0
|
133 }
|
Chris@0
|
134 }
|
Chris@0
|
135
|