/** * @return Dependency\DependencyResolver */ public function getDependencyResolver() { if (!isset($this->dependencyResolver)) { $this->dependencyResolver = GeneralUtility::makeInstance('TYPO3\\CMS\\Version\\Dependency\\DependencyResolver'); $this->dependencyResolver->setOuterMostParentsRequireReferences(TRUE); $this->dependencyResolver->setWorkspace($this->getWorkspace()); $this->dependencyResolver->setEventCallback(Dependency\ElementEntity::EVENT_CreateChildReference, $this->getDependencyCallback('createNewDependentElementChildReferenceCallback')); $this->dependencyResolver->setEventCallback(Dependency\ElementEntity::EVENT_CreateParentReference, $this->getDependencyCallback('createNewDependentElementParentReferenceCallback')); } return $this->dependencyResolver; }
/** * Gets all parent references. * * @return array|ReferenceEntity[] */ public function getParents() { if (!isset($this->parents)) { $this->parents = []; $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_refindex'); $result = $queryBuilder->select('*')->from('sys_refindex')->where($queryBuilder->expr()->eq('deleted', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)), $queryBuilder->expr()->eq('ref_table', $queryBuilder->createNamedParameter($this->table, \PDO::PARAM_STR)), $queryBuilder->expr()->eq('ref_uid', $queryBuilder->createNamedParameter($this->id, \PDO::PARAM_INT)), $queryBuilder->expr()->eq('workspace', $queryBuilder->createNamedParameter($this->dependency->getWorkspace(), \PDO::PARAM_INT)))->orderBy('sorting')->execute(); while ($row = $result->fetch()) { $arguments = ['table' => $row['tablename'], 'id' => $row['recuid'], 'field' => $row['field'], 'scope' => self::REFERENCES_ParentOf]; $callbackResponse = $this->dependency->executeEventCallback(self::EVENT_CreateParentReference, $this, $arguments); if ($callbackResponse !== self::RESPONSE_Skip) { $this->parents[] = $this->getDependency()->getFactory()->getReferencedElement($row['tablename'], $row['recuid'], $row['field'], [], $this->getDependency()); } } } return $this->parents; }
/** * Gets all parent references. * * @return array|ReferenceEntity[] */ public function getParents() { if (!isset($this->parents)) { $this->parents = array(); $where = 'ref_table=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($this->table, 'sys_refindex') . ' AND deleted=0 AND ref_uid=' . $this->id . ' AND workspace=' . $this->dependency->getWorkspace(); $rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('*', 'sys_refindex', $where, '', 'sorting'); if (is_array($rows)) { foreach ($rows as $row) { $arguments = array('table' => $row['tablename'], 'id' => $row['recuid'], 'field' => $row['field'], 'scope' => self::REFERENCES_ParentOf); $callbackResponse = $this->dependency->executeEventCallback(self::EVENT_CreateParentReference, $this, $arguments); if ($callbackResponse !== self::RESPONSE_Skip) { $this->parents[] = $this->getDependency()->getFactory()->getReferencedElement($row['tablename'], $row['recuid'], $row['field'], array(), $this->getDependency()); } } } } return $this->parents; }
/** * Applies the workspaces dependencies and removes incomplete structures or automatically * completes them, depending on the options.workspaces.considerReferences setting * * @param \TYPO3\CMS\Version\Dependency\DependencyResolver $dependency * @param string $scope * @return void */ protected function applyWorkspacesDependencies(\TYPO3\CMS\Version\Dependency\DependencyResolver $dependency, $scope) { $transformDependentElementsToUseLiveId = $this->getScopeData($scope, self::KEY_TransformDependentElementsToUseLiveId); $elementsToBeVersioned = $dependency->getElements(); // Use the uid of the live record instead of the workspace record: if ($transformDependentElementsToUseLiveId) { $elementsToBeVersioned = $this->getElementEntityProcessor()->transformDependentElementsToUseLiveId($elementsToBeVersioned); } $outerMostParents = $dependency->getOuterMostParents(); /** @var $outerMostParent ElementEntity */ foreach ($outerMostParents as $outerMostParent) { $dependentElements = $dependency->getNestedElements($outerMostParent); if ($transformDependentElementsToUseLiveId) { $dependentElements = $this->getElementEntityProcessor()->transformDependentElementsToUseLiveId($dependentElements); } // Gets the difference (intersection) between elements that were submitted by the user // and the evaluation of all dependent records that should be used for this action instead: $intersectingElements = array_intersect_key($dependentElements, $elementsToBeVersioned); if (!empty($intersectingElements)) { // If at least one element intersects but not all, throw away all elements of the depdendent structure: if (count($intersectingElements) !== count($dependentElements) && $this->workspacesConsiderReferences === false) { $this->purgeWithErrorMessage($intersectingElements, $scope); } else { $this->update(current($intersectingElements), $dependentElements, $scope); } } } }