SilverStripe 中的 CSV 导入重复项和 RelationCallbacks
CSV Import in SilverStripe Duplicates and RelationCallbacks
我需要理解下面的代码,特别是 $duplicateChecks
和 $relationCallbacks
是如何工作的,但官方文档中几乎没有解释。有人可以解释这些是如何工作的或建议我可以查看的其他文档吗?
class PlayerCsvBulkLoader extends CsvBulkLoader {
public $columnMap = array(
'Number' => 'PlayerNumber',
'Name' => '->importFirstAndLastName',
'Birthday' => 'Birthday',
'Team' => 'Team.Title',
);
public $duplicateChecks = array(
'Number' => 'PlayerNumber'
);
public $relationCallbacks = array(
'Team.Title' => array(
'relationname' => 'Team',
'callback' => 'getTeamByTitle'
)
);
public static function importFirstAndLastName(&$obj, $val, $record) {
$parts = explode(' ', $val);
if(count($parts) != 2) return false;
$obj->FirstName = $parts[0];
$obj->LastName = $parts[1];
}
public static function getTeamByTitle(&$obj, $val, $record) {
return FootballTeam::get()->filter('Title', $val)->First();
}
}
$duplicateChecks
被 findExistingObject
function in the CsvBulkLoader
class 使用。它被迭代以查找具有指定值的列的任何对象。在该示例中,它检查 "PlayerNumber" 列。
它也可以像这样传递一个回调:
public $duplicateCheck = array(
'Number' => array(
'callback' => 'checkPlayerNumberFunction'
)
);
指定的回调需要存在于 属性 objectClass
上指定的 class 的实例上或 CsvBulkLoader
本身(如果您扩展它)。这些回调用于执行更复杂的重复查找和 return 找到现有对象(如果有)。
另一方面,$relationCallbacks
被主 processRecord
函数使用。回调的工作方式与 $duplicateCheck
回调相同,它需要存在于属性 objectClass
或 CsvBulkLoader
上指定的 class 的实例上。这些回调可以 return 一个对象,该对象将作为 has_one
.
关联回特定对象记录(新的或现有的)
虽然最好的学习方法是通过一些实验和跳过 class 本身的代码,但它还有更多的东西。我已经在我的回答中链接到各种功能等。
我需要理解下面的代码,特别是 $duplicateChecks
和 $relationCallbacks
是如何工作的,但官方文档中几乎没有解释。有人可以解释这些是如何工作的或建议我可以查看的其他文档吗?
class PlayerCsvBulkLoader extends CsvBulkLoader {
public $columnMap = array(
'Number' => 'PlayerNumber',
'Name' => '->importFirstAndLastName',
'Birthday' => 'Birthday',
'Team' => 'Team.Title',
);
public $duplicateChecks = array(
'Number' => 'PlayerNumber'
);
public $relationCallbacks = array(
'Team.Title' => array(
'relationname' => 'Team',
'callback' => 'getTeamByTitle'
)
);
public static function importFirstAndLastName(&$obj, $val, $record) {
$parts = explode(' ', $val);
if(count($parts) != 2) return false;
$obj->FirstName = $parts[0];
$obj->LastName = $parts[1];
}
public static function getTeamByTitle(&$obj, $val, $record) {
return FootballTeam::get()->filter('Title', $val)->First();
}
}
$duplicateChecks
被 findExistingObject
function in the CsvBulkLoader
class 使用。它被迭代以查找具有指定值的列的任何对象。在该示例中,它检查 "PlayerNumber" 列。
它也可以像这样传递一个回调:
public $duplicateCheck = array(
'Number' => array(
'callback' => 'checkPlayerNumberFunction'
)
);
指定的回调需要存在于 属性 objectClass
上指定的 class 的实例上或 CsvBulkLoader
本身(如果您扩展它)。这些回调用于执行更复杂的重复查找和 return 找到现有对象(如果有)。
$relationCallbacks
被主 processRecord
函数使用。回调的工作方式与 $duplicateCheck
回调相同,它需要存在于属性 objectClass
或 CsvBulkLoader
上指定的 class 的实例上。这些回调可以 return 一个对象,该对象将作为 has_one
.
虽然最好的学习方法是通过一些实验和跳过 class 本身的代码,但它还有更多的东西。我已经在我的回答中链接到各种功能等。