vendor/alnv/catalog-manager/library/alnv/Toolkit.php line 394

Open in your IDE?
  1. <?php
  2. namespace CatalogManager;
  3. class Toolkit
  4. {
  5.     public static $arrDateRgxp = ['date''time''datim'];
  6.     public static $arrRequireSortingModes = ['4''5''6'];
  7.     public static $arrOperators = ['cut''copy''invisible'];
  8.     public static $arrDoNotRenderInFastMode = ['upload''map'];
  9.     public static $arrDigitRgxp = ['digit''natural''prcnt'];
  10.     public static $nullableOperators = ['isNotEmpty''isEmpty'];
  11.     public static $arrModeTypes = ['0''1''2''3''4''5''6'];
  12.     public static $arrArrayOptions = ['origin''catalogFields''catalogEntityFields'];
  13.     public static $arrSocialSharingButtons = ['mail''twitter''facebook''xing''linkedin'];
  14.     public static $arrImageExtensions = ['jpg''jpeg''gif''png''svg''svgz''bmp''tiff''tif'];
  15.     public static $arrFileExtensions = ['odt''ods''odp''odg''ott''ots''otp''otg''pdf''doc''docx''dot''dotx''xls''xlsx''xlt''xltx''ppt''pptx''pot''potx''mp3''mp4''m4a''m4v''webm''ogg''ogv''wma''wmv''ram''rm''mov''zip''rar''7z'];
  16.     public static $arrSqlTypes = [
  17.         'c256' => "varchar(256) NOT NULL default ''",
  18.         'c1' => "char(1) NOT NULL default ''",
  19.         'c16' => "varchar(16) NOT NULL default ''",
  20.         'c32' => "varchar(32) NOT NULL default ''",
  21.         'c64' => "varchar(64) NOT NULL default ''",
  22.         'c128' => "varchar(128) NOT NULL default ''",
  23.         'c512' => "varchar(512) NOT NULL default ''",
  24.         'c1024' => "varchar(1024) NOT NULL default ''",
  25.         'c2048' => "varchar(2048) NOT NULL default ''",
  26.         'i5' => "smallint(5) unsigned NOT NULL default '0'",
  27.         'i10' => "int(10) unsigned NOT NULL default '0'",
  28.         'is10' => "int(10) signed NOT NULL default '0'",
  29.         'iNotNull10' => "int(10) unsigned NULL",
  30.         'isNotNull10' => "int(10) signed NULL",
  31.         'text' => "text NULL",
  32.         'longtext' => "longtext NULL",
  33.         'blob' => "blob NULL",
  34.         'longblob' => "longblob NULL",
  35.         'binary' => "binary(16) NULL"
  36.     ];
  37.     public static $arrFormTemplates = [
  38.         'checkbox' => 'form_checkbox',
  39.         'textarea' => 'form_textarea',
  40.         'number' => 'form_textfield',
  41.         'text' => 'form_textfield',
  42.         'date' => 'form_textfield',
  43.         'select' => 'form_select',
  44.         'upload' => 'form_upload',
  45.         'hidden' => 'form_hidden',
  46.         'radio' => 'form_radio'
  47.     ];
  48.     public static function invisiblePaletteFields()
  49.     {
  50.         return [
  51.             'invisible',
  52.             'start',
  53.             'stop'
  54.         ];
  55.     }
  56.     public static function columnOnlyFields()
  57.     {
  58.         return [
  59.             'dbColumn'
  60.         ];
  61.     }
  62.     public static function readOnlyFields()
  63.     {
  64.         return [
  65.             'message'
  66.         ];
  67.     }
  68.     public static function wrapperFields()
  69.     {
  70.         return [
  71.             'fieldsetStart',
  72.             'fieldsetStop'
  73.         ];
  74.     }
  75.     public static function excludeFromDc()
  76.     {
  77.         return [
  78.             'map',
  79.             'fieldsetStop',
  80.             'fieldsetStart'
  81.         ];
  82.     }
  83.     public static function setDcConformInputType($strType)
  84.     {
  85.         return $GLOBALS['TL_CATALOG_MANAGER']['FIELD_TYPE_CONVERTER'][$strType] ?? '';
  86.     }
  87.     public static function convertCatalogTypeToFormType($strType)
  88.     {
  89.         $arrFormTypes = [
  90.             'radio' => 'radio',
  91.             'map' => 'textfield',
  92.             'select' => 'select',
  93.             'upload' => 'upload',
  94.             'text' => 'textfield',
  95.             'date' => 'textfield',
  96.             'number' => 'textfield',
  97.             'hidden' => 'textfield',
  98.             'textarea' => 'textarea',
  99.             'checkbox' => 'checkbox',
  100.             'message' => 'catalogMessageWidget'
  101.         ];
  102.         return $arrFormTypes[$strType] ?: '';
  103.     }
  104.     public static function setCatalogConformInputType($strField)
  105.     {
  106.         $strType $strField['inputType'] ?? '';
  107.         if (Toolkit::isEmpty($strType)) return '';
  108.         if (!Toolkit::isEmpty($strField['eval']['rgxp'] ?? '')) {
  109.             if (in_array($strField['eval']['rgxp'], self::$arrDateRgxp)) return 'date';
  110.         }
  111.         $arrInputTypes = [
  112.             'text' => 'text',
  113.             'radio' => 'radio',
  114.             'select' => 'select',
  115.             'password' => 'text',
  116.             'fileTree' => 'upload',
  117.             'textarea' => 'textarea',
  118.             'checkbox' => 'checkbox',
  119.         ];
  120.         return $arrInputTypes[$strType] ?? 'text';
  121.     }
  122.     public static function getSqlDataType($strType)
  123.     {
  124.         $strSql self::$arrSqlTypes[$strType] ?? '';
  125.         return $strSql ?: "varchar(256) NOT NULL default ''";
  126.     }
  127.     public static function isDcConformField($arrField)
  128.     {
  129.         if (empty($arrField) && !is_array($arrField)) {
  130.             return false;
  131.         }
  132.         if (!isset($arrField['type'])) {
  133.             return false;
  134.         }
  135.         if (in_array($arrField['type'], self::excludeFromDc())) {
  136.             return false;
  137.         }
  138.         return true;
  139.     }
  140.     public static function columnsBlacklist()
  141.     {
  142.         return [
  143.             'id',
  144.             'pid',
  145.             'tstamp',
  146.             'origin',
  147.             'sorting',
  148.             'invisible',
  149.         ];
  150.     }
  151.     public static function customizeAbleFields()
  152.     {
  153.         return [
  154.             'title',
  155.             'alias',
  156.             'start',
  157.             'stop'
  158.         ];
  159.     }
  160.     public static function isNumericArray($arrValues): bool
  161.     {
  162.         foreach ($arrValues as $varValue) {
  163.             if (!is_numeric($varValue)) {
  164.                 return false;
  165.             }
  166.         }
  167.         return true;
  168.     }
  169.     public static function parseCatalog($arrCatalog)
  170.     {
  171.         $arrCatalog['cTables'] = self::parseStringToArray(($arrCatalog['cTables']?? ''));
  172.         $arrCatalog['languages'] = self::parseStringToArray(($arrCatalog['languages'] ?? ''));
  173.         $arrCatalog['operations'] = self::parseStringToArray(($arrCatalog['operations'] ??''));
  174.         $arrCatalog['panelLayout'] = self::parseStringToArray(($arrCatalog['panelLayout'] ??''));
  175.         $arrCatalog['labelFields'] = self::parseStringToArray(($arrCatalog['labelFields'] ??''));
  176.         $arrCatalog['headerFields'] = self::parseStringToArray(($arrCatalog['headerFields'] ??''));
  177.         $arrCatalog['sortingFields'] = self::parseStringToArray(($arrCatalog['sortingFields'] ??''));
  178.         return $arrCatalog;
  179.     }
  180.     public static function parseStringToArray($strValue)
  181.     {
  182.         if (isset($strValue) && $strValue && is_string($strValue)) {
  183.             return \StringUtil::deserialize($strValuetrue);
  184.         }
  185.         if (is_array($strValue)) {
  186.             return $strValue;
  187.         }
  188.         return [];
  189.     }
  190.     public static function removeBreakLines($strValue)
  191.     {
  192.         if (!$strValue || !is_string($strValue)) {
  193.             return $strValue;
  194.         }
  195.         return preg_replace("/\r|\n/"""$strValue);
  196.     }
  197.     public static function removeApostrophe($strValue)
  198.     {
  199.         if (!$strValue || !is_string($strValue)) {
  200.             return $strValue;
  201.         }
  202.         return str_replace("'"""$strValue);
  203.     }
  204.     public static function parseConformSQLValue($varValue)
  205.     {
  206.         return str_replace('-''_'$varValue);
  207.     }
  208.     public static function isAssoc($arrAssoc)
  209.     {
  210.         if (!is_array($arrAssoc)) return false;
  211.         $arrKeys array_keys($arrAssoc);
  212.         return array_keys($arrKeys) !== $arrKeys;
  213.     }
  214.     public static function prepareValues4Db($arrValues)
  215.     {
  216.         $arrReturn = [];
  217.         if (!empty($arrValues) && is_array($arrValues)) {
  218.             foreach ($arrValues as $strKey => $varValue) {
  219.                 $arrReturn[$strKey] = self::prepareValue4Db($varValue);
  220.             }
  221.         }
  222.         return $arrReturn;
  223.     }
  224.     public static function prepareValue4Db($varValue)
  225.     {
  226.         if (!self::isDefined($varValue)) return $varValue;
  227.         if (is_array($varValue)) return implode(','$varValue);
  228.         if (is_float($varValue)) return floatval($varValue);
  229.         return $varValue;
  230.     }
  231.     public static function prepareValueForQuery($varValue)
  232.     {
  233.         if (is_array($varValue)) {
  234.             if (!empty($varValue)) {
  235.                 $arrReturn = [];
  236.                 $varValue array_filter($varValue, function ($varValue) {
  237.                     if ($varValue === '0') return true;
  238.                     return $varValue;
  239.                 });
  240.                 foreach ($varValue as $strKey => $strValue) {
  241.                     $arrReturn[$strKey] = Toolkit::prepareValueForQuery($strValue);
  242.                 }
  243.                 return $arrReturn;
  244.             } else {
  245.                 return '';
  246.             }
  247.         }
  248.         if (is_string($varValue) && $varValue === '0') return 0;
  249.         if (is_null($varValue)) return '';
  250.         return $varValue;
  251.     }
  252.     public static function deserialize($strValue)
  253.     {
  254.         $strValue deserialize($strValue);
  255.         if (!is_array($strValue)) {
  256.             return is_string($strValue) ? [$strValue] : [];
  257.         }
  258.         return $strValue;
  259.     }
  260.     public static function getBooleanByValue($varValue)
  261.     {
  262.         if (!$varValue) {
  263.             return false;
  264.         }
  265.         return true;
  266.     }
  267.     public static function deserializeAndImplode($strValue$strDelimiter ',')
  268.     {
  269.         if (!$strValue || !is_string($strValue)) {
  270.             return '';
  271.         }
  272.         $arrValue deserialize($strValue);
  273.         if (!empty($arrValue) && is_array($arrValue)) {
  274.             return implode($strDelimiter$arrValue);
  275.         }
  276.         return '';
  277.     }
  278.     public static function isDefined($varValue)
  279.     {
  280.         if (is_numeric($varValue)) {
  281.             return true;
  282.         }
  283.         if (is_array($varValue)) {
  284.             return true;
  285.         }
  286.         if ($varValue && is_string($varValue)) {
  287.             return true;
  288.         }
  289.         return false;
  290.     }
  291.     public static function parseColumns($arrColumns)
  292.     {
  293.         $arrReturn = [];
  294.         if (!empty($arrColumns) && is_array($arrColumns)) {
  295.             foreach ($arrColumns as $arrColumn) {
  296.                 if ($arrColumn['name'] == 'PRIMARY' || $arrColumn['type'] == 'index') {
  297.                     continue;
  298.                 }
  299.                 $arrReturn[$arrColumn['name']] = $arrColumn['name'];
  300.             }
  301.         }
  302.         return $arrReturn;
  303.     }
  304.     public static function parseQueries($arrQueries$fnCallback null)
  305.     {
  306.         $arrReturn = [];
  307.         if (!empty($arrQueries) && is_array($arrQueries)) {
  308.             foreach ($arrQueries as $arrQuery) {
  309.                 if (in_array($arrQuery['operator'], self::$nullableOperators)) $arrQuery['allowEmptyValues'] = '1';
  310.                 if (!is_null($fnCallback) && is_callable($fnCallback)) $arrQuery $fnCallback($arrQuery);
  311.                 $arrQuery self::parseQuery($arrQuery);
  312.                 if (is_null($arrQuery)) continue;
  313.                 if (!empty($arrQuery['subQueries']) && is_array($arrQuery['subQueries'])) {
  314.                     $arrSubQueries self::parseQueries($arrQuery['subQueries']);
  315.                     array_insert($arrSubQueries0, [[
  316.                         'field' => $arrQuery['field'],
  317.                         'value' => $arrQuery['value'],
  318.                         'operator' => $arrQuery['operator'],
  319.                     ]]);
  320.                     $arrReturn[] = $arrSubQueries;
  321.                 } else {
  322.                     $arrReturn[] = $arrQuery;
  323.                 }
  324.             }
  325.         }
  326.         return $arrReturn;
  327.     }
  328.     public static function isEmpty($varValue)
  329.     {
  330.         if (is_null($varValue) || $varValue === '') return true;
  331.         return false;
  332.     }
  333.     public static function parseQuery($arrQuery)
  334.     {
  335.         $blnAllowEmptyValue = isset($arrQuery['allowEmptyValues']) && $arrQuery['allowEmptyValues'];
  336.         if (isset($arrQuery['value']) && is_array($arrQuery['value'])) {
  337.             if (!empty($arrQuery['value'])) {
  338.                 foreach ($arrQuery['value'] as $strK => $strV) {
  339.                     $arrQuery['value'][$strK] = \Controller::replaceInsertTags($strV);
  340.                 }
  341.             }
  342.             if ($arrQuery['operator'] == 'between' && is_array($arrQuery['value'])) {
  343.                 if ($arrQuery['value'][0] === '' && $arrQuery['value'][1] === '') return null;
  344.                 if ($arrQuery['value'][0] === ''$arrQuery['value'][0] = '0';
  345.                 if ($arrQuery['value'][1] === '') {
  346.                     $numOff = (float)$arrQuery['value'][0];
  347.                     $arrQuery['value'][1] = $numOff $numOff;
  348.                 }
  349.             }
  350.         }
  351.         if (isset($arrQuery['value']) && is_string($arrQuery['value'])) {
  352.             $arrQuery['value'] = \Controller::replaceInsertTags($arrQuery['value']);
  353.             if (strpos($arrQuery['value'], ',') && $arrQuery['operator'] != 'equal') {
  354.                 $arrQuery['value'] = explode(','$arrQuery['value']);
  355.             }
  356.             if (is_string($arrQuery['value']) && $arrQuery['operator'] == 'regexp') {
  357.                 if (strpos($arrQuery['value'], ' ')) {
  358.                     $arrQuery['value'] = explode(' '$arrQuery['value']);
  359.                 }
  360.             }
  361.         }
  362.         if (isset($arrQuery['value']) && is_array($arrQuery['value']) && !in_array($arrQuery['operator'], ['contain''notContain''between'])) {
  363.             $arrQuery['multiple'] = true;
  364.         }
  365.         if ((!isset($arrQuery['value']) || $arrQuery['value'] === '') && !$blnAllowEmptyValue) {
  366.             return null;
  367.         }
  368.         if ((is_array($arrQuery['value']) && empty($arrQuery['value'])) && !$blnAllowEmptyValue) {
  369.             return null;
  370.         }
  371.         if (is_numeric($arrQuery['value']) && in_array($arrQuery['operator'], ['lte''lt''gt''gte'])) {
  372.             if (strpos((string)$arrQuery['value'], '.') !== false) {
  373.                 $arrQuery['value'] = floatval($arrQuery['value']);
  374.             } else {
  375.                 $arrQuery['value'] = (int)$arrQuery['value'];
  376.             }
  377.         }
  378.         $arrQuery['value'] = self::prepareValueForQuery($arrQuery['value']);
  379.         return $arrQuery;
  380.     }
  381.     public static function returnOnlyExistedItems($arrItems$arrExistedFields$blnKeysOnly false)
  382.     {
  383.         $arrReturn = [];
  384.         $arrExistedValues $blnKeysOnly array_keys($arrExistedFields) : $arrExistedFields;
  385.         if (!empty($arrItems) && is_array($arrItems)) {
  386.             foreach ($arrItems as $varValue) {
  387.                 if (!$varValue || !is_string($varValue)) continue;
  388.                 if (!in_array($varValue$arrExistedValues)) continue;
  389.                 $arrReturn[] = $varValue;
  390.             }
  391.         }
  392.         return $arrReturn;
  393.     }
  394.     public static function getRoutingParameter($strRoutingParameter$blnEmptyArray false)
  395.     {
  396.         $arrReturn = [];
  397.         $arrRoutingFragments explode('/'$strRoutingParameter);
  398.         if (!empty($arrRoutingFragments) && is_array($arrRoutingFragments)) {
  399.             foreach ($arrRoutingFragments as $strRoutingFragment) {
  400.                 if (!$strRoutingFragment) continue;
  401.                 preg_match_all('/{(.*?)}/'$strRoutingFragment$arrMatches);
  402.                 $strParamName implode(''$arrMatches[1]);
  403.                 if ($strParamName) {
  404.                     $arrReturn[$strParamName] = $blnEmptyArray ? [] : $strParamName;
  405.                 }
  406.             }
  407.         }
  408.         return $arrReturn;
  409.     }
  410.     public static function parseMultipleOptions($varValue)
  411.     {
  412.         if (is_string($varValue)) {
  413.             $varValue explode(','$varValue);
  414.         }
  415.         return $varValue;
  416.     }
  417.     public static function isCoreTable($strTable)
  418.     {
  419.         return is_string($strTable) && substr($strTable03) == 'tl_';
  420.     }
  421.     public static function getColumnsFromCoreTable($strTable$blnFullContext false)
  422.     {
  423.         $arrReturn = [];
  424.         \System::loadLanguageFile($strTable);
  425.         \Controller::loadDataContainer($strTable);
  426.         $arrFields $GLOBALS['TL_DCA'][$strTable]['fields'];
  427.         if (!empty($arrFields) && is_array($arrFields)) {
  428.             foreach ($arrFields as $strFieldname => $arrField) {
  429.                 if (!isset($arrField['sql'])) continue;
  430.                 $varContext $arrField;
  431.                 if (!$blnFullContext) {
  432.                     $strTitle $strFieldname;
  433.                     if (is_array($arrField['label'])) {
  434.                         $varContext $arrField['label'][0] ?: $strTitle;
  435.                     }
  436.                 }
  437.                 $arrReturn[$strFieldname] = $varContext;
  438.             }
  439.         }
  440.         return $arrReturn;
  441.     }
  442.     public static function parseCatalogValues($arrData$arrFields = [], $blnJustStrings false$strJoinedTable '')
  443.     {
  444.         if (!empty($arrData) && is_array($arrData)) {
  445.             foreach ($arrData as $strFieldname => $strOriginValue) {
  446.                 $strField $strFieldname;
  447.                 if (Toolkit::isEmpty($strOriginValue)) continue;
  448.                 if ($strJoinedTable) {
  449.                     $strField $strJoinedTable ucfirst($strFieldname);
  450.                 }
  451.                 $arrField $arrFields[$strField] ?? null;
  452.                 if (is_null($arrField)) continue;
  453.                 if (!isset($arrField['type']) || !$arrField['type']) continue;
  454.                 $varValue = static::parseCatalogValue($strOriginValue$arrField$arrData);
  455.                 if ($blnJustStrings) {
  456.                     if (is_array($varValue) && $arrField['type'] != 'upload') {
  457.                         $varValue implode(', '$varValue);
  458.                     }
  459.                     if (is_array($varValue) && $arrField['type'] == 'upload') {
  460.                         if (isset($varValue[0])) {
  461.                             $varValue $varValue[0]['singleSRC'];
  462.                         } else {
  463.                             $varValue $varValue['singleSRC'];
  464.                         }
  465.                     }
  466.                 }
  467.                 $arrData[$strFieldname] = Toolkit::isEmpty($varValue) ? $strOriginValue $varValue;
  468.             }
  469.         }
  470.         return $arrData;
  471.     }
  472.     public static function parseCatalogValue($strValue$arrField$arrData = [])
  473.     {
  474.         switch ($arrField['type']) {
  475.             case 'upload':
  476.                 $blnFrontend TL_MODE == 'FE' || $arrField['useArrayFormat'];
  477.                 if ($blnFrontend) {
  478.                     $strValue Upload::parseValue($strValue$arrField$arrData);
  479.                     if (is_array($strValue) && $arrField['fileType'] == 'gallery') {
  480.                         if ($strValue['preview']) $arrData[$arrField['fieldname'] . 'Preview'] = $strValue['preview'];
  481.                         $strValue $strValue['gallery'];
  482.                     }
  483.                 } else {
  484.                     $strValue Upload::parseThumbnails($strValue$arrField$arrData);
  485.                 }
  486.                 break;
  487.             case 'select':
  488.                 $strValue Select::parseValue($strValue$arrField$arrData);
  489.                 break;
  490.             case 'checkbox':
  491.                 $strValue Checkbox::parseValue($strValue$arrField$arrData);
  492.                 break;
  493.             case 'radio':
  494.                 $strValue Radio::parseValue($strValue$arrField$arrData);
  495.                 break;
  496.             case 'date':
  497.                 $strValue DateInput::parseValue($strValue$arrField$arrData);
  498.                 break;
  499.             case 'number':
  500.                 $strValue Number::parseValue($strValue$arrField$arrData);
  501.                 break;
  502.             case 'textarea':
  503.                 $strValue Textarea::parseValue($strValue$arrField$arrData);
  504.                 break;
  505.             case 'dbColumn':
  506.                 $strValue DbColumn::parseValue($strValue$arrField$arrData);
  507.                 break;
  508.         }
  509.         return $strValue;
  510.     }
  511.     public static function createPanelLayout($arrPanelLayout)
  512.     {
  513.         $arrPanelLayout is_array($arrPanelLayout) ? $arrPanelLayout : [];
  514.         $strPanelLayout implode(','$arrPanelLayout);
  515.         if (strpos($strPanelLayout'filter') !== false) {
  516.             $strPanelLayout preg_replace('/,/'';'$strPanelLayout1);
  517.         }
  518.         return $strPanelLayout;
  519.     }
  520.     public static function getLabelValue($varValue$strFallback)
  521.     {
  522.         if (Toolkit::isEmpty($varValue)) return $strFallback;
  523.         if (is_array($varValue)) return $varValue[0] ?: '';
  524.         if (is_string($varValue)) return $varValue ?: '';
  525.         return $strFallback;
  526.     }
  527.     public static function getBackendModuleTablesByDoAttribute($strDo)
  528.     {
  529.         if (is_array($GLOBALS['BE_MOD']) && TL_MODE == 'BE' && !Toolkit::isEmpty($strDo)) {
  530.             foreach ($GLOBALS['BE_MOD'] as $arrModules) {
  531.                 foreach ($arrModules as $strModulename => $arrModule) {
  532.                     if ($strModulename == $strDo) {
  533.                         return is_array($arrModule['tables']) ? $arrModule['tables'] : [];
  534.                     }
  535.                 }
  536.             }
  537.         }
  538.         return [];
  539.     }
  540.     public static function strictMode()
  541.     {
  542.         if (!isset($GLOBALS['TL_CONFIG']['ctlg_strict_mode']) || !is_bool($GLOBALS['TL_CONFIG']['ctlg_strict_mode'])) return true;
  543.         return $GLOBALS['TL_CONFIG']['ctlg_strict_mode'] ? true false;
  544.     }
  545.     public static function ignoreRomanization()
  546.     {
  547.         if (!isset($GLOBALS['TL_CONFIG']['ctlg_ignore_romanization']) || !is_bool($GLOBALS['TL_CONFIG']['ctlg_ignore_romanization'])) return false;
  548.         return $GLOBALS['TL_CONFIG']['ctlg_ignore_romanization'] ? true false;
  549.     }
  550.     public static function dump($varDump)
  551.     {
  552.         echo '<pre>' var_export($varDumptrue) . '</pre>';
  553.     }
  554.     public static function flatter($arrValues, &$arrFlattedArray = [])
  555.     {
  556.         foreach ($arrValues as $strKey => $varValue) {
  557.             if (is_array($varValue)) {
  558.                 static::flatter($varValue$arrFlattedArray);
  559.                 continue;
  560.             }
  561.             $arrFlattedArray[] = [
  562.                 'key' => $strKey,
  563.                 'value' => $varValue
  564.             ];
  565.         }
  566.         return $arrFlattedArray;
  567.     }
  568.     public static function hasDynAlias()
  569.     {
  570.         return is_bool(\Config::get('dynAlias')) && \Config::get('dynAlias') === true;
  571.     }
  572.     public static function setTokens($arrRow$strName, &$arrTokens = [])
  573.     {
  574.         foreach ($arrRow as $strFieldname => $strValue) {
  575.             $arrTokens[$strName $strFieldname] = $strValue;
  576.         }
  577.         return $arrTokens;
  578.     }
  579.     public static function parsePseudoInserttag($strValue ''$arrData = [])
  580.     {
  581.         if (!empty($strValue) && is_string($strValue) && strpos($strValue'{{') !== false) {
  582.             $arrTags preg_split('/{{(([^{}]*|(?R))*)}}/'$strValue, -1PREG_SPLIT_DELIM_CAPTURE);
  583.             $strTag implode(''$arrTags);
  584.             if ($strTag && isset($arrData) && is_array($arrData)) {
  585.                 return Toolkit::isEmpty($arrData[$strTag]) ? '' $arrData[$strTag];
  586.             }
  587.         }
  588.         return $strValue;
  589.     }
  590.     public static function flatterWithoutKeyValue($arrValues, &$arrReturn$strPrefix '')
  591.     {
  592.         if (is_array($arrValues) && !empty($arrValues)) {
  593.             foreach ($arrValues as $strField => $varValue) {
  594.                 if (is_array($varValue)) {
  595.                     static::flatterWithoutKeyValue($varValue$arrReturn$strField);
  596.                 } else {
  597.                     $arrReturn[($strPrefix $strPrefix '_' '') . $strField] = $varValue;
  598.                 }
  599.             }
  600.         }
  601.     }
  602.     public static function getIcon($strType)
  603.     {
  604.         return $GLOBALS['CM_ICON_SET'][$strType];
  605.     }
  606.     public static function slug($strValue$arrOptions = [])
  607.     {
  608.         $strValue \StringUtil::generateAlias($strValue);
  609.         if (version_compare(VERSION'3.5''>') && class_exists('Ausi\SlugGenerator\SlugGenerator') && !Toolkit::ignoreRomanization()) {
  610.             $strDelimiter '-';
  611.             if (isset($arrOptions['delimiter']) && $arrOptions['delimiter']) {
  612.                 $strDelimiter $arrOptions['delimiter'];
  613.             }
  614.             $objSlugGenerator = new \Ausi\SlugGenerator\SlugGenerator((new \Ausi\SlugGenerator\SlugOptions)
  615.                 ->setValidChars('a-zA-Z0-9')
  616.                 ->setLocale('de')
  617.                 ->setDelimiter($strDelimiter)
  618.             );
  619.             $strValue $objSlugGenerator->generate($strValue);
  620.         }
  621.         return $strValue;
  622.     }
  623.     public static function getEntityUrl($strModuleId$strEntityId)
  624.     {
  625.         $objDatabase \Database::getInstance();
  626.         $objModule $objDatabase->prepare('SELECT * FROM tl_module WHERE id = ?')->limit(1)->execute($strModuleId);
  627.         if (!$objModule->catalogTablename || !$objModule->catalogUseMasterPage || !$objModule->catalogMasterPage) {
  628.             return '';
  629.         }
  630.         $objEntity $objDatabase->prepare('SELECT * FROM ' $objModule->catalogTablename ' WHERE id = ?')->limit(1)->execute($strEntityId);
  631.         if (!$objEntity->alias) {
  632.             return '';
  633.         }
  634.         $objPage \PageModel::findByPk($objModule->catalogMasterPage);
  635.         if ($objPage == null) {
  636.             return '';
  637.         }
  638.         if ($objPage->catalogUseRouting && $objPage->catalogRouting) {
  639.             $objEntity->alias = static::generateAliasWithRouting($objEntity->alias, static::getRoutingParameter($objPage->catalogRouting), $objEntity->row());
  640.         }
  641.         return \Controller::generateFrontendUrl($objPage->row(), ($objEntity->alias '/' $objEntity->alias ''));
  642.     }
  643.     public static function generateAliasWithRouting($strAlias$arrRoutingParameter$arrCatalog = [])
  644.     {
  645.         $strAliasWithFragments '';
  646.         if (!in_array('auto_item'$arrRoutingParameter)) {
  647.             return $strAlias;
  648.         }
  649.         $intIndex 0;
  650.         $intTotal count($arrRoutingParameter) - 1;
  651.         $blnAutoItem in_array('auto_item'$arrRoutingParameter);
  652.         foreach ($arrRoutingParameter as $strParameter) {
  653.             ++$intIndex;
  654.             if ($strParameter === 'auto_item') {
  655.                 if (Toolkit::isEmpty($strAlias)) continue;
  656.                 $strAliasWithFragments .= '/' $strAlias;
  657.                 continue;
  658.             }
  659.             if (!Toolkit::isEmpty($arrCatalog[$strParameter])) {
  660.                 $strAliasWithFragments .= $arrCatalog[$strParameter] . ($intIndex != $intTotal && $blnAutoItem '/' '');
  661.             } else {
  662.                 $strAliasWithFragments .= ' ' . ($intIndex != $intTotal && $blnAutoItem '/' '');
  663.             }
  664.         }
  665.         if ($strAliasWithFragments) {
  666.             $strAlias $strAliasWithFragments;
  667.         }
  668.         return $strAlias;
  669.     }
  670.     public static function generateDynValue($strSimpleTokens$arrValues)
  671.     {
  672.         return \StringUtil::parseSimpleTokens($strSimpleTokens$arrValues);
  673.     }
  674. }