Bug #23991 ยป 16310.patch
class.tx_coreupdates_migrateworkspaces.php (working copy) | ||
---|---|---|
*/
|
||
public function checkForUpdate(&$description) {
|
||
$result = FALSE;
|
||
$description = 'Migrates the old hardcoded draft workspace to be a real workspace element and update workspace owner fields to support either users or groups.';
|
||
$description = 'Migrates the old hardcoded draft workspace to be a real workspace element,
|
||
updates workspace owner fields to support either users or groups and
|
||
migrates the old-style workspaces with fixed workflow to a custom-stage workflow';
|
||
// TYPO3 version 4.5 and above
|
||
if ($this->versionNumber >= 4005000) {
|
||
$tables = array_keys($GLOBALS['TYPO3_DB']->admin_get_tables());
|
||
// sys_workspace table might not exists if version extension was never installed
|
||
if (in_array('sys_workspace', $tables)) {
|
||
$result = $this->isOldStyleAdminFieldUsed();
|
||
$wsCount = $GLOBALS['TYPO3_DB']->exec_SELECTcountRows('uid', 'sys_workspace', '');
|
||
$result = $wsCount > 0;
|
||
}
|
||
if (!$result) {
|
||
... | ... | |
// There's no TCA available yet
|
||
$this->includeTCA();
|
||
// install version extension (especially when updating from very old TYPO3 versions
|
||
$this->installExtensions(array('version'));
|
||
// install version and workspace extension (especially when updating from very old TYPO3 versions
|
||
$this->installExtensions(array('version', 'workspaces'));
|
||
// migrate all workspaces to support groups and be_users
|
||
if ($this->isOldStyleAdminFieldUsed()) {
|
||
... | ... | |
}
|
||
}
|
||
$workspaces = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('uid, reviewers', 'sys_workspace', '', '', '', '1');
|
||
$this->sqlQueries[] = $GLOBALS['TYPO3_DB']->debug_lastBuiltQuery;
|
||
$label = 'Review';
|
||
foreach($workspaces as $workspace) {
|
||
$where = 'parentid=' . $workspace['uid'] . ' AND parenttable="sys_workspace" AND deleted=0';
|
||
$stageCount = $GLOBALS['TYPO3_DB']->exec_SELECTcountRows('uid', 'sys_workspace_stage', $where);
|
||
$this->sqlQueries[] = $GLOBALS['TYPO3_DB']->debug_lastBuiltQuery;
|
||
if ($stageCount == 0) {
|
||
// Find all workspaces and add "review" stage record
|
||
// Add review users and groups to the new IRRE record
|
||
$reviewStageId = $this->createReviewStageForWorkspace($workspace['uid'], $label, $workspace['reviewers']);
|
||
// Update all "review" state records in the database to point to the new state
|
||
$this->migrateOldRecordsToStage($workspace['uid'], 1, $reviewStageId);
|
||
// Update all "ready to publish" records in the database to point to the new ready to publish state
|
||
$this->migrateOldRecordsToStage($workspace['uid'], 10, -99);
|
||
} else {
|
||
// this workspace has stages already at this point we might break something if we continue
|
||
}
|
||
}
|
||
if (is_array($this->sqlQueries) && is_array($databaseQueries)) {
|
||
$databaseQueries = array_merge($databaseQueries, $this->sqlQueries);
|
||
}
|
||
... | ... | |
}
|
||
/**
|
||
* Create a new stage for the given workspace
|
||
*
|
||
* @param integer Workspace ID
|
||
* @param string The label of the new stage
|
||
* @param string The users or groups which are authorized for that stage
|
||
* @return integer The id of the new stage
|
||
*/
|
||
protected function createReviewStageForWorkspace($workspaceId, $stageLabel, $stageMembers) {
|
||
$data = array(
|
||
'parentid' => $workspaceId,
|
||
'parenttable' => 'sys_workspace',
|
||
'title' => $stageLabel,
|
||
'responsible_persons' => $stageMembers
|
||
);
|
||
$GLOBALS['TYPO3_DB']->exec_INSERTquery('sys_workspace_stage', $data);
|
||
$this->sqlQueries[] = $GLOBALS['TYPO3_DB']->debug_lastBuiltQuery;
|
||
return $GLOBALS['TYPO3_DB']->sql_insert_id();
|
||
}
|
||
/**
|
||
* Updates the stages of placeholder records within the given workspace from $oldId to $newId
|
||
*
|
||
* @param integer Workspace ID
|
||
* @param integer Old stage od
|
||
* @param integer New stage od
|
||
* @return void
|
||
*/
|
||
protected function migrateOldRecordsToStage($workspaceId, $oldStageId, $newStageId) {
|
||
$tables = array_keys($GLOBALS['TCA']);
|
||
$where = 't3ver_wsid = ' . intval($workspaceId) . ' AND t3ver_stage = ' . intval($oldStageId) . ' AND pid = -1';
|
||
$values = array(
|
||
't3ver_stage' => intval($newStageId)
|
||
);
|
||
foreach($tables as $table) {
|
||
$versioningVer = t3lib_div::intInRange($GLOBALS['TCA'][$table]['ctrl']['versioningWS'], 0, 2, 0);
|
||
if ($versioningVer > 0) {
|
||
$GLOBALS['TYPO3_DB']->exec_UPDATEquery($table, $where, $values);
|
||
$this->sqlQueries[] = $GLOBALS['TYPO3_DB']->debug_lastBuiltQuery;
|
||
}
|
||
}
|
||
}
|
||
/**
|
||
* Check if there's any workspace which doesn't support the new admin-field format yet
|
||
* @return bool
|
||
*/
|