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

TwigRendererEngine.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 7.13 KiB


 001  <?php
 002   
 003  /*
 004   * This file is part of the Symfony package.
 005   *
 006   * (c) Fabien Potencier <fabien@symfony.com>
 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  namespace Symfony\Bridge\Twig\Form;
 013   
 014  use Symfony\Component\Form\AbstractRendererEngine;
 015  use Symfony\Component\Form\FormView;
 016   
 017  /**
 018   * @author Bernhard Schussek <bschussek@gmail.com>
 019   */
 020  class TwigRendererEngine extends AbstractRendererEngine implements TwigRendererEngineInterface
 021  {
 022      /**
 023       * @var \Twig_Environment
 024       */
 025      private $environment;
 026   
 027      /**
 028       * @var \Twig_Template
 029       */
 030      private $template;
 031   
 032      /**
 033       * {@inheritdoc}
 034       */
 035      public function setEnvironment(\Twig_Environment $environment)
 036      {
 037          $this->environment = $environment;
 038      }
 039   
 040      /**
 041       * {@inheritdoc}
 042       */
 043      public function renderBlock(FormView $view, $resource, $blockName, array $variables = array())
 044      {
 045          $cacheKey = $view->vars[self::CACHE_KEY_VAR];
 046   
 047          $context = $this->environment->mergeGlobals($variables);
 048   
 049          ob_start();
 050   
 051          // By contract,This method can only be called after getting the resource
 052          // (which is passed to the method). Getting a resource for the first time
 053          // (with an empty cache) is guaranteed to invoke loadResourcesFromTheme(),
 054          // where the property $template is initialized.
 055   
 056          // We do not call renderBlock here to avoid too many nested level calls
 057          // (XDebug limits the level to 100 by default)
 058          $this->template->displayBlock($blockName, $context, $this->resources[$cacheKey]);
 059   
 060          return ob_get_clean();
 061      }
 062   
 063      /**
 064       * Loads the cache with the resource for a given block name.
 065       *
 066       * This implementation eagerly loads all blocks of the themes assigned to the given view
 067       * and all of its ancestors views. This is necessary, because Twig receives the
 068       * list of blocks later. At that point, all blocks must already be loaded, for the
 069       * case that the function "block()" is used in the Twig template.
 070       *
 071       * @see getResourceForBlock()
 072       *
 073       * @param string   $cacheKey  The cache key of the form view
 074       * @param FormView $view      The form view for finding the applying themes
 075       * @param string   $blockName The name of the block to load
 076       *
 077       * @return bool True if the resource could be loaded, false otherwise
 078       */
 079      protected function loadResourceForBlockName($cacheKey, FormView $view, $blockName)
 080      {
 081          // The caller guarantees that $this->resources[$cacheKey][$block] is
 082          // not set, but it doesn't have to check whether $this->resources[$cacheKey]
 083          // is set. If $this->resources[$cacheKey] is set, all themes for this
 084          // $cacheKey are already loaded (due to the eager population, see doc comment).
 085          if (isset($this->resources[$cacheKey])) {
 086              // As said in the previous, the caller guarantees that
 087              // $this->resources[$cacheKey][$block] is not set. Since the themes are
 088              // already loaded, it can only be a non-existing block.
 089              $this->resources[$cacheKey][$blockName] = false;
 090   
 091              return false;
 092          }
 093   
 094          // Recursively try to find the block in the themes assigned to $view,
 095          // then of its parent view, then of the parent view of the parent and so on.
 096          // When the root view is reached in this recursion, also the default
 097          // themes are taken into account.
 098   
 099          // Check each theme whether it contains the searched block
 100          if (isset($this->themes[$cacheKey])) {
 101              for ($i = count($this->themes[$cacheKey]) - 1; $i >= 0; --$i) {
 102                  $this->loadResourcesFromTheme($cacheKey, $this->themes[$cacheKey][$i]);
 103                  // CONTINUE LOADING (see doc comment)
 104              }
 105          }
 106   
 107          // Check the default themes once we reach the root view without success
 108          if (!$view->parent) {
 109              for ($i = count($this->defaultThemes) - 1; $i >= 0; --$i) {
 110                  $this->loadResourcesFromTheme($cacheKey, $this->defaultThemes[$i]);
 111                  // CONTINUE LOADING (see doc comment)
 112              }
 113          }
 114   
 115          // Proceed with the themes of the parent view
 116          if ($view->parent) {
 117              $parentCacheKey = $view->parent->vars[self::CACHE_KEY_VAR];
 118   
 119              if (!isset($this->resources[$parentCacheKey])) {
 120                  $this->loadResourceForBlockName($parentCacheKey, $view->parent, $blockName);
 121              }
 122   
 123              // EAGER CACHE POPULATION (see doc comment)
 124              foreach ($this->resources[$parentCacheKey] as $nestedBlockName => $resource) {
 125                  if (!isset($this->resources[$cacheKey][$nestedBlockName])) {
 126                      $this->resources[$cacheKey][$nestedBlockName] = $resource;
 127                  }
 128              }
 129          }
 130   
 131          // Even though we loaded the themes, it can happen that none of them
 132          // contains the searched block
 133          if (!isset($this->resources[$cacheKey][$blockName])) {
 134              // Cache that we didn't find anything to speed up further accesses
 135              $this->resources[$cacheKey][$blockName] = false;
 136          }
 137   
 138          return false !== $this->resources[$cacheKey][$blockName];
 139      }
 140   
 141      /**
 142       * Loads the resources for all blocks in a theme.
 143       *
 144       * @param string $cacheKey The cache key for storing the resource
 145       * @param mixed  $theme    The theme to load the block from. This parameter
 146       *                         is passed by reference, because it might be necessary
 147       *                         to initialize the theme first. Any changes made to
 148       *                         this variable will be kept and be available upon
 149       *                         further calls to this method using the same theme.
 150       */
 151      protected function loadResourcesFromTheme($cacheKey, &$theme)
 152      {
 153          if (!$theme instanceof \Twig_Template) {
 154              /* @var \Twig_Template $theme */
 155              $theme = $this->environment->loadTemplate($theme);
 156          }
 157   
 158          if (null === $this->template) {
 159              // Store the first \Twig_Template instance that we find so that
 160              // we can call displayBlock() later on. It doesn't matter *which*
 161              // template we use for that, since we pass the used blocks manually
 162              // anyway.
 163              $this->template = $theme;
 164          }
 165   
 166          // Use a separate variable for the inheritance traversal, because
 167          // theme is a reference and we don't want to change it.
 168          $currentTheme = $theme;
 169   
 170          $context = $this->environment->mergeGlobals(array());
 171   
 172          // The do loop takes care of template inheritance.
 173          // Add blocks from all templates in the inheritance tree, but avoid
 174          // overriding blocks already set.
 175          do {
 176              foreach ($currentTheme->getBlocks() as $block => $blockData) {
 177                  if (!isset($this->resources[$cacheKey][$block])) {
 178                      // The resource given back is the key to the bucket that
 179                      // contains this block.
 180                      $this->resources[$cacheKey][$block] = $blockData;
 181                  }
 182              }
 183          } while (false !== $currentTheme = $currentTheme->getParent($context));
 184      }
 185  }
 186