TYPO3  7.6
ElementEntityProcessor.php
Go to the documentation of this file.
1 <?php
2 namespace TYPO3\CMS\Version\Dependency;
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 
20 
25 {
29  protected $workspace;
30 
34  protected $dataHandler;
35 
41  public function setWorkspace($workspace)
42  {
43  $this->workspace = (int)$workspace;
44  }
45 
51  public function getWorkspace()
52  {
53  return $this->workspace;
54  }
55 
59  public function getDataHandler()
60  {
61  if (!isset($this->dataHandler)) {
62  $this->dataHandler = GeneralUtility::makeInstance(\TYPO3\CMS\Core\DataHandling\DataHandler::class);
63  }
64  return $this->dataHandler;
65  }
66 
73  public function transformDependentElementsToUseLiveId(array $elements)
74  {
75  $transformedElements = array();
77  foreach ($elements as $element) {
78  $elementName = ElementEntity::getIdentifier($element->getTable(), $element->getDataValue('liveId'));
79  $transformedElements[$elementName] = $element;
80  }
81  return $transformedElements;
82  }
83 
93  public function createNewDependentElementChildReferenceCallback(array $callerArguments, array $targetArgument, ElementEntity $caller, $eventName)
94  {
95  $fieldConfiguration = BackendUtility::getTcaFieldConfiguration($caller->getTable(), $callerArguments['field']);
96  if (!$fieldConfiguration || ($fieldConfiguration['type'] !== 'flex' && !GeneralUtility::inList('field,list', $this->getDataHandler()->getInlineFieldType($fieldConfiguration)))) {
98  }
99  return null;
100  }
101 
111  public function createNewDependentElementParentReferenceCallback(array $callerArguments, array $targetArgument, ElementEntity $caller, $eventName)
112  {
113  $fieldConfiguration = BackendUtility::getTcaFieldConfiguration($callerArguments['table'], $callerArguments['field']);
114  if (!$fieldConfiguration || ($fieldConfiguration['type'] !== 'flex' && !GeneralUtility::inList('field,list', $this->getDataHandler()->getInlineFieldType($fieldConfiguration)))) {
116  }
117  return null;
118  }
119 
130  public function createClearDependentElementChildReferenceCallback(array $callerArguments, array $targetArgument, ElementEntity $caller, $eventName)
131  {
132  $response = $this->createNewDependentElementChildReferenceCallback($callerArguments, $targetArgument, $caller, $eventName);
133  if (empty($response)) {
134  $record = BackendUtility::getRecord($callerArguments['table'], $callerArguments['id']);
135  if (!VersionState::cast($record['t3ver_state'])->equals(VersionState::DELETE_PLACEHOLDER)) {
137  }
138  }
139  return $response;
140  }
141 
152  public function createClearDependentElementParentReferenceCallback(array $callerArguments, array $targetArgument, ElementEntity $caller, $eventName)
153  {
154  $response = $this->createNewDependentElementParentReferenceCallback($callerArguments, $targetArgument, $caller, $eventName);
155  if (empty($response)) {
156  $record = BackendUtility::getRecord($callerArguments['table'], $callerArguments['id']);
157  if (!VersionState::cast($record['t3ver_state'])->equals(VersionState::DELETE_PLACEHOLDER)) {
159  }
160  }
161  return $response;
162  }
163 
174  public function createNewDependentElementCallback(array $callerArguments, array $targetArgument, ElementEntity $caller, $eventName)
175  {
177  $caller->setInvalid(true);
178  return;
179  }
180 
181  $versionRecord = $caller->getRecord();
182  // If version record does not exist, it probably has been deleted (cleared from workspace), this means,
183  // that the reference index still has an old reference pointer, which is "fine" for deleted parents
184  if (empty($versionRecord)) {
185  throw new \RuntimeException(
186  'Element "' . $caller::getIdentifier($caller->getTable(), $caller->getId()) . '" does not exist',
187  1393960943
188  );
189  }
190  // If version is on live workspace, but the pid is negative, mark the record as invalid.
191  // This happens if a change has been discarded (clearWSID) - it will be removed from the command map.
192  if ((int)$versionRecord['t3ver_wsid'] === 0 && (int)$versionRecord['pid'] === -1) {
193  $caller->setDataValue('liveId', $caller->getId());
194  $caller->setInvalid(true);
195  return;
196  }
197  if ($caller->hasDataValue('liveId') === false) {
198  // Set the original uid from the version record
199  if (!empty($versionRecord['t3ver_oid']) && (int)$versionRecord['pid'] === -1 && (int)$versionRecord['t3ver_wsid'] === $this->getWorkspace()) {
200  $caller->setDataValue('liveId', $versionRecord['t3ver_oid']);
201  // The current version record is actually a live record or an accordant placeholder for live
202  } elseif ((int)$versionRecord['t3ver_wsid'] === 0 || (int)$versionRecord['pid'] !== -1) {
203  $caller->setDataValue('liveId', $caller->getId());
205  $this->getWorkspace(),
206  $caller->getTable(),
207  $caller->getId(),
208  'uid,t3ver_state'
209  );
210  // Set version uid to caller, most likely it's a delete placeholder
211  // for a child record that is not recognized in the reference index
212  if (!empty($versionRecord['uid'])) {
213  $caller->setId($versionRecord['uid']);
214  // If no version could be determined, mark record as invalid
215  // (thus, it will be removed from the command map)
216  } else {
217  $caller->setInvalid(true);
218  }
219  // In case of an unexpected record state, mark the record as invalid
220  } else {
221  $caller->setInvalid(true);
222  }
223  }
224  }
225 }