vendor/contao/core-bundle/src/Resources/contao/library/Contao/DcaLoader.php line 68

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of Contao.
  4.  *
  5.  * (c) Leo Feyer
  6.  *
  7.  * @license LGPL-3.0-or-later
  8.  */
  9. namespace Contao;
  10. /**
  11.  * Loads a set of DCA files
  12.  *
  13.  * The class loads the DCA files of a certain table and stores a combined
  14.  * version in the cache directory.
  15.  *
  16.  * Usage:
  17.  *
  18.  *     $dca = new DcaLoader('tl_user');
  19.  *     $dca->load();
  20.  *
  21.  * @author Leo Feyer <https://github.com/leofeyer>
  22.  */
  23. class DcaLoader extends Controller
  24. {
  25.     /**
  26.      * @var array
  27.      */
  28.     protected static $arrLoaded = array();
  29.     /**
  30.      * Table name
  31.      * @var string
  32.      */
  33.     protected $strTable;
  34.     /**
  35.      * Store the table name
  36.      *
  37.      * @param string $strTable The table name
  38.      *
  39.      * @throws \Exception If $strTable is empty
  40.      */
  41.     public function __construct($strTable)
  42.     {
  43.         if (!$strTable)
  44.         {
  45.             throw new \Exception('The table name must not be empty');
  46.         }
  47.         if (Validator::isInsecurePath($strTable))
  48.         {
  49.             throw new \InvalidArgumentException('The table name contains invalid characters');
  50.         }
  51.         parent::__construct();
  52.         $this->strTable $strTable;
  53.     }
  54.     /**
  55.      * Load a set of DCA files
  56.      *
  57.      * @param boolean $blnNoCache If true, the cache will be bypassed
  58.      */
  59.     public function load($blnNoCache=false)
  60.     {
  61.         $this->loadDcaFiles($blnNoCache);
  62.     }
  63.     /**
  64.      * Load the DCA files
  65.      *
  66.      * @param boolean $blnNoCache
  67.      */
  68.     private function loadDcaFiles($blnNoCache)
  69.     {
  70.         // Return if the data has been loaded already
  71.         if (!$blnNoCache && isset(static::$arrLoaded['dcaFiles'][$this->strTable]))
  72.         {
  73.             return;
  74.         }
  75.         static::$arrLoaded['dcaFiles'][$this->strTable] = true// see #6145
  76.         $strCacheDir System::getContainer()->getParameter('kernel.cache_dir');
  77.         // Try to load from cache
  78.         if (file_exists($strCacheDir '/contao/dca/' $this->strTable '.php'))
  79.         {
  80.             include $strCacheDir '/contao/dca/' $this->strTable '.php';
  81.         }
  82.         else
  83.         {
  84.             try
  85.             {
  86.                 $files System::getContainer()->get('contao.resource_locator')->locate('dca/' $this->strTable '.php'nullfalse);
  87.             }
  88.             catch (\InvalidArgumentException $e)
  89.             {
  90.                 $files = array();
  91.             }
  92.             foreach ($files as $file)
  93.             {
  94.                 include $file;
  95.             }
  96.         }
  97.         // HOOK: allow to load custom settings
  98.         if (isset($GLOBALS['TL_HOOKS']['loadDataContainer']) && \is_array($GLOBALS['TL_HOOKS']['loadDataContainer']))
  99.         {
  100.             foreach ($GLOBALS['TL_HOOKS']['loadDataContainer'] as $callback)
  101.             {
  102.                 $this->import($callback[0]);
  103.                 $this->{$callback[0]}->{$callback[1]}($this->strTable);
  104.             }
  105.         }
  106.         $projectDir System::getContainer()->getParameter('kernel.project_dir');
  107.         // Local configuration file
  108.         if (file_exists($projectDir '/system/config/dcaconfig.php'))
  109.         {
  110.             @trigger_error('Using the "dcaconfig.php" file has been deprecated and will no longer work in Contao 5.0. Create custom DCA files in the "contao/dca" folder instead.'E_USER_DEPRECATED);
  111.             include $projectDir '/system/config/dcaconfig.php';
  112.         }
  113.         $this->addDefaultLabels($blnNoCache);
  114.     }
  115.     /**
  116.      * Add the default labels (see #509)
  117.      *
  118.      * @param boolean $blnNoCache
  119.      */
  120.     private function addDefaultLabels($blnNoCache)
  121.     {
  122.         // Operations
  123.         foreach (array('global_operations''operations') as $key)
  124.         {
  125.             if (!isset($GLOBALS['TL_DCA'][$this->strTable]['list'][$key]))
  126.             {
  127.                 continue;
  128.             }
  129.             foreach ($GLOBALS['TL_DCA'][$this->strTable]['list'][$key] as $k=>&$v)
  130.             {
  131.                 if (isset($v['label']))
  132.                 {
  133.                     continue;
  134.                 }
  135.                 if (isset($GLOBALS['TL_LANG'][$this->strTable][$k]) || !isset($GLOBALS['TL_LANG']['DCA'][$k]))
  136.                 {
  137.                     $v['label'] = &$GLOBALS['TL_LANG'][$this->strTable][$k];
  138.                 }
  139.                 elseif (isset($GLOBALS['TL_LANG']['DCA'][$k]))
  140.                 {
  141.                     $v['label'] = &$GLOBALS['TL_LANG']['DCA'][$k];
  142.                 }
  143.             }
  144.             unset($v);
  145.         }
  146.         // Fields
  147.         if (isset($GLOBALS['TL_DCA'][$this->strTable]['fields']))
  148.         {
  149.             foreach ($GLOBALS['TL_DCA'][$this->strTable]['fields'] as $k=>&$v)
  150.             {
  151.                 if (isset($v['label']))
  152.                 {
  153.                     continue;
  154.                 }
  155.                 $v['label'] = &$GLOBALS['TL_LANG'][$this->strTable][$k];
  156.             }
  157.             unset($v);
  158.         }
  159.     }
  160. }
  161. class_alias(DcaLoader::class, 'DcaLoader');