SHOW:
|
|
- or go back to the newest paste.
| 1 | - | public function phpize_var($var) |
| 1 | + | <?php |
| 2 | ||
| 3 | /** | |
| 4 | * | |
| 5 | * | |
| 6 | * @author Sebastian Büttner <[email protected]> | |
| 7 | * @package void | |
| 8 | * @version 1.0.0 | |
| 9 | * @copyright (c) 2013, powerserverplus.net | |
| 10 | */ | |
| 11 | ||
| 12 | class FileNotFoundException extends Exception {}
| |
| 13 | ||
| 14 | class Template | |
| 15 | {
| |
| 16 | /** | |
| 17 | * Whether to use debugging or not | |
| 18 | */ | |
| 19 | const DEBUG = true; | |
| 20 | ||
| 21 | /** | |
| 22 | * @var String Path to tempalte dir | |
| 23 | */ | |
| 24 | const template_dir = 'templates'; | |
| 25 | ||
| 26 | /** | |
| 27 | * @var String (sub)template filename | |
| 28 | - | $php .= 'array(';
|
| 28 | + | */ |
| 29 | protected $template = ''; | |
| 30 | ||
| 31 | /** | |
| 32 | - | $php .= $this->phpize_var($key) . |
| 32 | + | * @var Array data to be used within the template |
| 33 | */ | |
| 34 | - | $this->phpize_var($value) . |
| 34 | + | protected $data; |
| 35 | ||
| 36 | /** | |
| 37 | * Template constructor | |
| 38 | * | |
| 39 | * @param String $templ name of the template | |
| 40 | */ | |
| 41 | public function __construct($templ, $layout = 'index') | |
| 42 | {
| |
| 43 | $this->load($layout); | |
| 44 | ||
| 45 | $this->data = array(); | |
| 46 | $this->assign('subtemplate', $templ);
| |
| 47 | } | |
| 48 | ||
| 49 | /** | |
| 50 | * Save a passed variable for later use in template | |
| 51 | * | |
| 52 | * @param String $name name of the varaible used to identify | |
| 53 | - | } |
| 53 | + | * @param Mixed $value value to be assigned to the variable |
| 54 | */ | |
| 55 | public function assign($name, $value) | |
| 56 | {
| |
| 57 | /* Separate name by dot */ | |
| 58 | $path = explode('.', $name);
| |
| 59 | ||
| 60 | /* Take the last element of the array, as this is our final identifier */ | |
| 61 | $lastKey = array_pop($path); | |
| 62 | ||
| 63 | /* Create / fill array structure, start with the template`s data base array */ | |
| 64 | $parent = &$this->data; | |
| 65 | ||
| 66 | /* Iterate through the given name structure... */ | |
| 67 | foreach ($path as $key) | |
| 68 | {
| |
| 69 | /* ...And create substructres where needed */ | |
| 70 | if (!isset($parent[$key])) | |
| 71 | $parent[$key] = array(); | |
| 72 | ||
| 73 | /* Move the parent `pointer` deeper within the structure */ | |
| 74 | $parent = &$parent[$key]; | |
| 75 | } | |
| 76 | ||
| 77 | /* Finally assign the value to the deepest element in structure */ | |
| 78 | $parent[$lastKey] = $value; | |
| 79 | } | |
| 80 | ||
| 81 | /* | |
| 82 | * | |
| 83 | */ | |
| 84 | public function phpize_var($var, $intend = false) | |
| 85 | {
| |
| 86 | $php = ''; | |
| 87 | ||
| 88 | switch ( gettype($var) ) | |
| 89 | {
| |
| 90 | case 'boolean': | |
| 91 | $php .= $var === true ? 'true' : 'false'; | |
| 92 | ||
| 93 | break; | |
| 94 | ||
| 95 | case 'integer': | |
| 96 | case 'double': | |
| 97 | $php .= $var; | |
| 98 | ||
| 99 | break; | |
| 100 | ||
| 101 | case 'string': | |
| 102 | $php .= "'" . | |
| 103 | str_replace("'", "\\'", $var) .
| |
| 104 | "'"; | |
| 105 | ||
| 106 | break; | |
| 107 | ||
| 108 | case 'object': | |
| 109 | $php .= '(object)'; | |
| 110 | case 'array': | |
| 111 | $php .= 'array(' . ($intend ? "\n" : '') ;
| |
| 112 | ||
| 113 | foreach ($var as $key => $value) | |
| 114 | {
| |
| 115 | $php .= $this->phpize_var($key, $intend) . | |
| 116 | ' => ' . | |
| 117 | $this->phpize_var($value, $intend) . | |
| 118 | ', '; | |
| 119 | ||
| 120 | if ($intend) | |
| 121 | $php .= "\n"; | |
| 122 | } | |
| 123 | ||
| 124 | $php .= ')'; | |
| 125 | ||
| 126 | break; | |
| 127 | ||
| 128 | case 'NULL': | |
| 129 | $php .= 'NULL'; | |
| 130 | ||
| 131 | break; | |
| 132 | ||
| 133 | case 'resource': | |
| 134 | default: | |
| 135 | ||
| 136 | } | |
| 137 | ||
| 138 | if ($intend) | |
| 139 | $php = str_replace("\n", "\n ", $php);
| |
| 140 | ||
| 141 | return $php; | |
| 142 | } | |
| 143 | ||
| 144 | /** | |
| 145 | * Prepare and display the tempalte | |
| 146 | * | |
| 147 | */ | |
| 148 | public function display() | |
| 149 | {
| |
| 150 | /* We start with no code */ | |
| 151 | $template_code = ''; | |
| 152 | ||
| 153 | /* Merge template data with session-flash data */ | |
| 154 | $data = $this->data; | |
| 155 | ||
| 156 | if (isset($_SESSION['appends']) && is_array($_SESSION['appends']) && !empty($_SESSION['appends'])) | |
| 157 | $data = array_merge($data, $_SESSION['appends']); | |
| 158 | ||
| 159 | $_SESSION['appends'] = array(); | |
| 160 | ||
| 161 | /* And iterate then over all passed variables, making them executable code again */ | |
| 162 | foreach ($data as $key => $value) | |
| 163 | {
| |
| 164 | /* Secure that variables are valid for php */ | |
| 165 | if (! preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/ims', $key) )
| |
| 166 | continue; | |
| 167 | ||
| 168 | /* Add a new line to the template code */ | |
| 169 | $template_code .= | |
| 170 | /* Write varaible name */ | |
| 171 | '$' . $key . ' = ' . $this->phpize_var($value, true) . ';' . "\n"; | |
| 172 | ||
| 173 | } | |
| 174 | ||
| 175 | $template_vars = $template_code; | |
| 176 | ||
| 177 | /* Put a php close tag, as we are continuing with out html-code-template */ | |
| 178 | $template_code .= '?>'; | |
| 179 | ||
| 180 | /* Append the template */ | |
| 181 | $template_code .= file_get_contents($this->template); | |
| 182 | ||
| 183 | /* Execute the build string as PHP-Code */ | |
| 184 | eval($template_code); | |
| 185 | ||
| 186 | /* Debug */ | |
| 187 | ||
| 188 | if (self::DEBUG) | |
| 189 | {
| |
| 190 | echo "<div style='display: none; width: 80%; position: absolute; top: 50px; left: 50%; margin-left: -45%; background: url(/images/bg.png); z-index: 1001; border-radius: 8px; border: 4px solid #E6572C; padding: 30px; color: #555; text-shadow: 0 1px 1px #fff ' id='debug'>\n"; | |
| 191 | echo "<h3 style='font-style: normal; color: #E6572C; border-bottom: 2px solid #bbb; margin-bottom: 20px;'>Template vars:</h3><pre style='background: #ffffff; border-radius: 2px; border: 1px solid #aaa; padding: 5px; margin: 10px 0;'>" . ($template_vars) . "</pre>"; | |
| 192 | echo "</div>"; | |
| 193 | } | |
| 194 | echo "<script type='text/javascript'>$(document).ready( function(){ $(document).keypress( function(e){ if (e.keyCode == 100) $('#debug').slideToggle() } ) } );</script>\n";
| |
| 195 | } | |
| 196 | ||
| 197 | /** | |
| 198 | * Includes a given template by name | |
| 199 | * | |
| 200 | * @param String $templ the name of the tempalte file to be included | |
| 201 | */ | |
| 202 | static function getInclude($templ) | |
| 203 | {
| |
| 204 | /* Build the full path of the file to load */ | |
| 205 | $filename = Template::template_dir . '/' . $templ . '.template.php'; | |
| 206 | ||
| 207 | /* Check whether the requested file does exist, if not throw exception */ | |
| 208 | if ( ! file_exists($filename) ) | |
| 209 | throw new FileNotFoundException('Template file ' . $filename . ' not found.');
| |
| 210 | ||
| 211 | /* return the filename to include */ | |
| 212 | return $filename; | |
| 213 | } | |
| 214 | ||
| 215 | /** | |
| 216 | * Helper function, gives $default back when $var is unset | |
| 217 | * | |
| 218 | * @param Mixed $var | |
| 219 | * @param Mixed $default | |
| 220 | * | |
| 221 | */ | |
| 222 | static function withDefault(&$var, $default) | |
| 223 | {
| |
| 224 | if (!isset($var)) | |
| 225 | return $default; | |
| 226 | ||
| 227 | return $var; | |
| 228 | } | |
| 229 | ||
| 230 | /** | |
| 231 | * Try to load template by name, can throw FileNotFoundException | |
| 232 | * | |
| 233 | * @param String $templ template name | |
| 234 | */ | |
| 235 | private function load($templ) | |
| 236 | {
| |
| 237 | /* Build the full path of the file to load */ | |
| 238 | $filename = Template::template_dir . '/' . $templ . '.template.php'; | |
| 239 | ||
| 240 | /* Check whether the requested file does exist, if not throw exception */ | |
| 241 | if ( ! file_exists($filename) ) | |
| 242 | throw new FileNotFoundException('Template file ' . $filename . ' not found.');
| |
| 243 | ||
| 244 | /* Set the filename of the template */ | |
| 245 | $this->template = $filename; | |
| 246 | } | |
| 247 | ||
| 248 | ||
| 249 | } | |
| 250 | ||
| 251 | ?> |