mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
FIX: Instead of CsvBulkLoader->findExistingRecord out right failing (i.e. no duplicate found) when the duplicate check field is empty, it will now continue on to check other duplicateCheck fields.
Added extra testing data to CSVBulkLoaderTest so that it fails.
This commit is contained in:
parent
d07fb4355d
commit
c4eac5310e
@ -101,7 +101,7 @@ abstract class BulkLoader extends ViewableData {
|
|||||||
*
|
*
|
||||||
* {@see Member::$unique_identifier_field}.
|
* {@see Member::$unique_identifier_field}.
|
||||||
*
|
*
|
||||||
* If multiple checks are specified, the first one "wins".
|
* If multiple checks are specified, the first non-empty field "wins".
|
||||||
*
|
*
|
||||||
* <code>
|
* <code>
|
||||||
* <?php
|
* <?php
|
||||||
|
@ -162,15 +162,12 @@ class CsvBulkLoader extends BulkLoader {
|
|||||||
*/
|
*/
|
||||||
public function findExistingObject($record) {
|
public function findExistingObject($record) {
|
||||||
$SNG_objectClass = singleton($this->objectClass);
|
$SNG_objectClass = singleton($this->objectClass);
|
||||||
|
|
||||||
// checking for existing records (only if not already found)
|
// checking for existing records (only if not already found)
|
||||||
foreach($this->duplicateChecks as $fieldName => $duplicateCheck) {
|
foreach($this->duplicateChecks as $fieldName => $duplicateCheck) {
|
||||||
if(is_string($duplicateCheck)) {
|
if(is_string($duplicateCheck)) {
|
||||||
$SQL_fieldName = Convert::raw2sql($duplicateCheck);
|
$SQL_fieldName = Convert::raw2sql($duplicateCheck);
|
||||||
if(!isset($record[$fieldName])) {
|
if(!isset($record[$fieldName]) || empty($record[$fieldName])) { //skip current duplicate check if field value is empty
|
||||||
return false;
|
continue;
|
||||||
//user_error("CsvBulkLoader:processRecord: Couldn't find duplicate identifier '{$fieldName}'
|
|
||||||
//in columns", E_USER_ERROR);
|
|
||||||
}
|
}
|
||||||
$SQL_fieldValue = Convert::raw2sql($record[$fieldName]);
|
$SQL_fieldValue = Convert::raw2sql($record[$fieldName]);
|
||||||
$existingRecord = DataObject::get_one($this->objectClass, "\"$SQL_fieldName\" = '{$SQL_fieldValue}'");
|
$existingRecord = DataObject::get_one($this->objectClass, "\"$SQL_fieldName\" = '{$SQL_fieldValue}'");
|
||||||
@ -184,17 +181,16 @@ class CsvBulkLoader extends BulkLoader {
|
|||||||
user_error("CsvBulkLoader::processRecord():"
|
user_error("CsvBulkLoader::processRecord():"
|
||||||
. " {$duplicateCheck['callback']} not found on importer or object class.", E_USER_ERROR);
|
. " {$duplicateCheck['callback']} not found on importer or object class.", E_USER_ERROR);
|
||||||
}
|
}
|
||||||
|
if($existingRecord) {
|
||||||
if($existingRecord) return $existingRecord;
|
return $existingRecord;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
user_error('CsvBulkLoader::processRecord(): Wrong format for $duplicateChecks', E_USER_ERROR);
|
user_error('CsvBulkLoader::processRecord(): Wrong format for $duplicateChecks', E_USER_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine wether any loaded files should be parsed
|
* Determine wether any loaded files should be parsed
|
||||||
* with a header-row (otherwise we rely on {@link self::$columnMap}.
|
* with a header-row (otherwise we rely on {@link self::$columnMap}.
|
||||||
|
@ -151,7 +151,10 @@ class CsvBulkLoaderTest extends SapphireTest {
|
|||||||
$loader = new CsvBulkLoader('CsvBulkLoaderTest_Player');
|
$loader = new CsvBulkLoader('CsvBulkLoaderTest_Player');
|
||||||
$filepath = $this->getCurrentAbsolutePath() . '/CsvBulkLoaderTest_PlayersWithId.csv';
|
$filepath = $this->getCurrentAbsolutePath() . '/CsvBulkLoaderTest_PlayersWithId.csv';
|
||||||
$loader->duplicateChecks = array(
|
$loader->duplicateChecks = array(
|
||||||
'ExternalIdentifier' => 'ExternalIdentifier'
|
'ExternalIdentifier' => 'ExternalIdentifier',
|
||||||
|
'NonExistantIdentifier' => 'ExternalIdentifier',
|
||||||
|
'ExternalIdentifier' => 'ExternalIdentifier',
|
||||||
|
'AdditionalIdentifier' => 'ExternalIdentifier'
|
||||||
);
|
);
|
||||||
$results = $loader->load($filepath);
|
$results = $loader->load($filepath);
|
||||||
$createdPlayers = $results->Created();
|
$createdPlayers = $results->Created();
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
"ExternalIdentifier","FirstName","Biography","Birthday"
|
"ExternalIdentifier","FirstName","Biography","Birthday"," AdditionalIdentifier "
|
||||||
222b,"John","","31/01/1988"
|
222b,"John","","31/01/1988",""
|
||||||
222b,"John","He's a good guy",""
|
222b,"John","He's a good guy","",""
|
||||||
9000a,"Jamie","Pretty old\, with an escaped comma","31/01/1882"
|
9000a,"Jamie","Pretty old\, with an escaped comma","31/01/1882",""
|
||||||
|
,"Fiona","A wise woman","","sql'unsafeid"
|
Can't render this file because it contains an unexpected character in line 1 and column 81.
|
Loading…
Reference in New Issue
Block a user