/**
  * Hook for updating translation index when records are edited (hooks into TCEmain)
  *
  * @param   [type]    $status: ...
  * @param   [type]    $table: ...
  * @param   [type]    $id: ...
  * @param   [type]    $fieldArray: ...
  * @param   [type]    $pObj: ...
  * @return  [type]    ...
  */
 function processDatamap_afterDatabaseOperations($status, $table, $id, $fieldArray, &$pObj)
 {
     global $TCA;
     // Check if
     #		debug(array($status, $table, $id));
     // Map id for new records:
     if ($status == "new") {
         $id = $pObj->substNEWwithIDs[$id];
         #			echo "New fixed<br>";
     }
     // Find live record if any:
     if (!($liveRecord = t3lib_BEfunc::getLiveVersionOfRecord($table, $id))) {
         // If it was a version we find live...
         $liveRecord = t3lib_BEfunc::getRecord($table, $id);
         // Otherwise we load live record.
         #			echo "Live version<br>";
     }
     if (is_array($liveRecord)) {
         // Now, see if this record is a translation of another one:
         $t8ToolsObj = t3lib_div::makeInstance('t3lib_transl8tools');
         if ($t8ToolsObj->isTranslationInOwnTable($table) && $liveRecord[$TCA[$table]['ctrl']['transOrigPointerField']]) {
             // So it had a translation pointer - lets look for the root record then:
             $liveRecord = t3lib_BEfunc::getRecord($table, $liveRecord[$TCA[$table]['ctrl']['transOrigPointerField']], 'uid');
             #				echo "Finding root version<br>";
         } elseif ($TCA[$table]['ctrl']['transOrigPointerTable'] && $liveRecord[$TCA[$table]['ctrl']['transOrigPointerField']]) {
             $fld = $TCA[$table]['ctrl']['transOrigPointerField'];
             $table = $TCA[$table]['ctrl']['transOrigPointerTable'];
             // Changeing table value here on purpose!
             $liveRecord = t3lib_BEfunc::getRecord($table, $liveRecord[$fld], 'uid');
         }
         $languageID = tx_l10nmgr_l10nBaseService::getTargetLanguageID();
         if (is_array($liveRecord)) {
             #				echo "indexing id ".$liveRecord['uid'];
             // Finally, we have found the "root record" and will check it:
             $t8Tools = t3lib_div::makeInstance('tx_l10nmgr_tools');
             $t8Tools->verbose = FALSE;
             // Otherwise it will show records which has fields but none editable.
             #				debug($t8Tools->indexDetailsRecord($table,$liveRecord['uid']));
             $t8Tools->updateIndexTableFromDetailsArray($t8Tools->indexDetailsRecord($table, $liveRecord['uid'], $languageID));
         }
     }
 }
 /**
  * Get the final pid based on $table and $pid ($destPid type... pos/neg)
  *
  * @param	string		Table name
  * @param	integer		"Destination pid" : If the value is >= 0 it's just returned directly (through intval() though) but if the value is <0 then the method looks up the record with the uid equal to abs($pid) (positive number) and returns the PID of that record! The idea is that negative numbers point to the record AFTER WHICH the position is supposed to be!
  * @return	integer
  */
 function resolvePid($table, $pid)
 {
     global $TCA;
     $pid = intval($pid);
     if ($pid < 0) {
         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('pid', $table, 'uid=' . abs($pid));
         $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
         // Look, if the record UID happens to be an offline record. If so, find its live version. Offline uids will be used when a page is versionized as "branch" so this is when we must correct - otherwise a pid of "-1" and a wrong sort-row number is returned which we don't want.
         if ($lookForLiveVersion = t3lib_BEfunc::getLiveVersionOfRecord($table, abs($pid), 'pid')) {
             $row = $lookForLiveVersion;
         }
         $pid = intval($row['pid']);
     } elseif ($this->BE_USER->workspace !== 0 && $TCA[$table]['ctrl']['versioning_followPages']) {
         // PID points to page, the workspace is an offline space and the table follows page during versioning: This means we must check if the PID page has a version in the workspace with swapmode set to 0 (zero = page+content) and if so, change the pid to the uid of that version.
         if ($WSdestPage = t3lib_BEfunc::getWorkspaceVersionOfRecord($this->BE_USER->workspace, 'pages', $pid, 'uid,t3ver_swapmode')) {
             // Looks for workspace version of page.
             if ($WSdestPage['t3ver_swapmode'] == 0) {
                 // if swapmode is zero, then change pid value.
                 $pid = $WSdestPage['uid'];
             }
         }
     }
     return $pid;
 }
 /**
  * Release version from this workspace (and into "Live" workspace but as an offline version).
  *
  * @param string $table Table name
  * @param integer $id Record UID
  * @param boolean $flush If set, will completely delete element
  * @param t3lib_TCEmain $tcemainObj TCEmain object
  * @return	void
  */
 protected function version_clearWSID($table, $id, $flush = FALSE, t3lib_TCEmain $tcemainObj)
 {
     global $TCA;
     if ($errorCode = $tcemainObj->BE_USER->workspaceCannotEditOfflineVersion($table, $id)) {
         $tcemainObj->newlog('Attempt to reset workspace for record failed: ' . $errorCode, 1);
     } elseif ($tcemainObj->checkRecordUpdateAccess($table, $id)) {
         if ($liveRec = t3lib_BEfunc::getLiveVersionOfRecord($table, $id, 'uid,t3ver_state')) {
             // Clear workspace ID:
             $updateData = array('t3ver_wsid' => 0);
             $GLOBALS['TYPO3_DB']->exec_UPDATEquery($table, 'uid=' . intval($id), $updateData);
             // Clear workspace ID for live version AND DELETE IT as well because it is a new record!
             if ((int) $liveRec['t3ver_state'] == 1 || (int) $liveRec['t3ver_state'] == 2) {
                 $GLOBALS['TYPO3_DB']->exec_UPDATEquery($table, 'uid=' . intval($liveRec['uid']), $updateData);
                 // THIS assumes that the record was placeholder ONLY for ONE record (namely $id)
                 $tcemainObj->deleteEl($table, $liveRec['uid'], TRUE);
             }
             // If "deleted" flag is set for the version that got released
             // it doesn't make sense to keep that "placeholder" anymore and we delete it completly.
             $wsRec = t3lib_BEfunc::getRecord($table, $id);
             if ($flush || ((int) $wsRec['t3ver_state'] == 1 || (int) $wsRec['t3ver_state'] == 2)) {
                 $tcemainObj->deleteEl($table, $id, TRUE, TRUE);
             }
             // Remove the move-placeholder if found for live record.
             if ((int) $TCA[$table]['ctrl']['versioningWS'] >= 2) {
                 if ($plhRec = t3lib_BEfunc::getMovePlaceholder($table, $liveRec['uid'], 'uid')) {
                     $tcemainObj->deleteEl($table, $plhRec['uid'], TRUE, TRUE);
                 }
             }
         }
     } else {
         $tcemainObj->newlog('Attempt to reset workspace for record failed because you do not have edit access', 1);
     }
 }
 /**
  * Generates a view link for a page.
  *
  * @static
  * @param  $table
  * @param  $uid
  * @param  $record
  * @return string
  */
 public static function viewSingleRecord($table, $uid, $record = null)
 {
     $viewUrl = '';
     if ($table == 'pages') {
         $viewUrl = t3lib_BEfunc::viewOnClick(t3lib_BEfunc::getLiveVersionIdOfRecord('pages', $uid));
     } elseif ($table == 'pages_language_oderlay' || $table == 'tt_content') {
         $elementRecord = is_array($record) ? $record : t3lib_BEfunc::getLiveVersionOfRecord($table, $uid);
         $viewUrl = t3lib_BEfunc::viewOnClick($elementRecord['pid']);
     } else {
         if (isset($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['workspaces']['viewSingleRecord'])) {
             $_params = array('table' => $table, 'uid' => $uid, 'record' => $record);
             $_funcRef = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['workspaces']['viewSingleRecord'];
             $viewUrl = t3lib_div::callUserFunction($_funcRef, $_params, null);
         }
     }
     return $viewUrl;
 }
 /**
  * Initialization of the class.
  *
  * @return	void
  */
 function init()
 {
     // Init GPvars:
     $this->P = t3lib_div::_GP('P');
     $this->returnEditConf = t3lib_div::_GP('returnEditConf');
     // Get this record
     $origRow = t3lib_BEfunc::getRecord($this->P['table'], $this->P['uid']);
     // Set table:
     $this->table = $this->P['params']['table'];
     // Get TSconfig for it.
     $TSconfig = t3lib_BEfunc::getTCEFORM_TSconfig($this->P['table'], is_array($origRow) ? $origRow : array('pid' => $this->P['pid']));
     // Set [params][pid]
     if (substr($this->P['params']['pid'], 0, 3) == '###' && substr($this->P['params']['pid'], -3) == '###') {
         $this->pid = intval($TSconfig['_' . substr($this->P['params']['pid'], 3, -3)]);
     } else {
         $this->pid = intval($this->P['params']['pid']);
     }
     // Return if new record as parent (not possibly/allowed)
     if (!strcmp($this->pid, '')) {
         t3lib_utility_Http::redirect(t3lib_div::sanitizeLocalUrl($this->P['returnUrl']));
     }
     // Else proceed:
     if ($this->returnEditConf) {
         // If a new id has returned from a newly created record...
         $eC = unserialize($this->returnEditConf);
         if (is_array($eC[$this->table]) && t3lib_div::testInt($this->P['uid'])) {
             // Getting id and cmd from returning editConf array.
             reset($eC[$this->table]);
             $this->id = intval(key($eC[$this->table]));
             $cmd = current($eC[$this->table]);
             // ... and if everything seems OK we will register some classes for inclusion and instruct the object to perform processing later.
             if ($this->P['params']['setValue'] && $cmd == 'edit' && $this->id && $this->P['table'] && $this->P['field'] && $this->P['uid']) {
                 if ($LiveRec = t3lib_BEfunc::getLiveVersionOfRecord($this->table, $this->id, 'uid')) {
                     $this->id = $LiveRec['uid'];
                 }
                 $this->include_once[] = PATH_t3lib . 'class.t3lib_loaddbgroup.php';
                 $this->include_once[] = PATH_t3lib . 'class.t3lib_transferdata.php';
                 $this->include_once[] = PATH_t3lib . 'class.t3lib_tcemain.php';
                 $this->processDataFlag = 1;
             }
         }
     }
 }
 /**
  * Executes action for selected elements, if any is sent:
  */
 function execute()
 {
     $post = t3lib_div::_POST();
     #		debug($post);
     if ($post['_with_selected_do']) {
         if (is_array($post['items']) && count($post['items'])) {
             $cmdArray = array();
             foreach ($post['items'] as $item => $v) {
                 list($table, $uid) = explode(':', $item, 2);
                 if ($GLOBALS['TCA'][$table] && t3lib_div::testInt($uid)) {
                     switch ($post['_with_selected_do']) {
                         case "stage_-1":
                             $cmdArray[$table][$uid]['version']['action'] = 'setStage';
                             $cmdArray[$table][$uid]['version']['stageId'] = -1;
                             break;
                         case "stage_0":
                             $cmdArray[$table][$uid]['version']['action'] = 'setStage';
                             $cmdArray[$table][$uid]['version']['stageId'] = 0;
                             break;
                         case "stage_1":
                             $cmdArray[$table][$uid]['version']['action'] = 'setStage';
                             $cmdArray[$table][$uid]['version']['stageId'] = 1;
                             break;
                         case "stage_10":
                             $cmdArray[$table][$uid]['version']['action'] = 'setStage';
                             $cmdArray[$table][$uid]['version']['stageId'] = 10;
                             break;
                         case "publish":
                             if ($onlineRec = t3lib_BEfunc::getLiveVersionOfRecord($table, $uid, 'uid')) {
                                 $cmdArray[$table][$onlineRec['uid']]['version']['action'] = 'swap';
                                 $cmdArray[$table][$onlineRec['uid']]['version']['swapWith'] = $uid;
                             }
                             break;
                         case "swap":
                             if ($onlineRec = t3lib_BEfunc::getLiveVersionOfRecord($table, $uid, 'uid')) {
                                 $cmdArray[$table][$onlineRec['uid']]['version']['action'] = 'swap';
                                 $cmdArray[$table][$onlineRec['uid']]['version']['swapWith'] = $uid;
                                 $cmdArray[$table][$onlineRec['uid']]['version']['swapIntoWS'] = 1;
                             }
                             break;
                         case "release":
                             $cmdArray[$table][$uid]['version']['action'] = 'clearWSID';
                             break;
                         case "flush":
                             $cmdArray[$table][$uid]['version']['action'] = 'flush';
                             break;
                     }
                 }
             }
             #		debug($cmdArray);
             $tce = t3lib_div::makeInstance('t3lib_TCEmain');
             $tce->stripslashes_values = 0;
             $tce->start(array(), $cmdArray);
             $tce->process_cmdmap();
         }
     }
 }