/**
  * Hook for updates in Typo3 backend
  * @param array $incomingFieldArray
  * @param string $table
  * @param integer $id
  * @param \TYPO3\CMS\Core\DataHandling\DataHandler $tcemain
  */
 public function processDatamap_preProcessFieldArray(&$incomingFieldArray, $table, $id, \TYPO3\CMS\Core\DataHandling\DataHandler &$tcemain)
 {
     if (FALSE === $this->needsOverWriteProtection($table)) {
         return;
     }
     // check, if overwrite-protection-fields are set:
     // If they are NOT set, it means, that any other extension maybe called the process_datamap!
     if (false === array_key_exists(self::OVERWRITE_PROTECTION_TILL, $incomingFieldArray) || false === array_key_exists(self::OVERWRITE_PROTECTION_MODE, $incomingFieldArray)) {
         return;
     }
     if (FALSE === $this->hasOverWriteProtection($incomingFieldArray)) {
         $this->removeOverwriteprotection($id, $table);
     } else {
         $protection = strtotime($incomingFieldArray[self::OVERWRITE_PROTECTION_TILL]);
         $mode = $incomingFieldArray[self::OVERWRITE_PROTECTION_MODE];
         $result = $this->getOverwriteprotectionRepository()->findByProtectedUidAndTableName($id, $table);
         if ($result->count() === 0) {
             /* @var $overwriteprotection Tx_AoeDbsequenzer_Domain_Model_Overwriteprotection */
             $overwriteprotection = $this->objectManager->get('Tx_AoeDbsequenzer_Domain_Model_Overwriteprotection');
             $overwriteprotection->setProtectedMode($mode);
             $overwriteprotection->setPid($tcemain->getPID($table, $id));
             $overwriteprotection->setProtectedTablename($table);
             $overwriteprotection->setProtectedUid($id);
             $overwriteprotection->setProtectedTime($protection);
             $this->getOverwriteprotectionRepository()->add($overwriteprotection);
         } else {
             foreach ($result as $overwriteprotection) {
                 /* @var $overwriteprotection Tx_AoeDbsequenzer_Domain_Model_Overwriteprotection */
                 $overwriteprotection->setProtectedMode($mode);
                 $overwriteprotection->setProtectedTime($protection);
                 $this->getOverwriteprotectionRepository()->update($overwriteprotection);
             }
         }
         $this->persistAll();
     }
     unset($incomingFieldArray[self::OVERWRITE_PROTECTION_TILL]);
     unset($incomingFieldArray[self::OVERWRITE_PROTECTION_MODE]);
 }
Пример #2
0
 /**
  * Hooks into TCE Main and watches all record creations and updates. If it
  * detects that the new/updated record belongs to a table configured for
  * indexing through Solr, we add the record to the index queue.
  *
  * @param string $status Status of the current operation, 'new' or 'update'
  * @param string $table The table the record belongs to
  * @param mixed $uid The record's uid, [integer] or [string] (like 'NEW...')
  * @param array $fields The record's data
  * @param DataHandler $tceMain TYPO3 Core Engine parent object
  * @return void
  */
 public function processDatamap_afterDatabaseOperations($status, $table, $uid, array $fields, DataHandler $tceMain)
 {
     $recordTable = $table;
     $recordUid = $uid;
     $recordPageId = 0;
     if ($status == 'new') {
         $recordUid = $tceMain->substNEWwithIDs[$recordUid];
     }
     if (Util::isDraftRecord($table, $recordUid)) {
         // skip workspaces: index only LIVE workspace
         return;
     }
     if ($status == 'update' && !isset($fields['pid'])) {
         $recordPageId = $tceMain->getPID($recordTable, $recordUid);
         if ($recordTable == 'pages' && Util::isRootPage($recordUid)) {
             $recordPageId = $uid;
         }
     } else {
         $recordPageId = $fields['pid'];
     }
     // when a content element changes we need to updated the page instead
     if ($recordTable == 'tt_content') {
         $recordTable = 'pages';
         $recordUid = $recordPageId;
     }
     $this->solrConfiguration = Util::getSolrConfigurationFromPageId($recordPageId);
     $monitoredTables = $this->getMonitoredTables($recordPageId);
     if (in_array($recordTable, $monitoredTables, true)) {
         $record = $this->getRecord($recordTable, $recordUid);
         if (!empty($record)) {
             // only update/insert the item if we actually found a record
             if (Util::isLocalizedRecord($recordTable, $record)) {
                 // if it's a localization overlay, update the original record instead
                 $recordUid = $record[$GLOBALS['TCA'][$recordTable]['ctrl']['transOrigPointerField']];
                 if ($recordTable == 'pages_language_overlay') {
                     $recordTable = 'pages';
                 }
                 $tableEnableFields = implode(', ', $GLOBALS['TCA'][$recordTable]['ctrl']['enablecolumns']);
                 $l10nParentRecord = BackendUtility::getRecord($recordTable, $recordUid, $tableEnableFields, '', false);
                 if (!$this->isEnabledRecord($recordTable, $l10nParentRecord)) {
                     // the l10n parent record must be visible to have it's translation indexed
                     return;
                 }
             }
             // Clear existing index queue items to prevent mount point duplicates.
             if ($recordTable == 'pages') {
                 $this->indexQueue->deleteItem('pages', $recordUid);
             }
             if ($this->isEnabledRecord($recordTable, $record)) {
                 $configurationName = null;
                 if ($recordTable !== 'pages') {
                     $configurationName = $this->getIndexingConfigurationName($recordTable, $recordUid);
                 }
                 $this->indexQueue->updateItem($recordTable, $recordUid, $configurationName);
             }
             if ($recordTable == 'pages') {
                 $this->updateCanonicalPages($recordUid);
                 $this->updateMountPages($recordUid);
                 if ($this->isRecursiveUpdateRequired($recordUid, $fields)) {
                     $treePageIds = $this->getSubPageIds($recordUid);
                     foreach ($treePageIds as $treePageId) {
                         $this->indexQueue->updateItem('pages', $treePageId);
                     }
                 }
             }
         } else {
             // TODO move this part to the garbage collector
             // check if the item should be removed from the index because it no longer matches the conditions
             if ($this->indexQueue->containsItem($recordTable, $recordUid)) {
                 $this->removeFromIndexAndQueue($recordTable, $recordUid);
             }
         }
     }
 }
Пример #3
0
 /**
  * Hook for updates in Typo3 backend
  * @param array $incomingFieldArray
  * @param string $table
  * @param integer $id
  * @param \TYPO3\CMS\Core\DataHandling\DataHandler $tceMain
  * @codingStandardsIgnoreStart
  */
 public function processDatamap_preProcessFieldArray(&$incomingFieldArray, $table, $id, \TYPO3\CMS\Core\DataHandling\DataHandler &$tceMain)
 {
     // @codingStandardsIgnoreEnd
     if (array_key_exists(self::FIELD_BEHAVIOR, $incomingFieldArray) && array_key_exists(self::FIELD_FLAG, $incomingFieldArray)) {
         $pid = $tceMain->getPID($table, $id);
         $this->updateMapping($table, $id, $incomingFieldArray[self::FIELD_FLAG], $pid, $incomingFieldArray[self::FIELD_BEHAVIOR]);
         unset($incomingFieldArray[self::FIELD_BEHAVIOR]);
         unset($incomingFieldArray[self::FIELD_FLAG]);
     }
 }