‪TYPO3CMS  9.5
SoftReferenceIndex.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 
30 
80 {
84  public ‪$tokenID_basePrefix = '';
85 
98  public function ‪findRef($table, $field, $uid, $content, $spKey, $spParams, $structurePath = '')
99  {
100  $retVal = false;
101  $this->tokenID_basePrefix = $table . ':' . $uid . ':' . $field . ':' . $structurePath . ':' . $spKey;
102  switch ($spKey) {
103  case 'notify':
104  // Simple notification
105  $resultArray = [
106  'elements' => [
107  [
108  'matchString' => $content
109  ]
110  ]
111  ];
112  $retVal = $resultArray;
113  break;
114  case 'substitute':
115  $tokenID = $this->‪makeTokenID();
116  $resultArray = [
117  'content' => '{softref:' . $tokenID . '}',
118  'elements' => [
119  [
120  'matchString' => $content,
121  'subst' => [
122  'type' => 'string',
123  'tokenID' => $tokenID,
124  'tokenValue' => $content
125  ]
126  ]
127  ]
128  ];
129  $retVal = $resultArray;
130  break;
131  case 'images':
132  $retVal = $this->‪findRef_images($content);
133  break;
134  case 'typolink':
135  $retVal = $this->‪findRef_typolink($content, $spParams);
136  break;
137  case 'typolink_tag':
138  $retVal = $this->‪findRef_typolink_tag($content);
139  break;
140  case 'ext_fileref':
141  $retVal = $this->‪findRef_extension_fileref($content);
142  break;
143  case 'email':
144  $retVal = $this->‪findRef_email($content, $spParams);
145  break;
146  case 'url':
147  $retVal = $this->‪findRef_url($content, $spParams);
148  break;
149  default:
150  $retVal = false;
151  }
152  return $retVal;
153  }
154 
164  public function ‪findRef_images($content)
165  {
166  // Start HTML parser and split content by image tag:
167  $htmlParser = GeneralUtility::makeInstance(\‪TYPO3\CMS\Core\Html\HtmlParser::class);
168  $splitContent = $htmlParser->splitTags('img', $content);
169  $elements = [];
170  // Traverse splitted parts:
171  foreach ($splitContent as $k => $v) {
172  if ($k % 2) {
173  // Get file reference:
174  $attribs = $htmlParser->get_tag_attributes($v);
175  $srcRef = htmlspecialchars_decode($attribs[0]['src']);
176  $pI = pathinfo($srcRef);
177  // If it looks like a local image, continue. Otherwise ignore it.
178  $absPath = GeneralUtility::getFileAbsFileName(‪Environment::getPublicPath() . '/' . $srcRef);
179  if (!$pI['scheme'] && !$pI['query'] && $absPath && $srcRef !== 'clear.gif') {
180  // @deprecated since TYPO3 v9, will be removed in TYPO3 v10.0. Deprecation logged by TcaMigration class.
181  // Initialize the element entry with info text here:
182  $tokenID = $this->‪makeTokenID($k);
183  $elements[$k] = [];
184  $elements[$k]['matchString'] = $v;
185  // If the image seems to be an RTE image, then proceed to set up substitution token:
186  if (GeneralUtility::isFirstPartOfStr($srcRef, 'uploads/') && preg_match('/^RTEmagicC_/', ‪PathUtility::basename($srcRef))) {
187  // Token and substitute value:
188  // Make sure the value we work on is found and will get substituted in the content (Very important that the src-value is not DeHSC'ed)
189  if (strstr($splitContent[$k], $attribs[0]['src'])) {
190  // Substitute value with token (this is not be an exact method if the value is in there twice, but we assume it will not)
191  $splitContent[$k] = str_replace($attribs[0]['src'], '{softref:' . $tokenID . '}', $splitContent[$k]);
192  $elements[$k]['subst'] = [
193  'type' => 'file',
194  'relFileName' => $srcRef,
195  'tokenID' => $tokenID,
196  'tokenValue' => $attribs[0]['src']
197  ];
198  // Finally, notice if the file does not exist.
199  if (!@is_file($absPath)) {
200  $elements[$k]['error'] = 'File does not exist!';
201  }
202  } else {
203  $elements[$k]['error'] = 'Could not substitute image source with token!';
204  }
205  }
206  }
207  }
208  }
209  // Return result:
210  if (!empty($elements)) {
211  $resultArray = [
212  'content' => implode('', $splitContent),
213  'elements' => $elements
214  ];
215  return $resultArray;
216  }
217  }
218 
228  public function ‪findRef_typolink($content, $spParams)
229  {
230  // First, split the input string by a comma if the "linkList" parameter is set.
231  // An example: the link field for images in content elements of type "textpic" or "image". This field CAN be configured to define a link per image, separated by comma.
232  if (is_array($spParams) && in_array('linkList', $spParams)) {
233  // Preserving whitespace on purpose.
234  $linkElement = explode(',', $content);
235  } else {
236  // If only one element, just set in this array to make it easy below.
237  $linkElement = [$content];
238  }
239  // Traverse the links now:
240  $elements = [];
241  foreach ($linkElement as $k => $typolinkValue) {
242  $tLP = $this->‪getTypoLinkParts($typolinkValue);
243  $linkElement[$k] = $this->‪setTypoLinkPartsElement($tLP, $elements, $typolinkValue, $k);
244  }
245  // Return output:
246  if (!empty($elements)) {
247  $resultArray = [
248  'content' => implode(',', $linkElement),
249  'elements' => $elements
250  ];
251  return $resultArray;
252  }
253  }
254 
263  public function ‪findRef_typolink_tag($content)
264  {
265  // Parse string for special TYPO3 <link> tag:
266  $htmlParser = GeneralUtility::makeInstance(HtmlParser::class);
267  $linkService = GeneralUtility::makeInstance(LinkService::class);
268  $linkTags = $htmlParser->splitTags('a', $content);
269  // Traverse result:
270  $elements = [];
271  foreach ($linkTags as $key => $foundValue) {
272  if ($key % 2) {
273  if (preg_match('/href="([^"]+)"/', $foundValue, $matches)) {
274  try {
275  $linkDetails = $linkService->resolve($matches[1]);
276  if ($linkDetails['type'] === ‪LinkService::TYPE_FILE && preg_match('/file\?uid=(\d+)/', $matches[1], $fileIdMatch)) {
277  $token = $this->‪makeTokenID($key);
278  $elements[$key]['matchString'] = $linkTags[$key];
279  $linkTags[$key] = str_replace($matches[1], '{softref:' . $token . '}', $linkTags[$key]);
280  $elements[$key]['subst'] = [
281  'type' => 'db',
282  'recordRef' => 'sys_file:' . $fileIdMatch[1],
283  'tokenID' => $token,
284  'tokenValue' => 'file:' . ($linkDetails['file'] instanceof ‪File ? $linkDetails['file']->‪getUid() : $fileIdMatch[1])
285  ];
286  } elseif ($linkDetails['type'] === ‪LinkService::TYPE_PAGE && preg_match('/page\?uid=(\d+)#?(\d+)?/', $matches[1], $pageAndAnchorMatches)) {
287  $token = $this->‪makeTokenID($key);
288  $content = '{softref:' . $token . '}';
289  $elements[$key]['matchString'] = $linkTags[$key];
290  $elements[$key]['subst'] = [
291  'type' => 'db',
292  'recordRef' => 'pages:' . $linkDetails['pageuid'],
293  'tokenID' => $token,
294  'tokenValue' => $linkDetails['pageuid']
295  ];
296  if (isset($pageAndAnchorMatches[2]) && $pageAndAnchorMatches[2] !== '') {
297  // Anchor is assumed to point to a content elements:
298  if (‪MathUtility::canBeInterpretedAsInteger($pageAndAnchorMatches[2])) {
299  // Initialize a new entry because we have a new relation:
300  $newTokenID = $this->‪makeTokenID('setTypoLinkPartsElement:anchor:' . $key);
301  $elements[$newTokenID . ':' . $key] = [];
302  $elements[$newTokenID . ':' . $key]['matchString'] = 'Anchor Content Element: ' . $pageAndAnchorMatches[2];
303  $content .= '#{softref:' . $newTokenID . '}';
304  $elements[$newTokenID . ':' . $key]['subst'] = [
305  'type' => 'db',
306  'recordRef' => 'tt_content:' . $pageAndAnchorMatches[2],
307  'tokenID' => $newTokenID,
308  'tokenValue' => $pageAndAnchorMatches[2]
309  ];
310  } else {
311  // Anchor is a hardcoded string
312  $content .= '#' . $pageAndAnchorMatches[2];
313  }
314  }
315  $linkTags[$key] = str_replace($matches[1], $content, $linkTags[$key]);
316  } elseif ($linkDetails['type'] === ‪LinkService::TYPE_URL) {
317  $token = $this->‪makeTokenID($key);
318  $elements[$key]['matchString'] = $linkTags[$key];
319  $linkTags[$key] = str_replace($matches[1], '{softref:' . $token . '}', $linkTags[$key]);
320  $elements[$key]['subst'] = [
321  'type' => 'external',
322  'tokenID' => $token,
323  'tokenValue' => $linkDetails['url']
324  ];
325  } elseif ($linkDetails['type'] === ‪LinkService::TYPE_EMAIL) {
326  $token = $this->‪makeTokenID($key);
327  $elements[$key]['matchString'] = $linkTags[$key];
328  $linkTags[$key] = str_replace($matches[1], '{softref:' . $token . '}', $linkTags[$key]);
329  $elements[$key]['subst'] = [
330  'type' => 'string',
331  'tokenID' => $token,
332  'tokenValue' => $linkDetails['email']
333  ];
334  }
335  } catch (\‪Exception $e) {
336  // skip invalid links
337  }
338  }
339  }
340  }
341  // Return output:
342  if (!empty($elements)) {
343  $resultArray = [
344  'content' => implode('', $linkTags),
345  'elements' => $elements
346  ];
347  return $resultArray;
348  }
349  }
350 
358  public function ‪findRef_email($content, $spParams)
359  {
360  // Email:
361  $parts = preg_split('/([^[:alnum:]]+)([A-Za-z0-9\\._-]+[@][A-Za-z0-9\\._-]+[\\.].[A-Za-z0-9]+)/', ' ' . $content . ' ', 10000, PREG_SPLIT_DELIM_CAPTURE);
362  foreach ($parts as $idx => $value) {
363  if ($idx % 3 == 2) {
364  $tokenID = $this->‪makeTokenID($idx);
365  $elements[$idx] = [];
366  $elements[$idx]['matchString'] = $value;
367  if (is_array($spParams) && in_array('subst', $spParams)) {
368  $parts[$idx] = '{softref:' . $tokenID . '}';
369  $elements[$idx]['subst'] = [
370  'type' => 'string',
371  'tokenID' => $tokenID,
372  'tokenValue' => $value
373  ];
374  }
375  }
376  }
377  // Return output:
378  if (!empty($elements)) {
379  $resultArray = [
380  'content' => substr(implode('', $parts), 1, -1),
381  'elements' => $elements
382  ];
383  return $resultArray;
384  }
385  }
386 
394  public function ‪findRef_url($content, $spParams)
395  {
396  // URLs
397  $parts = preg_split('/([^[:alnum:]"\']+)((https?|ftp):\\/\\/[^[:space:]"\'<>]*)([[:space:]])/', ' ' . $content . ' ', 10000, PREG_SPLIT_DELIM_CAPTURE);
398  foreach ($parts as $idx => $value) {
399  if ($idx % 5 == 3) {
400  unset($parts[$idx]);
401  }
402  if ($idx % 5 == 2) {
403  $tokenID = $this->‪makeTokenID($idx);
404  $elements[$idx] = [];
405  $elements[$idx]['matchString'] = $value;
406  if (is_array($spParams) && in_array('subst', $spParams)) {
407  $parts[$idx] = '{softref:' . $tokenID . '}';
408  $elements[$idx]['subst'] = [
409  'type' => 'string',
410  'tokenID' => $tokenID,
411  'tokenValue' => $value
412  ];
413  }
414  }
415  }
416  // Return output:
417  if (!empty($elements)) {
418  $resultArray = [
419  'content' => substr(implode('', $parts), 1, -1),
420  'elements' => $elements
421  ];
422  return $resultArray;
423  }
424  }
425 
432  public function ‪findRef_extension_fileref($content)
433  {
434  // Files starting with EXT:
435  $parts = preg_split('/([^[:alnum:]"\']+)(EXT:[[:alnum:]_]+\\/[^[:space:]"\',]*)/', ' ' . $content . ' ', 10000, PREG_SPLIT_DELIM_CAPTURE);
436  foreach ($parts as $idx => $value) {
437  if ($idx % 3 == 2) {
438  $this->‪makeTokenID($idx);
439  $elements[$idx] = [];
440  $elements[$idx]['matchString'] = $value;
441  }
442  }
443  // Return output:
444  if (!empty($elements)) {
445  $resultArray = [
446  'content' => substr(implode('', $parts), 1, -1),
447  'elements' => $elements
448  ];
449  return $resultArray;
450  }
451  }
452 
453  /*************************
454  *
455  * Helper functions
456  *
457  *************************/
458 
471  public function ‪getTypoLinkParts($typolinkValue)
472  {
473  $finalTagParts = GeneralUtility::makeInstance(TypoLinkCodecService::class)->decode($typolinkValue);
474 
475  $link_param = $finalTagParts['url'];
476  // we define various keys below, "url" might be misleading
477  unset($finalTagParts['url']);
478 
479  if (stripos(rawurldecode(trim($link_param)), 'phar://') === 0) {
480  throw new \RuntimeException(
481  'phar scheme not allowed as soft reference target',
482  1530030672
483  );
484  }
485 
486  $linkService = GeneralUtility::makeInstance(LinkService::class);
487  try {
488  $linkData = $linkService->resolve($link_param);
489  switch ($linkData['type']) {
491  $finalTagParts['table'] = $linkData['identifier'];
492  $finalTagParts['uid'] = $linkData['uid'];
493  break;
495  $linkData['pageuid'] = (int)$linkData['pageuid'];
496  if (isset($linkData['pagetype'])) {
497  $linkData['pagetype'] = (int)$linkData['pagetype'];
498  }
499  if (isset($linkData['fragment'])) {
500  $finalTagParts['anchor'] = $linkData['fragment'];
501  }
502  break;
505  if (isset($linkData['file'])) {
506  $finalTagParts['type'] = ‪LinkService::TYPE_FILE;
507  $linkData['file'] = $linkData['file'] instanceof ‪FileInterface ? $linkData['file']->getUid() : $linkData['file'];
508  } else {
509  $pU = parse_url($link_param);
510  parse_str($pU['query'] ?? '', $query);
511  if (isset($query['uid'])) {
512  $finalTagParts['type'] = ‪LinkService::TYPE_FILE;
513  $finalTagParts['file'] = (int)$query['uid'];
514  }
515  }
516  break;
517  }
518  return array_merge($finalTagParts, $linkData);
519  } catch (‪UnknownLinkHandlerException $e) {
520  // Cannot handle anything
521  return $finalTagParts;
522  }
523  return $finalTagParts;
524  }
525 
536  public function ‪setTypoLinkPartsElement($tLP, &$elements, $content, $idx)
537  {
538  // Initialize, set basic values. In any case a link will be shown
539  $tokenID = $this->‪makeTokenID('setTypoLinkPartsElement:' . $idx);
540  $elements[$tokenID . ':' . $idx] = [];
541  $elements[$tokenID . ':' . $idx]['matchString'] = $content;
542  // Based on link type, maybe do more:
543  switch ((string)$tLP['type']) {
545  // Mail addresses can be substituted manually:
546  $elements[$tokenID . ':' . $idx]['subst'] = [
547  'type' => 'string',
548  'tokenID' => $tokenID,
549  'tokenValue' => $tLP['email']
550  ];
551  // Output content will be the token instead:
552  $content = '{softref:' . $tokenID . '}';
553  break;
555  // URLs can be substituted manually
556  $elements[$tokenID . ':' . $idx]['subst'] = [
557  'type' => 'external',
558  'tokenID' => $tokenID,
559  'tokenValue' => $tLP['url']
560  ];
561  // Output content will be the token instead:
562  $content = '{softref:' . $tokenID . '}';
563  break;
565  // This is a link to a folder...
566  unset($elements[$tokenID . ':' . $idx]);
567  return $content;
569  // Process files referenced by their FAL uid
570  if (isset($tLP['file'])) {
571  $fileId = $tLP['file'] instanceof ‪FileInterface ? $tLP['file']->getUid() : $tLP['file'];
572  // Token and substitute value
573  $elements[$tokenID . ':' . $idx]['subst'] = [
574  'type' => 'db',
575  'recordRef' => 'sys_file:' . $fileId,
576  'tokenID' => $tokenID,
577  'tokenValue' => 'file:' . $fileId,
578  ];
579  // Output content will be the token instead:
580  $content = '{softref:' . $tokenID . '}';
581  } elseif ($tLP['identifier']) {
582  list($linkHandlerKeyword, $linkHandlerValue) = explode(':', trim($tLP['identifier']), 2);
583  if (‪MathUtility::canBeInterpretedAsInteger($linkHandlerValue)) {
584  // Token and substitute value
585  $elements[$tokenID . ':' . $idx]['subst'] = [
586  'type' => 'db',
587  'recordRef' => 'sys_file:' . $linkHandlerValue,
588  'tokenID' => $tokenID,
589  'tokenValue' => $tLP['identifier'],
590  ];
591  // Output content will be the token instead:
592  $content = '{softref:' . $tokenID . '}';
593  } else {
594  // This is a link to a folder...
595  return $content;
596  }
597  } else {
598  return $content;
599  }
600  break;
602  // Rebuild page reference typolink part:
603  $content = '';
604  // Set page id:
605  if ($tLP['pageuid']) {
606  $content .= '{softref:' . $tokenID . '}';
607  $elements[$tokenID . ':' . $idx]['subst'] = [
608  'type' => 'db',
609  'recordRef' => 'pages:' . $tLP['pageuid'],
610  'tokenID' => $tokenID,
611  'tokenValue' => !empty($tLP['pagealias']) ? $tLP['pagealias'] : $tLP['pageuid']
612  ];
613  }
614  // Add type if applicable
615  if ((string)($tLP['pagetype'] ?? '') !== '') {
616  $content .= ',' . $tLP['pagetype'];
617  }
618  // Add anchor if applicable
619  if ((string)($tLP['anchor'] ?? '') !== '') {
620  // Anchor is assumed to point to a content elements:
621  if (‪MathUtility::canBeInterpretedAsInteger($tLP['anchor'])) {
622  // Initialize a new entry because we have a new relation:
623  $newTokenID = $this->‪makeTokenID('setTypoLinkPartsElement:anchor:' . $idx);
624  $elements[$newTokenID . ':' . $idx] = [];
625  $elements[$newTokenID . ':' . $idx]['matchString'] = 'Anchor Content Element: ' . $tLP['anchor'];
626  $content .= '#{softref:' . $newTokenID . '}';
627  $elements[$newTokenID . ':' . $idx]['subst'] = [
628  'type' => 'db',
629  'recordRef' => 'tt_content:' . $tLP['anchor'],
630  'tokenID' => $newTokenID,
631  'tokenValue' => $tLP['anchor']
632  ];
633  } else {
634  // Anchor is a hardcoded string
635  $content .= '#' . $tLP['anchor'];
636  }
637  }
638  break;
640  $elements[$tokenID . ':' . $idx]['subst'] = [
641  'type' => 'db',
642  'recordRef' => $tLP['table'] . ':' . $tLP['uid'],
643  'tokenID' => $tokenID,
644  'tokenValue' => $content,
645  ];
646 
647  $content = '{softref:' . $tokenID . '}';
648  break;
649  default:
650  $linkHandlerFound = false;
651  list($linkHandlerFound, $tLP, $content, $newElements) = $this->‪emitSetTypoLinkPartsElement($linkHandlerFound, $tLP, $content, $elements, $idx, $tokenID);
652  // We need to merge the array, otherwise we would loose the reference.
653  ‪ArrayUtility::mergeRecursiveWithOverrule($elements, $newElements);
654 
655  if (!$linkHandlerFound) {
656  $elements[$tokenID . ':' . $idx]['error'] = 'Couldn\'t decide typolink mode.';
657  return $content;
658  }
659  }
660  // Finally, for all entries that was rebuild with tokens, add target, class, title and additionalParams in the end:
661  $tLP['url'] = $content;
662  $content = GeneralUtility::makeInstance(TypoLinkCodecService::class)->encode($tLP);
663 
664  // Return rebuilt typolink value:
665  return $content;
666  }
667 
674  public function ‪getPageIdFromAlias($link_param)
675  {
676  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
677  $queryBuilder->getRestrictions()
678  ->removeAll()
679  ->add(GeneralUtility::makeInstance(DeletedRestriction::class))
680  ->add(GeneralUtility::makeInstance(BackendWorkspaceRestriction::class));
681 
682  $pageUid = $queryBuilder->select('uid')
683  ->from('pages')
684  ->where(
685  $queryBuilder->expr()->eq('alias', $queryBuilder->createNamedParameter($link_param, \PDO::PARAM_STR))
686  )
687  ->setMaxResults(1)
688  ->execute()
689  ->fetchColumn(0);
690 
691  return (int)$pageUid;
692  }
693 
700  public function ‪makeTokenID($index = '')
701  {
702  return md5($this->tokenID_basePrefix . ':' . $index);
703  }
704 
708  protected function ‪getSignalSlotDispatcher()
709  {
710  return GeneralUtility::makeInstance(\‪TYPO3\CMS\‪Extbase\SignalSlot\Dispatcher::class);
711  }
712 
722  protected function ‪emitSetTypoLinkPartsElement($linkHandlerFound, $tLP, $content, $elements, $idx, $tokenID)
723  {
724  return $this->‪getSignalSlotDispatcher()->‪dispatch(static::class, 'setTypoLinkPartsElement', [$linkHandlerFound, $tLP, $content, $elements, $idx, $tokenID, $this]);
725  }
726 }
‪TYPO3\CMS\Core\Utility\PathUtility
Definition: PathUtility.php:23
‪TYPO3\CMS\Core\Utility\MathUtility\canBeInterpretedAsInteger
‪static bool canBeInterpretedAsInteger($var)
Definition: MathUtility.php:73
‪TYPO3\CMS\Core\Database\SoftReferenceIndex\getTypoLinkParts
‪array getTypoLinkParts($typolinkValue)
Definition: SoftReferenceIndex.php:470
‪TYPO3\CMS\Core\Database\SoftReferenceIndex\setTypoLinkPartsElement
‪string setTypoLinkPartsElement($tLP, &$elements, $content, $idx)
Definition: SoftReferenceIndex.php:535
‪TYPO3\CMS\Core\Core\Environment\getPublicPath
‪static string getPublicPath()
Definition: Environment.php:153
‪TYPO3\CMS\Extbase\Annotation
Definition: IgnoreValidation.php:4
‪TYPO3\CMS\Core\Resource\FileInterface
Definition: FileInterface.php:21
‪TYPO3\CMS\Core\Html\HtmlParser
Definition: HtmlParser.php:26
‪TYPO3\CMS\Core\Exception
Definition: Exception.php:21
‪TYPO3\CMS\Core\Database\SoftReferenceIndex\getSignalSlotDispatcher
‪TYPO3 CMS Extbase SignalSlot Dispatcher getSignalSlotDispatcher()
Definition: SoftReferenceIndex.php:707
‪TYPO3\CMS\Core\Database\SoftReferenceIndex\findRef_email
‪array findRef_email($content, $spParams)
Definition: SoftReferenceIndex.php:357
‪TYPO3\CMS\Core\Database\SoftReferenceIndex\findRef
‪array bool findRef($table, $field, $uid, $content, $spKey, $spParams, $structurePath='')
Definition: SoftReferenceIndex.php:97
‪TYPO3
‪TYPO3\CMS\Core\Database\Query\Restriction\BackendWorkspaceRestriction
Definition: BackendWorkspaceRestriction.php:28
‪TYPO3\CMS\Core\Database\SoftReferenceIndex\findRef_typolink
‪array findRef_typolink($content, $spParams)
Definition: SoftReferenceIndex.php:227
‪TYPO3\CMS\Core\Database\SoftReferenceIndex\getPageIdFromAlias
‪int getPageIdFromAlias($link_param)
Definition: SoftReferenceIndex.php:673
‪TYPO3\CMS\Core\Utility\ArrayUtility\mergeRecursiveWithOverrule
‪static mergeRecursiveWithOverrule(array &$original, array $overrule, $addKeys=true, $includeEmptyValues=true, $enableUnsetFeature=true)
Definition: ArrayUtility.php:614
‪TYPO3\CMS\Core\Utility\PathUtility\basename
‪static string basename($path)
Definition: PathUtility.php:164
‪TYPO3\CMS\Core\Database\SoftReferenceIndex\emitSetTypoLinkPartsElement
‪array emitSetTypoLinkPartsElement($linkHandlerFound, $tLP, $content, $elements, $idx, $tokenID)
Definition: SoftReferenceIndex.php:721
‪TYPO3\CMS\Core\Database\SoftReferenceIndex\makeTokenID
‪string makeTokenID($index='')
Definition: SoftReferenceIndex.php:699
‪TYPO3\CMS\Core\Resource\File
Definition: File.php:23
‪TYPO3\CMS\Core\Resource\AbstractFile\getUid
‪int getUid()
Definition: AbstractFile.php:200
‪TYPO3\CMS\Extbase\SignalSlot\Dispatcher\dispatch
‪mixed dispatch($signalClassName, $signalName, array $signalArguments=[])
Definition: Dispatcher.php:115
‪TYPO3\CMS\Core\Utility\ArrayUtility
Definition: ArrayUtility.php:23
‪TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction
Definition: DeletedRestriction.php:26
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:39
‪TYPO3\CMS\Core\Database\SoftReferenceIndex\findRef_url
‪array findRef_url($content, $spParams)
Definition: SoftReferenceIndex.php:393
‪TYPO3\CMS\Core\Utility\MathUtility
Definition: MathUtility.php:21
‪TYPO3\CMS\Core\Database\SoftReferenceIndex\$tokenID_basePrefix
‪string $tokenID_basePrefix
Definition: SoftReferenceIndex.php:83
‪TYPO3\CMS\Core\Database\SoftReferenceIndex\findRef_typolink_tag
‪array findRef_typolink_tag($content)
Definition: SoftReferenceIndex.php:262
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:45
‪TYPO3\CMS\Core\Database\SoftReferenceIndex\findRef_images
‪array findRef_images($content)
Definition: SoftReferenceIndex.php:163
‪TYPO3\CMS\Core\Database\SoftReferenceIndex\findRef_extension_fileref
‪array findRef_extension_fileref($content)
Definition: SoftReferenceIndex.php:431
‪TYPO3\CMS\Core\Database\SoftReferenceIndex
Definition: SoftReferenceIndex.php:80
‪TYPO3\CMS\Core\Database
Definition: Connection.php:3