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 |
Filesystem.php
001 <?php
002
003 /*
004 * This file is part of Twig.
005 *
006 * (c) 2009 Fabien Potencier
007 *
008 * For the full copyright and license information, please view the LICENSE
009 * file that was distributed with this source code.
010 */
011
012 /**
013 * Loads template from the filesystem.
014 *
015 * @author Fabien Potencier <fabien@symfony.com>
016 */
017 class Twig_Loader_Filesystem implements Twig_LoaderInterface, Twig_ExistsLoaderInterface
018 {
019 /** Identifier of the main namespace. */
020 const MAIN_NAMESPACE = '__main__';
021
022 protected $paths;
023 protected $cache;
024
025 /**
026 * Constructor.
027 *
028 * @param string|array $paths A path or an array of paths where to look for templates
029 */
030 public function __construct($paths = array())
031 {
032 if ($paths) {
033 $this->setPaths($paths);
034 }
035 }
036
037 /**
038 * Returns the paths to the templates.
039 *
040 * @param string $namespace A path namespace
041 *
042 * @return array The array of paths where to look for templates
043 */
044 public function getPaths($namespace = self::MAIN_NAMESPACE)
045 {
046 return isset($this->paths[$namespace]) ? $this->paths[$namespace] : array();
047 }
048
049 /**
050 * Returns the path namespaces.
051 *
052 * The main namespace is always defined.
053 *
054 * @return array The array of defined namespaces
055 */
056 public function getNamespaces()
057 {
058 return array_keys($this->paths);
059 }
060
061 /**
062 * Sets the paths where templates are stored.
063 *
064 * @param string|array $paths A path or an array of paths where to look for templates
065 * @param string $namespace A path namespace
066 */
067 public function setPaths($paths, $namespace = self::MAIN_NAMESPACE)
068 {
069 if (!is_array($paths)) {
070 $paths = array($paths);
071 }
072
073 $this->paths[$namespace] = array();
074 foreach ($paths as $path) {
075 $this->addPath($path, $namespace);
076 }
077 }
078
079 /**
080 * Adds a path where templates are stored.
081 *
082 * @param string $path A path where to look for templates
083 * @param string $namespace A path name
084 *
085 * @throws Twig_Error_Loader
086 */
087 public function addPath($path, $namespace = self::MAIN_NAMESPACE)
088 {
089 // invalidate the cache
090 $this->cache = array();
091
092 if (!is_dir($path)) {
093 throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist.', $path));
094 }
095
096 $this->paths[$namespace][] = rtrim($path, '/\\');
097 }
098
099 /**
100 * Prepends a path where templates are stored.
101 *
102 * @param string $path A path where to look for templates
103 * @param string $namespace A path name
104 *
105 * @throws Twig_Error_Loader
106 */
107 public function prependPath($path, $namespace = self::MAIN_NAMESPACE)
108 {
109 // invalidate the cache
110 $this->cache = array();
111
112 if (!is_dir($path)) {
113 throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist.', $path));
114 }
115
116 $path = rtrim($path, '/\\');
117
118 if (!isset($this->paths[$namespace])) {
119 $this->paths[$namespace][] = $path;
120 } else {
121 array_unshift($this->paths[$namespace], $path);
122 }
123 }
124
125 /**
126 * {@inheritdoc}
127 */
128 public function getSource($name)
129 {
130 return file_get_contents($this->findTemplate($name));
131 }
132
133 /**
134 * {@inheritdoc}
135 */
136 public function getCacheKey($name)
137 {
138 return $this->findTemplate($name);
139 }
140
141 /**
142 * {@inheritdoc}
143 */
144 public function exists($name)
145 {
146 $name = (string) $name;
147 if (isset($this->cache[$name])) {
148 return true;
149 }
150
151 try {
152 $this->findTemplate($name);
153
154 return true;
155 } catch (Twig_Error_Loader $exception) {
156 return false;
157 }
158 }
159
160 /**
161 * {@inheritdoc}
162 */
163 public function isFresh($name, $time)
164 {
165 return filemtime($this->findTemplate($name)) <= $time;
166 }
167
168 protected function findTemplate($name)
169 {
170 $name = (string) $name;
171
172 // normalize name
173 $name = preg_replace('#/{2,}#', '/', strtr($name, '\\', '/'));
174
175 if (isset($this->cache[$name])) {
176 return $this->cache[$name];
177 }
178
179 $this->validateName($name);
180
181 $namespace = self::MAIN_NAMESPACE;
182 if (isset($name[0]) && '@' == $name[0]) {
183 if (false === $pos = strpos($name, '/')) {
184 throw new Twig_Error_Loader(sprintf('Malformed namespaced template name "%s" (expecting "@namespace/template_name").', $name));
185 }
186
187 $namespace = substr($name, 1, $pos - 1);
188
189 $name = substr($name, $pos + 1);
190 }
191
192 if (!isset($this->paths[$namespace])) {
193 throw new Twig_Error_Loader(sprintf('There are no registered paths for namespace "%s".', $namespace));
194 }
195
196 foreach ($this->paths[$namespace] as $path) {
197 if (is_file($path.'/'.$name)) {
198 return $this->cache[$name] = $path.'/'.$name;
199 }
200 }
201
202 throw new Twig_Error_Loader(sprintf('Unable to find template "%s" (looked into: %s).', $name, implode(', ', $this->paths[$namespace])));
203 }
204
205 protected function validateName($name)
206 {
207 if (false !== strpos($name, "\0")) {
208 throw new Twig_Error_Loader('A template name cannot contain NUL bytes.');
209 }
210
211 $name = ltrim($name, '/');
212 $parts = explode('/', $name);
213 $level = 0;
214 foreach ($parts as $part) {
215 if ('..' === $part) {
216 --$level;
217 } elseif ('.' !== $part) {
218 ++$level;
219 }
220
221 if ($level < 0) {
222 throw new Twig_Error_Loader(sprintf('Looks like you try to load a template outside configured directories (%s).', $name));
223 }
224 }
225 }
226 }
227