Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

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.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

Filesystem.php

Zuletzt modifiziert: 09.10.2024, 12:58 - Dateigröße: 6.80 KiB


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 = array();
023      protected $cache = array();
024      protected $errorCache = array();
025   
026      /**
027       * Constructor.
028       *
029       * @param string|array $paths A path or an array of paths where to look for templates
030       */
031      public function __construct($paths = array())
032      {
033          if ($paths) {
034              $this->setPaths($paths);
035          }
036      }
037   
038      /**
039       * Returns the paths to the templates.
040       *
041       * @param string $namespace A path namespace
042       *
043       * @return array The array of paths where to look for templates
044       */
045      public function getPaths($namespace = self::MAIN_NAMESPACE)
046      {
047          return isset($this->paths[$namespace]) ? $this->paths[$namespace] : array();
048      }
049   
050      /**
051       * Returns the path namespaces.
052       *
053       * The main namespace is always defined.
054       *
055       * @return array The array of defined namespaces
056       */
057      public function getNamespaces()
058      {
059          return array_keys($this->paths);
060      }
061   
062      /**
063       * Sets the paths where templates are stored.
064       *
065       * @param string|array $paths     A path or an array of paths where to look for templates
066       * @param string       $namespace A path namespace
067       */
068      public function setPaths($paths, $namespace = self::MAIN_NAMESPACE)
069      {
070          if (!is_array($paths)) {
071              $paths = array($paths);
072          }
073   
074          $this->paths[$namespace] = array();
075          foreach ($paths as $path) {
076              $this->addPath($path, $namespace);
077          }
078      }
079   
080      /**
081       * Adds a path where templates are stored.
082       *
083       * @param string $path      A path where to look for templates
084       * @param string $namespace A path name
085       *
086       * @throws Twig_Error_Loader
087       */
088      public function addPath($path, $namespace = self::MAIN_NAMESPACE)
089      {
090          // invalidate the cache
091          $this->cache = $this->errorCache = array();
092   
093          if (!is_dir($path)) {
094              throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist.', $path));
095          }
096   
097          $this->paths[$namespace][] = rtrim($path, '/\\');
098      }
099   
100      /**
101       * Prepends a path where templates are stored.
102       *
103       * @param string $path      A path where to look for templates
104       * @param string $namespace A path name
105       *
106       * @throws Twig_Error_Loader
107       */
108      public function prependPath($path, $namespace = self::MAIN_NAMESPACE)
109      {
110          // invalidate the cache
111          $this->cache = $this->errorCache = array();
112   
113          if (!is_dir($path)) {
114              throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist.', $path));
115          }
116   
117          $path = rtrim($path, '/\\');
118   
119          if (!isset($this->paths[$namespace])) {
120              $this->paths[$namespace][] = $path;
121          } else {
122              array_unshift($this->paths[$namespace], $path);
123          }
124      }
125   
126      /**
127       * {@inheritdoc}
128       */
129      public function getSource($name)
130      {
131          return file_get_contents($this->findTemplate($name));
132      }
133   
134      /**
135       * {@inheritdoc}
136       */
137      public function getCacheKey($name)
138      {
139          return $this->findTemplate($name);
140      }
141   
142      /**
143       * {@inheritdoc}
144       */
145      public function exists($name)
146      {
147          $name = $this->normalizeName($name);
148   
149          if (isset($this->cache[$name])) {
150              return true;
151          }
152   
153          try {
154              return false !== $this->findTemplate($name, false);
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          $throw = func_num_args() > 1 ? func_get_arg(1) : true;
171          $name = $this->normalizeName($name);
172   
173          if (isset($this->cache[$name])) {
174              return $this->cache[$name];
175          }
176   
177          if (isset($this->errorCache[$name])) {
178              if (!$throw) {
179                  return false;
180              }
181   
182              throw new Twig_Error_Loader($this->errorCache[$name]);
183          }
184   
185          $this->validateName($name);
186   
187          list($namespace, $shortname) = $this->parseName($name);
188   
189          if (!isset($this->paths[$namespace])) {
190              $this->errorCache[$name] = sprintf('There are no registered paths for namespace "%s".', $namespace);
191   
192              if (!$throw) {
193                  return false;
194              }
195   
196              throw new Twig_Error_Loader($this->errorCache[$name]);
197          }
198   
199          foreach ($this->paths[$namespace] as $path) {
200              if (is_file($path.'/'.$shortname)) {
201                  if (false !== $realpath = realpath($path.'/'.$shortname)) {
202                      return $this->cache[$name] = $realpath;
203                  }
204   
205                  return $this->cache[$name] = $path.'/'.$shortname;
206              }
207          }
208   
209          $this->errorCache[$name] = sprintf('Unable to find template "%s" (looked into: %s).', $name, implode(', ', $this->paths[$namespace]));
210   
211          if (!$throw) {
212              return false;
213          }
214   
215          throw new Twig_Error_Loader($this->errorCache[$name]);
216      }
217   
218      protected function parseName($name, $default = self::MAIN_NAMESPACE)
219      {
220          if (isset($name[0]) && '@' == $name[0]) {
221              if (false === $pos = strpos($name, '/')) {
222                  throw new Twig_Error_Loader(sprintf('Malformed namespaced template name "%s" (expecting "@namespace/template_name").', $name));
223              }
224   
225              $namespace = substr($name, 1, $pos - 1);
226              $shortname = substr($name, $pos + 1);
227   
228              return array($namespace, $shortname);
229          }
230   
231          return array($default, $name);
232      }
233   
234      protected function normalizeName($name)
235      {
236          return preg_replace('#/{2,}#', '/', str_replace('\\', '/', (string) $name));
237      }
238   
239      protected function validateName($name)
240      {
241          if (false !== strpos($name, "\0")) {
242              throw new Twig_Error_Loader('A template name cannot contain NUL bytes.');
243          }
244   
245          $name = ltrim($name, '/');
246          $parts = explode('/', $name);
247          $level = 0;
248          foreach ($parts as $part) {
249              if ('..' === $part) {
250                  --$level;
251              } elseif ('.' !== $part) {
252                  ++$level;
253              }
254   
255              if ($level < 0) {
256                  throw new Twig_Error_Loader(sprintf('Looks like you try to load a template outside configured directories (%s).', $name));
257              }
258          }
259      }
260  }
261