‪TYPO3CMS  9.5
AbstractConditionMatcher.php
Go to the documentation of this file.
1 <?php
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
17 use Psr\Log\LoggerAwareInterface;
18 use Psr\Log\LoggerAwareTrait;
19 use Symfony\Component\ExpressionLanguage\SyntaxError;
29 
36 abstract class ‪AbstractConditionMatcher implements LoggerAwareInterface
37 {
38  use LoggerAwareTrait;
39 
45  protected ‪$pageId;
46 
52  protected ‪$rootline;
53 
60  protected ‪$simulateMatchResult = false;
61 
69 
74 
79 
80  protected function ‪initializeExpressionLanguageResolver(): void
81  {
83  $this->expressionLanguageResolver = GeneralUtility::makeInstance(
84  Resolver::class,
85  'typoscript',
86  $this->expressionLanguageResolverVariables
87  );
88  }
89 
90  protected function ‪updateExpressionLanguageVariables(): void
91  {
92  // deliberately empty and not "abstract" due to backwards compatibility
93  // implement this method in derived classes
94  }
95 
99  protected function ‪strictSyntaxEnabled(): bool
100  {
101  return GeneralUtility::makeInstance(Features::class)->isFeatureEnabled('TypoScript.strictSyntax');
102  }
103 
109  public function ‪setPageId(‪$pageId)
110  {
111  if (is_int(‪$pageId) && ‪$pageId > 0) {
112  $this->pageId = ‪$pageId;
113  }
115  }
116 
122  public function ‪getPageId()
123  {
124  return ‪$this->pageId;
125  }
126 
132  public function ‪setRootline(array ‪$rootline)
133  {
134  if (!empty(‪$rootline)) {
135  $this->rootline = ‪$rootline;
136  }
138  }
139 
145  public function ‪getRootline()
146  {
147  return ‪$this->rootline;
148  }
149 
155  public function ‪setSimulateMatchResult($simulateMatchResult)
156  {
157  if (is_bool(‪$simulateMatchResult)) {
158  $this->simulateMatchResult = ‪$simulateMatchResult;
159  }
160  }
161 
168  {
169  $this->simulateMatchConditions = ‪$simulateMatchConditions;
170  }
171 
181  protected function ‪normalizeExpression($expression)
182  {
183  $removeSpaces = '/
184  \\s*
185  ( # subroutine 1
186  \\[
187  (?:
188  [^\\[\\]] # any character except []
189  | (?1) # recursive subroutine 1 when brackets are around
190  )*
191  \\]
192  )
193  \\s*
194  /xi';
195 
196  $adjacentBrackets = '/
197  ( # subroutine 1
198  \\[
199  (?:
200  [^\\[\\]] # any character except []
201  | (?1) # recursive subroutine 1 when brackets are around
202  )*
203  \\]
204  )
205  (*SKIP) # avoid backtracking into completed bracket expressions
206  \\[ # match the following [
207  /xi';
208 
209  return preg_replace(
210  [
211  $removeSpaces,
212  '/\\]AND\\[/i',
213  '/\\]OR\\[/i',
214  $adjacentBrackets
215  ],
216  [
217  '\\1',
218  ']&&[',
219  ']||[',
220  '\\1||['
221  ],
222  trim($expression)
223  );
224  }
225 
232  public function ‪match($expression)
233  {
234  // Return directly if result should be simulated:
235  if ($this->simulateMatchResult) {
237  }
238  // Return directly if matching for specific condition is simulated only:
239  if (!empty($this->simulateMatchConditions)) {
240  return in_array($expression, $this->simulateMatchConditions);
241  }
242  // Sets the current pageId if not defined yet:
243  if (!isset($this->pageId)) {
244  $this->pageId = $this->‪determinePageId();
245  }
246  // Sets the rootline if not defined yet:
247  if (!isset($this->rootline)) {
248  $this->rootline = $this->‪determineRootline();
249  }
250  $result = false;
251  $normalizedExpression = $this->‪normalizeExpression($expression);
252  // First and last character must be square brackets (e.g. "[A]&&[B]":
253  if ($normalizedExpression[0] === '[' && substr($normalizedExpression, -1) === ']') {
254  $innerExpression = substr($normalizedExpression, 1, -1);
255  $orParts = explode(']||[', $innerExpression);
256  if ($this->‪strictSyntaxEnabled() && count($orParts) > 1) {
257  trigger_error('Multiple conditions blocks combined with AND, OR, && or || will be removed in TYPO3 v10.0, use the new expression language.', E_USER_DEPRECATED);
258  }
259  foreach ($orParts as $orPart) {
260  $andParts = explode(']&&[', $orPart);
261  if ($this->‪strictSyntaxEnabled() && count($andParts) > 1) {
262  trigger_error('Multiple conditions blocks combined with AND, OR, && or || will be removed in TYPO3 v10.0, use the new expression language.', E_USER_DEPRECATED);
263  }
264  foreach ($andParts as $andPart) {
265  $result = $this->‪evaluateExpression($andPart);
266  if (!is_bool($result)) {
267  $result = $this->‪evaluateCondition($andPart);
268  }
269  // If condition in AND context fails, the whole block is FALSE:
270  if ($result === false) {
271  break;
272  }
273  }
274  // If condition in OR context succeeds, the whole expression is TRUE:
275  if ($result === true) {
276  break;
277  }
278  }
279  }
280  return $result;
281  }
282 
287  protected function ‪evaluateExpression(string $expression): ?bool
288  {
289  try {
290  $result = $this->expressionLanguageResolver->evaluate($expression);
291  if ($result !== null) {
292  return $result;
293  }
294  } catch (MissingTsfeException $e) {
295  // TSFE is not available in the current context (e.g. TSFE in BE context),
296  // we set all conditions false for this case.
297  return false;
298  } catch (SyntaxError $exception) {
299  // SyntaxException means no support, let's try the fallback
300  $message = 'Expression could not be parsed, fallback kicks in.';
301  if (strpos($exception->getMessage(), 'Unexpected character "="') !== false) {
302  $message .= ' It looks like an old condition with only one equal sign.';
303  }
304  $this->logger->log(
306  $message,
307  ['expression' => $expression]
308  );
309  } catch (\Throwable $exception) {
310  // The following error handling is required to mitigate a missing type check
311  // in the Symfony Expression Language handling. In case a condition
312  // use "in" or "not in" check in combination with a non array a PHP Warning
313  // is thrown. Example: [1 in "foo"] or ["bar" in "foo,baz"]
314  // This conditions are wrong for sure, but they will break the complete installation
315  // including the backend. To mitigate the problem we do the following:
316  // 1) In FE an InvalidTypoScriptConditionException is thrown (if strictSyntax is enabled)
317  // 2) In FE silent catch this error and log it (if strictSyntax is disabled)
318  // 3) In BE silent catch this error and log it, but never break the backend.
319  $this->logger->error($exception->getMessage(), [
320  'expression' => $expression,
321  'exception' => $exception
322  ]);
323  if (TYPO3_MODE === 'FE'
324  && $exception instanceof Exception
325  && $this->‪strictSyntaxEnabled()
326  && strpos($exception->getMessage(), 'in_array() expects parameter 2 to be array') !== false
327  ) {
328  throw new InvalidTypoScriptConditionException('Invalid expression in condition: [' . $expression . ']', 1536950931);
329  }
330  }
331  return null;
332  }
333 
342  protected function ‪evaluateConditionCommon($key, $value)
343  {
344  $keyParts = GeneralUtility::trimExplode('|', $key);
345  switch ($keyParts[0]) {
346  case 'applicationContext':
347  $values = GeneralUtility::trimExplode(',', $value, true);
348  $currentApplicationContext = GeneralUtility::getApplicationContext();
349  foreach ($values as $applicationContext) {
350  if ($this->‪searchStringWildcard($currentApplicationContext, $applicationContext)) {
351  return true;
352  }
353  }
354  return false;
355  case 'language':
356  if (GeneralUtility::getIndpEnv('HTTP_ACCEPT_LANGUAGE') === $value) {
357  return true;
358  }
359  $values = GeneralUtility::trimExplode(',', $value, true);
360  foreach ($values as $test) {
361  // matches a string with asterix in front and back. See https://docs.typo3.org/typo3cms/TyposcriptReference/Conditions/Reference.html#language for use case.
362  if (preg_match('/^\\*.+\\*$/', $test)) {
363  $allLanguages = preg_split('/[,;]/', GeneralUtility::getIndpEnv('HTTP_ACCEPT_LANGUAGE'));
364  if (in_array(substr($test, 1, -1), $allLanguages)) {
365  return true;
366  }
367  } elseif (GeneralUtility::getIndpEnv('HTTP_ACCEPT_LANGUAGE') == $test) {
368  return true;
369  }
370  }
371  return false;
372  case 'IP':
373  if ($value === 'devIP') {
374  $value = trim(‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask']);
375  }
376 
377  return (bool)GeneralUtility::cmpIP(GeneralUtility::getIndpEnv('REMOTE_ADDR'), $value);
378  case 'hostname':
379  return (bool)GeneralUtility::cmpFQDN(GeneralUtility::getIndpEnv('REMOTE_ADDR'), $value);
380  case 'hour':
381  case 'minute':
382  case 'month':
383  case 'year':
384  case 'dayofweek':
385  case 'dayofmonth':
386  case 'dayofyear':
387  // In order to simulate time properly in templates.
388  $theEvalTime = ‪$GLOBALS['SIM_EXEC_TIME'];
389  switch ($key) {
390  case 'hour':
391  $theTestValue = date('H', $theEvalTime);
392  break;
393  case 'minute':
394  $theTestValue = date('i', $theEvalTime);
395  break;
396  case 'month':
397  $theTestValue = date('m', $theEvalTime);
398  break;
399  case 'year':
400  $theTestValue = date('Y', $theEvalTime);
401  break;
402  case 'dayofweek':
403  $theTestValue = date('w', $theEvalTime);
404  break;
405  case 'dayofmonth':
406  $theTestValue = date('d', $theEvalTime);
407  break;
408  case 'dayofyear':
409  $theTestValue = date('z', $theEvalTime);
410  break;
411  default:
412  $theTestValue = 0;
413  break;
414  }
415  $theTestValue = (int)$theTestValue;
416  // comp
417  $values = GeneralUtility::trimExplode(',', $value, true);
418  foreach ($values as $test) {
419  if (\‪TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($test)) {
420  $test = '=' . $test;
421  }
422  if ($this->‪compareNumber($test, $theTestValue)) {
423  return true;
424  }
425  }
426  return false;
427  case 'compatVersion':
429  case 'loginUser':
430  if ($this->‪isUserLoggedIn()) {
431  $values = GeneralUtility::trimExplode(',', $value, true);
432  foreach ($values as $test) {
433  if ($test === '*' || (string)$this->‪getUserId() === (string)$test) {
434  return true;
435  }
436  }
437  } elseif ($value === '') {
438  return true;
439  }
440  return false;
441  case 'page':
442  if ($keyParts[1]) {
443  $page = $this->‪getPage();
444  $property = $keyParts[1];
445  if (!empty($page) && isset($page[$property]) && (string)$page[$property] === (string)$value) {
446  return true;
447  }
448  }
449  return false;
450  case 'globalVar':
451  $values = GeneralUtility::trimExplode(',', $value, true);
452  foreach ($values as $test) {
453  $point = strcspn($test, '!=<>');
454  $theVarName = substr($test, 0, $point);
455  $nv = $this->‪getVariable(trim($theVarName));
456  $testValue = substr($test, $point);
457  if ($this->‪compareNumber($testValue, $nv)) {
458  return true;
459  }
460  }
461  return false;
462  case 'globalString':
463  $values = GeneralUtility::trimExplode(',', $value, true);
464  foreach ($values as $test) {
465  $point = strcspn($test, '=');
466  $theVarName = substr($test, 0, $point);
467  $nv = (string)$this->‪getVariable(trim($theVarName));
468  $testValue = substr($test, $point + 1);
469  if ($this->‪searchStringWildcard($nv, trim($testValue))) {
470  return true;
471  }
472  }
473  return false;
474  case 'userFunc':
475  $matches = [];
476  preg_match_all('/^\s*([^\‍(\s]+)\s*(?:\‍((.*)\‍))?\s*$/', $value, $matches);
477  $funcName = $matches[1][0];
478  $funcValues = trim($matches[2][0]) !== '' ? $this->‪parseUserFuncArguments($matches[2][0]) : [];
479  if (is_callable($funcName) && call_user_func_array($funcName, $funcValues)) {
480  return true;
481  }
482  return false;
483  }
484  return null;
485  }
486 
496  protected function ‪evaluateCustomDefinedCondition($condition)
497  {
498  $conditionResult = null;
499 
500  list($conditionClassName, $conditionParameters) = GeneralUtility::trimExplode(' ', $condition, false, 2);
501 
502  // Check if the condition class name is a valid class
503  // This is necessary to not stop here for the conditions ELSE and GLOBAL
504  if (class_exists($conditionClassName)) {
505  // Use like this: [MyCompany\MyPackage\ConditionMatcher\MyOwnConditionMatcher = myvalue]
507  $conditionObject = GeneralUtility::makeInstance($conditionClassName);
508  if (($conditionObject instanceof \‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractCondition) === false) {
509  throw new \TYPO3\CMS\Core\Configuration\TypoScript\Exception\InvalidTypoScriptConditionException(
510  '"' . $conditionClassName . '" is not a valid TypoScript Condition object.',
511  1410286153
512  );
513  }
514 
515  $conditionParameters = $this->‪parseUserFuncArguments($conditionParameters);
516  $conditionObject->setConditionMatcherInstance($this);
517  $conditionResult = $conditionObject->matchCondition($conditionParameters);
518  }
519 
520  return $conditionResult;
521  }
522 
530  protected function ‪parseUserFuncArguments($arguments)
531  {
532  $result = [];
533  $arguments = trim($arguments);
534  while ($arguments !== '') {
535  if ($arguments[0] === ',') {
536  $result[] = '';
537  $arguments = substr($arguments, 1);
538  } else {
539  $pos = strcspn($arguments, ',\'"');
540  if ($pos == 0) {
541  // We hit a quote of some kind
542  $quote = $arguments[0];
543  $segment = preg_replace('/^(.*?[^\\\])' . $quote . '.*$/', '\1', substr($arguments, 1));
544  $segment = str_replace('\\' . $quote, $quote, $segment);
545  $result[] = $segment;
546  // shorten $arguments
547  $arguments = substr($arguments, strlen($segment) + 2);
548  $offset = strpos($arguments, ',');
549  if ($offset === false) {
550  $offset = strlen($arguments);
551  }
552  $arguments = substr($arguments, $offset + 1);
553  } else {
554  $result[] = trim(substr($arguments, 0, $pos));
555  $arguments = substr($arguments, $pos + 1);
556  }
557  }
558  $arguments = trim($arguments);
559  }
560  return $result;
561  }
562 
570  protected function ‪getVariableCommon(array $vars)
571  {
572  $value = null;
573  $namespace = trim($vars[0]);
574  if (count($vars) === 1) {
575  $value = $this->‪getGlobal($vars[0]);
576  } elseif ($namespace === 'LIT') {
577  $value = trim($vars[1]);
578  } else {
579  $splitAgain = explode('|', $vars[1], 2);
580  $k = trim($splitAgain[0]);
581  if ($k) {
582  switch ($namespace) {
583  case 'GP':
584  $value = GeneralUtility::_GP($k);
585  break;
586  case 'GPmerged':
587  $value = GeneralUtility::_GPmerged($k);
588  break;
589  case 'ENV':
590  $value = getenv($k);
591  break;
592  case 'IENV':
593  $value = GeneralUtility::getIndpEnv($k);
594  break;
595  default:
596  return null;
597  }
598  // If array:
599  if (count($splitAgain) > 1) {
600  if (is_array($value) && trim($splitAgain[1]) !== '') {
601  $value = $this->‪getGlobal($splitAgain[1], $value);
602  } else {
603  $value = '';
604  }
605  }
606  }
607  }
608  return $value;
609  }
610 
619  protected function ‪compareNumber($test, $leftValue)
620  {
621  if (preg_match('/^(!?=+|<=?|>=?)\\s*([^\\s]*)\\s*$/', $test, $matches)) {
622  $operator = $matches[1];
623  $rightValue = $matches[2];
624  switch ($operator) {
625  case '>=':
626  return $leftValue >= (float)$rightValue;
627  break;
628  case '<=':
629  return $leftValue <= (float)$rightValue;
630  break;
631  case '!=':
632  // multiple values may be split with '|'
633  // see if none matches ("not in list")
634  $found = false;
635  $rightValueParts = GeneralUtility::trimExplode('|', $rightValue);
636  foreach ($rightValueParts as $rightValueSingle) {
637  if ($leftValue == (float)$rightValueSingle) {
638  $found = true;
639  break;
640  }
641  }
642  return $found === false;
643  break;
644  case '<':
645  return $leftValue < (float)$rightValue;
646  break;
647  case '>':
648  return $leftValue > (float)$rightValue;
649  break;
650  default:
651  // nothing valid found except '=', use '='
652  // multiple values may be split with '|'
653  // see if one matches ("in list")
654  $found = false;
655  $rightValueParts = GeneralUtility::trimExplode('|', $rightValue);
656  foreach ($rightValueParts as $rightValueSingle) {
657  if ($leftValue == $rightValueSingle) {
658  $found = true;
659  break;
660  }
661  }
662  return $found;
663  }
664  }
665  return false;
666  }
667 
676  protected function ‪searchStringWildcard($haystack, $needle)
677  {
678  return ‪StringUtility::searchStringWildcard($haystack, $needle);
679  }
680 
690  protected function ‪getGlobal($var, $source = null)
691  {
692  $vars = explode('|', $var);
693  $c = count($vars);
694  $k = trim($vars[0]);
695  $theVar = isset($source) ? ($source[$k] ?? null) : (‪$GLOBALS[$k] ?? null);
696  for ($a = 1; $a < $c; $a++) {
697  if (!isset($theVar)) {
698  break;
699  }
700  $key = trim($vars[$a]);
701  if (is_object($theVar)) {
702  $theVar = $theVar->{$key};
703  } elseif (is_array($theVar)) {
704  $theVar = $theVar[$key];
705  } else {
706  return '';
707  }
708  }
709  if (!is_array($theVar) && !is_object($theVar)) {
710  return $theVar;
711  }
712  return '';
713  }
714 
723  abstract protected function evaluateCondition($string);
724 
738  abstract protected function getVariable($name);
739 
746  abstract protected function getGroupList();
747 
754  abstract protected function determinePageId();
755 
762  abstract protected function getPage();
763 
770  abstract protected function determineRootline();
771 
778  abstract protected function getUserId();
779 
786  abstract protected function isUserLoggedIn();
787 }
‪TYPO3\CMS\Core\Utility\VersionNumberUtility
Definition: VersionNumberUtility.php:21
‪TYPO3\CMS\Core\Utility\StringUtility\searchStringWildcard
‪static bool searchStringWildcard($haystack, $needle)
Definition: StringUtility.php:133
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\getPage
‪array getPage()
‪TYPO3\CMS\Core\Configuration\TypoScript\Exception\InvalidTypoScriptConditionException
Definition: InvalidTypoScriptConditionException.php:23
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\determineRootline
‪array determineRootline()
‪TYPO3\CMS\Core\Log\LogLevel\INFO
‪const INFO
Definition: LogLevel.php:85
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractCondition
Definition: AbstractCondition.php:23
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\evaluateCustomDefinedCondition
‪bool null evaluateCustomDefinedCondition($condition)
Definition: AbstractConditionMatcher.php:490
‪TYPO3
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\setRootline
‪setRootline(array $rootline)
Definition: AbstractConditionMatcher.php:126
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\match
‪bool match($expression)
Definition: AbstractConditionMatcher.php:226
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\$simulateMatchResult
‪bool $simulateMatchResult
Definition: AbstractConditionMatcher.php:57
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\getUserId
‪int getUserId()
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\$pageId
‪int $pageId
Definition: AbstractConditionMatcher.php:44
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\parseUserFuncArguments
‪array parseUserFuncArguments($arguments)
Definition: AbstractConditionMatcher.php:524
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\getPageId
‪int getPageId()
Definition: AbstractConditionMatcher.php:116
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\determinePageId
‪int determinePageId()
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\$simulateMatchConditions
‪array $simulateMatchConditions
Definition: AbstractConditionMatcher.php:64
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\normalizeExpression
‪string normalizeExpression($expression)
Definition: AbstractConditionMatcher.php:175
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\setSimulateMatchResult
‪setSimulateMatchResult($simulateMatchResult)
Definition: AbstractConditionMatcher.php:149
‪TYPO3\CMS\Core\Exception\MissingTsfeException
Definition: MissingTsfeException.php:20
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\getVariable
‪mixed getVariable($name)
‪TYPO3\CMS\Core\Utility\VersionNumberUtility\convertVersionNumberToInteger
‪static int convertVersionNumberToInteger($versionNumber)
Definition: VersionNumberUtility.php:28
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\evaluateConditionCommon
‪bool null evaluateConditionCommon($key, $value)
Definition: AbstractConditionMatcher.php:336
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher
Definition: AbstractConditionMatcher.php:37
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\$rootline
‪array $rootline
Definition: AbstractConditionMatcher.php:50
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\setSimulateMatchConditions
‪setSimulateMatchConditions(array $simulateMatchConditions)
Definition: AbstractConditionMatcher.php:161
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\searchStringWildcard
‪bool searchStringWildcard($haystack, $needle)
Definition: AbstractConditionMatcher.php:670
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\getGlobal
‪mixed getGlobal($var, $source=null)
Definition: AbstractConditionMatcher.php:684
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\compareNumber
‪bool compareNumber($test, $leftValue)
Definition: AbstractConditionMatcher.php:613
‪TYPO3\CMS\Core\Configuration\Features
Definition: Features.php:54
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\getRootline
‪array getRootline()
Definition: AbstractConditionMatcher.php:139
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\updateExpressionLanguageVariables
‪updateExpressionLanguageVariables()
Definition: AbstractConditionMatcher.php:84
‪TYPO3\CMS\Core\Error\Exception
Definition: Exception.php:21
‪TYPO3\CMS\Core\Log\LogLevel\WARNING
‪const WARNING
Definition: LogLevel.php:67
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\initializeExpressionLanguageResolver
‪initializeExpressionLanguageResolver()
Definition: AbstractConditionMatcher.php:74
‪TYPO3\CMS\Core\ExpressionLanguage\Resolver
Definition: Resolver.php:25
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\$expressionLanguageResolverVariables
‪array $expressionLanguageResolverVariables
Definition: AbstractConditionMatcher.php:72
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:5
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\evaluateExpression
‪bool null evaluateExpression(string $expression)
Definition: AbstractConditionMatcher.php:281
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\strictSyntaxEnabled
‪bool strictSyntaxEnabled()
Definition: AbstractConditionMatcher.php:93
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\evaluateCondition
‪bool evaluateCondition($string)
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\isUserLoggedIn
‪bool isUserLoggedIn()
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:45
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:21
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\$expressionLanguageResolver
‪Resolver $expressionLanguageResolver
Definition: AbstractConditionMatcher.php:68
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching
Definition: AbstractCondition.php:2
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\setPageId
‪setPageId($pageId)
Definition: AbstractConditionMatcher.php:103
‪TYPO3\CMS\Core\Log\LogLevel
Definition: LogLevel.php:21
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\getVariableCommon
‪mixed getVariableCommon(array $vars)
Definition: AbstractConditionMatcher.php:564
‪TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher\getGroupList
‪string getGroupList()