mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 12:05:37 +00:00
bfojcapell: Refactoring
(merged from branches/gsoc) git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@42147 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
39ae17224a
commit
1b2475d9b2
@ -371,7 +371,7 @@ class Translatable extends DataObjectDecorator {
|
|||||||
* Determine if the DataObject has any own translatable field (not inherited).
|
* Determine if the DataObject has any own translatable field (not inherited).
|
||||||
* @return boolean
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
function hasOwnFields() {
|
function hasOwnTranslatableFields() {
|
||||||
$ownFields = $this->owner->stat('db');
|
$ownFields = $this->owner->stat('db');
|
||||||
if ($ownFields == singleton($this->owner->parentClass())->stat('db'))return false;
|
if ($ownFields == singleton($this->owner->parentClass())->stat('db'))return false;
|
||||||
foreach ((array)$this->translatableFields as $translatableField) {
|
foreach ((array)$this->translatableFields as $translatableField) {
|
||||||
@ -380,12 +380,23 @@ class Translatable extends DataObjectDecorator {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if a table needs Versioned support
|
||||||
|
* This is called at db/build time
|
||||||
|
*
|
||||||
|
* @param string $table Table name
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function isVersionedTable($table) {
|
||||||
|
// Every _lang table wants Versioned support
|
||||||
|
return ($this->owner->databaseFields() && $this->hasOwnTranslatableFields());
|
||||||
|
}
|
||||||
function augmentDatabase() {
|
function augmentDatabase() {
|
||||||
if (! $this->stat('enabled')) return false;
|
if (! $this->stat('enabled')) return false;
|
||||||
Translatable::set_reading_lang(Translatable::default_lang());
|
Translatable::set_reading_lang(Translatable::default_lang());
|
||||||
$table = $this->owner->class;
|
$table = $this->owner->class;
|
||||||
|
|
||||||
if(($fields = $this->owner->databaseFields()) && $this->hasOwnFields()) {
|
if(($fields = $this->owner->databaseFields()) && $this->hasOwnTranslatableFields()) {
|
||||||
//Calculate the required fields
|
//Calculate the required fields
|
||||||
foreach ($fields as $field => $type) {
|
foreach ($fields as $field => $type) {
|
||||||
if (array_search($field,$this->translatableFields) === false) unset($fields[$field]);
|
if (array_search($field,$this->translatableFields) === false) unset($fields[$field]);
|
||||||
@ -432,13 +443,17 @@ class Translatable extends DataObjectDecorator {
|
|||||||
$SessionOrigID = Session::get($this->owner->ID.'_originalLangID');
|
$SessionOrigID = Session::get($this->owner->ID.'_originalLangID');
|
||||||
$manipulation["{$table}_lang"]['fields']['OriginalLangID'] = $this->owner->ID =
|
$manipulation["{$table}_lang"]['fields']['OriginalLangID'] = $this->owner->ID =
|
||||||
( $SessionOrigID ? $SessionOrigID : Translatable::$creatingFromID);
|
( $SessionOrigID ? $SessionOrigID : Translatable::$creatingFromID);
|
||||||
$manipulation["{$table}_lang"]['fields']['Lang'] = "'$lang'" ;
|
|
||||||
//$manipulation["{$table}_lang"]['id'] = $manipulation["{$table}_lang"]['fields']['ID'] = DB::getNextID("{$table}_lang");
|
|
||||||
$manipulation["{$table}_lang"]['RecordID'] = $manipulation["{$table}_lang"]['fields']['OriginalLangID'];
|
$manipulation["{$table}_lang"]['RecordID'] = $manipulation["{$table}_lang"]['fields']['OriginalLangID'];
|
||||||
|
// populate lang field
|
||||||
|
$manipulation["{$table}_lang"]['fields']['Lang'] = "'$lang'" ;
|
||||||
|
// get a valid id, pre-inserting
|
||||||
|
DB::query("INSERT INTO {$table}_lang SET Created = NOW(), Lang = '$lang'");
|
||||||
|
$manipulation["{$table}_lang"]['id'] = $manipulation["{$table}_lang"]['fields']['ID'] = DB::getGeneratedID("{$table}_lang");
|
||||||
|
$manipulation["{$table}_lang"]['command'] = 'update';
|
||||||
// we don't have to insert anything in $table if we are inserting in $table_lang
|
// we don't have to insert anything in $table if we are inserting in $table_lang
|
||||||
unset($manipulation[$table]);
|
unset($manipulation[$table]);
|
||||||
// now dataobjects create a record before the real write in the base table, so we have to delete it - 20/08/2007
|
// now dataobjects may create a record before the real write in the base table, so we have to delete it - 20/08/2007
|
||||||
DB::query("DELETE FROM $table WHERE ID=$fakeID");
|
if (is_numeric($fakeID)) DB::query("DELETE FROM $table WHERE ID=$fakeID");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!isset($manipulation[$table]['fields']['OriginalLangID'])) {
|
if (!isset($manipulation[$table]['fields']['OriginalLangID'])) {
|
||||||
@ -582,7 +597,7 @@ class Translatable extends DataObjectDecorator {
|
|||||||
*/
|
*/
|
||||||
function fieldsInExtraTables($table){
|
function fieldsInExtraTables($table){
|
||||||
|
|
||||||
if(($fields = $this->owner->databaseFields()) && $this->hasOwnFields()) {
|
if(($fields = $this->owner->databaseFields()) && $this->hasOwnTranslatableFields()) {
|
||||||
//Calculate the required fields
|
//Calculate the required fields
|
||||||
foreach ($fields as $field => $type) {
|
foreach ($fields as $field => $type) {
|
||||||
if (array_search($field,$this->translatableFields) === false) unset($fields[$field]);
|
if (array_search($field,$this->translatableFields) === false) unset($fields[$field]);
|
||||||
|
@ -145,18 +145,19 @@ class Versioned extends DataObjectDecorator {
|
|||||||
if ($suffix) $table = "{$classTable}_$suffix";
|
if ($suffix) $table = "{$classTable}_$suffix";
|
||||||
else $table = $classTable;
|
else $table = $classTable;
|
||||||
|
|
||||||
$tableList = DB::tableList();
|
if(($fields = $this->owner->databaseFields())) {
|
||||||
if(($fields = $this->owner->databaseFields()) && isset($tableList[strtolower($table)])) {
|
|
||||||
$indexes = $this->owner->databaseIndexes();
|
$indexes = $this->owner->databaseIndexes();
|
||||||
if($this->owner->parentClass() == "DataObject") {
|
if($this->owner->parentClass() == "DataObject") {
|
||||||
$rootTable = true;
|
$rootTable = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($suffix) {
|
if ($suffix && ($ext = $this->owner->getExtension($allSuffixes[$suffix]))) {
|
||||||
$fields = $this->owner->getExtension($allSuffixes[$suffix])->fieldsInExtraTables($suffix);
|
if (!$ext->isVersionedTable($table)) continue;
|
||||||
|
$fields = $ext->fieldsInExtraTables($suffix);
|
||||||
$indexes = $fields['indexes'];
|
$indexes = $fields['indexes'];
|
||||||
$fields = $fields['db'];
|
$fields = $fields['db'];
|
||||||
}
|
} else if (!$ext) continue;
|
||||||
|
|
||||||
|
|
||||||
// Create tables for other stages
|
// Create tables for other stages
|
||||||
foreach($this->stages as $stage) {
|
foreach($this->stages as $stage) {
|
||||||
@ -255,7 +256,7 @@ class Versioned extends DataObjectDecorator {
|
|||||||
// Add any extra, unchanged fields to the version record.
|
// Add any extra, unchanged fields to the version record.
|
||||||
$data = DB::query("SELECT * FROM $table WHERE ID = $id")->record();
|
$data = DB::query("SELECT * FROM $table WHERE ID = $id")->record();
|
||||||
if($data) foreach($data as $k => $v) {
|
if($data) foreach($data as $k => $v) {
|
||||||
$newManipulation['fields'][$k] = "'" . addslashes($v) . "'";
|
if (!isset($newManipulation['fields'][$k])) $newManipulation['fields'][$k] = "'" . addslashes($v) . "'";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up a new entry in (table)_versions
|
// Set up a new entry in (table)_versions
|
||||||
@ -281,8 +282,7 @@ class Versioned extends DataObjectDecorator {
|
|||||||
// Putting a Version of -1 is a signal to leave the version table alone, despite their being no version
|
// Putting a Version of -1 is a signal to leave the version table alone, despite their being no version
|
||||||
if($manipulation[$table]['fields']['Version'] < 0) unset($manipulation[$table]['fields']['Version']);
|
if($manipulation[$table]['fields']['Version'] < 0) unset($manipulation[$table]['fields']['Version']);
|
||||||
|
|
||||||
// TODO : better check (canbeversioned?)
|
if(!$this->hasVersionField($table)) unset($manipulation[$table]['fields']['Version']);
|
||||||
//if(get_parent_class($table) != "DataObject") unset($manipulation[$table]['fields']['Version']);
|
|
||||||
|
|
||||||
// Grab a version number - it should be the same across all tables.
|
// Grab a version number - it should be the same across all tables.
|
||||||
if(isset($manipulation[$table]['fields']['Version'])) $thisVersion = $manipulation[$table]['fields']['Version'];
|
if(isset($manipulation[$table]['fields']['Version'])) $thisVersion = $manipulation[$table]['fields']['Version'];
|
||||||
@ -299,6 +299,12 @@ class Versioned extends DataObjectDecorator {
|
|||||||
if(isset($thisVersion)) $this->owner->Version = str_replace("'","",$thisVersion);
|
if(isset($thisVersion)) $this->owner->Version = str_replace("'","",$thisVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if a table is supporting the Versioned extensions (e.g. $table_versions does exists)
|
||||||
|
*
|
||||||
|
* @param string $table Table name
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
function canBeVersioned($table) {
|
function canBeVersioned($table) {
|
||||||
|
|
||||||
$tableParts = explode('_',$table);
|
$tableParts = explode('_',$table);
|
||||||
@ -318,6 +324,17 @@ class Versioned extends DataObjectDecorator {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a certain table has the 'Version' field
|
||||||
|
*
|
||||||
|
* @param string $table Table name
|
||||||
|
* @return boolean Returns false if the field isn't in the table, true otherwise
|
||||||
|
*/
|
||||||
|
function hasVersionField($table) {
|
||||||
|
|
||||||
|
$tableParts = explode('_',$table);
|
||||||
|
return ('DataObject' == get_parent_class($tableParts[0]));
|
||||||
|
}
|
||||||
function extendWithSuffix($table) {
|
function extendWithSuffix($table) {
|
||||||
foreach (Versioned::$versionableExtensions as $versionableExtension => $suffixes) {
|
foreach (Versioned::$versionableExtensions as $versionableExtension => $suffixes) {
|
||||||
if ($this->owner->hasExtension($versionableExtension)) {
|
if ($this->owner->hasExtension($versionableExtension)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user