Verzeichnisstruktur phpBB-3.1.0
- Veröffentlicht
- 27.10.2014
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
twig.php
001 <?php
002 /**
003 *
004 * This file is part of the phpBB Forum Software package.
005 *
006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
007 * @license GNU General Public License, version 2 (GPL-2.0)
008 *
009 * For full copyright and license information, please see
010 * the docs/CREDITS.txt file.
011 *
012 */
013
014 namespace phpbb\template\twig;
015
016 /**
017 * Twig Template class.
018 */
019 class twig extends \phpbb\template\base
020 {
021 /**
022 * Path of the cache directory for the template
023 *
024 * Cannot be changed during runtime.
025 *
026 * @var string
027 */
028 private $cachepath = '';
029
030 /**
031 * phpBB path helper
032 * @var \phpbb\path_helper
033 */
034 protected $path_helper;
035
036 /**
037 * phpBB root path
038 * @var string
039 */
040 protected $phpbb_root_path;
041
042 /**
043 * PHP file extension
044 * @var string
045 */
046 protected $php_ext;
047
048 /**
049 * phpBB config instance
050 * @var \phpbb\config\config
051 */
052 protected $config;
053
054 /**
055 * Current user
056 * @var \phpbb\user
057 */
058 protected $user;
059
060 /**
061 * Extension manager.
062 *
063 * @var \phpbb\extension\manager
064 */
065 protected $extension_manager;
066
067 /**
068 * Twig Environment
069 *
070 * @var \Twig_Environment
071 */
072 protected $twig;
073
074 /**
075 * Constructor.
076 *
077 * @param \phpbb\path_helper $path_helper
078 * @param \phpbb\config\config $config
079 * @param \phpbb\user $user
080 * @param \phpbb\template\context $context template context
081 * @param \phpbb\extension\manager $extension_manager extension manager, if null then template events will not be invoked
082 */
083 public function __construct(\phpbb\path_helper $path_helper, $config, $user, \phpbb\template\context $context, \phpbb\extension\manager $extension_manager = null)
084 {
085 $this->path_helper = $path_helper;
086 $this->phpbb_root_path = $path_helper->get_phpbb_root_path();
087 $this->php_ext = $path_helper->get_php_ext();
088 $this->config = $config;
089 $this->user = $user;
090 $this->context = $context;
091 $this->extension_manager = $extension_manager;
092
093 $this->cachepath = $this->phpbb_root_path . 'cache/twig/';
094
095 // Initiate the loader, __main__ namespace paths will be setup later in set_style_names()
096 $loader = new \phpbb\template\twig\loader('');
097
098 $this->twig = new \phpbb\template\twig\environment(
099 $this->config,
100 $this->path_helper,
101 $this->extension_manager,
102 $loader,
103 array(
104 'cache' => (defined('IN_INSTALL')) ? false : $this->cachepath,
105 'debug' => defined('DEBUG'),
106 'auto_reload' => (bool) $this->config['load_tplcompile'],
107 'autoescape' => false,
108 )
109 );
110
111 $this->twig->addExtension(
112 new \phpbb\template\twig\extension(
113 $this->context,
114 $this->user
115 )
116 );
117
118 $lexer = new \phpbb\template\twig\lexer($this->twig);
119
120 $this->twig->setLexer($lexer);
121
122 // Add admin namespace
123 if ($this->path_helper->get_adm_relative_path() !== null && is_dir($this->phpbb_root_path . $this->path_helper->get_adm_relative_path() . 'style/'))
124 {
125 $this->twig->getLoader()->setPaths($this->phpbb_root_path . $this->path_helper->get_adm_relative_path() . 'style/', 'admin');
126 }
127 }
128
129 /**
130 * Clear the cache
131 *
132 * @return \phpbb\template\template
133 */
134 public function clear_cache()
135 {
136 if (is_dir($this->cachepath))
137 {
138 $this->twig->clearCacheFiles();
139 }
140
141 return $this;
142 }
143
144 /**
145 * Get the style tree of the style preferred by the current user
146 *
147 * @return array Style tree, most specific first
148 */
149 public function get_user_style()
150 {
151 $style_list = array(
152 $this->user->style['style_path'],
153 );
154
155 if ($this->user->style['style_parent_id'])
156 {
157 $style_list = array_merge($style_list, array_reverse(explode('/', $this->user->style['style_parent_tree'])));
158 }
159
160 return $style_list;
161 }
162
163 /**
164 * Set style location based on (current) user's chosen style.
165 *
166 * @param array $style_directories The directories to add style paths for
167 * E.g. array('ext/foo/bar/styles', 'styles')
168 * Default: array('styles') (phpBB's style directory)
169 * @return \phpbb\template\template $this
170 */
171 public function set_style($style_directories = array('styles'))
172 {
173 if ($style_directories !== array('styles') && $this->twig->getLoader()->getPaths('core') === array())
174 {
175 // We should set up the core styles path since not already setup
176 $this->set_style();
177 }
178
179 $names = $this->get_user_style();
180 // Add 'all' folder to $names array
181 // It allows extensions to load a template file from 'all' folder,
182 // if a style doesn't include it.
183 $names[] = 'all';
184
185 $paths = array();
186 foreach ($style_directories as $directory)
187 {
188 foreach ($names as $name)
189 {
190 $path = $this->phpbb_root_path . trim($directory, '/') . "/{$name}/";
191 $template_path = $path . 'template/';
192
193 if (is_dir($template_path))
194 {
195 // Add the base style directory as a safe directory
196 $this->twig->getLoader()->addSafeDirectory($path);
197
198 $paths[] = $template_path;
199 }
200 }
201 }
202
203 // If we're setting up the main phpBB styles directory and the core
204 // namespace isn't setup yet, we will set it up now
205 if ($style_directories === array('styles') && $this->twig->getLoader()->getPaths('core') === array())
206 {
207 // Set up the core style paths namespace
208 $this->twig->getLoader()->setPaths($paths, 'core');
209 }
210
211 $this->set_custom_style($names, $paths);
212
213 return $this;
214 }
215
216 /**
217 * Set custom style location (able to use directory outside of phpBB).
218 *
219 * Note: Templates are still compiled to phpBB's cache directory.
220 *
221 * @param string|array $names Array of names (or detailed names) or string of name of template(s) in inheritance tree order, used by extensions.
222 * E.g. array(
223 * 'name' => 'adm',
224 * 'ext_path' => 'adm/style/',
225 * )
226 * @param string|array of string $paths Array of style paths, relative to current root directory
227 * @return \phpbb\template\template $this
228 */
229 public function set_custom_style($names, $paths)
230 {
231 $paths = (is_string($paths)) ? array($paths) : $paths;
232 $names = (is_string($names)) ? array($names) : $names;
233
234 // Set as __main__ namespace
235 $this->twig->getLoader()->setPaths($paths);
236
237 // Add all namespaces for all extensions
238 if ($this->extension_manager instanceof \phpbb\extension\manager)
239 {
240 $names[] = 'all';
241
242 foreach ($this->extension_manager->all_enabled() as $ext_namespace => $ext_path)
243 {
244 // namespaces cannot contain /
245 $namespace = str_replace('/', '_', $ext_namespace);
246 $paths = array();
247
248 foreach ($names as $template_dir)
249 {
250 if (is_array($template_dir))
251 {
252 if (isset($template_dir['ext_path']))
253 {
254 $ext_style_template_path = $ext_path . $template_dir['ext_path'];
255 $ext_style_path = dirname($ext_style_template_path);
256 }
257 else
258 {
259 $ext_style_path = $ext_path . 'styles/' . $template_dir['name'] . '/';
260 $ext_style_template_path = $ext_style_path . 'template/';
261 }
262 }
263 else
264 {
265 $ext_style_path = $ext_path . 'styles/' . $template_dir . '/';
266 $ext_style_template_path = $ext_style_path . 'template/';
267 }
268
269 if (is_dir($ext_style_template_path))
270 {
271 // Add the base style directory as a safe directory
272 $this->twig->getLoader()->addSafeDirectory($ext_style_path);
273
274 $paths[] = $ext_style_template_path;
275 }
276 }
277
278 $this->twig->getLoader()->setPaths($paths, $namespace);
279 }
280 }
281
282 return $this;
283 }
284
285 /**
286 * Display a template for provided handle.
287 *
288 * The template will be loaded and compiled, if necessary, first.
289 *
290 * This function calls hooks.
291 *
292 * @param string $handle Handle to display
293 * @return \phpbb\template\template $this
294 */
295 public function display($handle)
296 {
297 $result = $this->call_hook($handle, __FUNCTION__);
298 if ($result !== false)
299 {
300 return $result[0];
301 }
302
303 $this->twig->display($this->get_filename_from_handle($handle), $this->get_template_vars());
304
305 return $this;
306 }
307
308 /**
309 * Display the handle and assign the output to a template variable
310 * or return the compiled result.
311 *
312 * @param string $handle Handle to operate on
313 * @param string $template_var Template variable to assign compiled handle to
314 * @param bool $return_content If true return compiled handle, otherwise assign to $template_var
315 * @return \phpbb\template\template|string if $return_content is true return string of the compiled handle, otherwise return $this
316 */
317 public function assign_display($handle, $template_var = '', $return_content = true)
318 {
319 if ($return_content)
320 {
321 return $this->twig->render($this->get_filename_from_handle($handle), $this->get_template_vars());
322 }
323
324 $this->assign_var($template_var, $this->twig->render($this->get_filename_from_handle($handle, $this->get_template_vars())));
325
326 return $this;
327 }
328
329 /**
330 * Get template vars in a format Twig will use (from the context)
331 *
332 * @return array
333 */
334 protected function get_template_vars()
335 {
336 $context_vars = $this->context->get_data_ref();
337
338 $vars = array_merge(
339 $context_vars['.'][0], // To get normal vars
340 array(
341 'definition' => new \phpbb\template\twig\definition(),
342 'user' => $this->user,
343 'loops' => $context_vars, // To get loops
344 )
345 );
346
347 // cleanup
348 unset($vars['loops']['.']);
349
350 return $vars;
351 }
352
353 /**
354 * {@inheritdoc}
355 */
356 public function get_source_file_for_handle($handle)
357 {
358 return $this->twig->getLoader()->getCacheKey($this->get_filename_from_handle($handle));
359 }
360 }
361