我想通了。
您可以通过在 $model_importers 中声明来将 CSV 批量加载程序添加到您的 ModelAdmin:
<?php
class PlayerAdmin extends ModelAdmin {
private static $managed_models = array(
'Player'
);
private static $model_importers = array(
'Player' => 'CsvBulkLoader',
);
private static $url_segment = 'players';
}
?>
如CSV Import 文档中所述,您可以扩展CsvBulkLoader 类。例如:
<?php
class PlayerCsvBulkLoader extends CsvBulkLoader {
public $columnMap = array(
'Number' => 'PlayerNumber',
...
);
public $duplicateChecks = array(
'Number' => 'PlayerNumber'
);
public $relationCallbacks = array(
'Team.Title' => array(
'relationname' => 'Team',
'callback' => 'getTeamByTitle'
)
);
public static function getTeamByTitle(&$obj, $val, $record) {
return FootballTeam::get()->filter('Title', $val)->First();
}
}
?>
在文档中没有明确说明的是,您只需将新的扩展批量加载程序添加到您的 ModelAdmin 中的$model_importers 即可。所以现在你将使用PlayerCsvBulkLoader,而不是使用CsvBulkLoader。 sn-p up top 将因此被修改:
<?php
class PlayerAdmin extends ModelAdmin {
private static $managed_models = array(
'Player'
);
private static $model_importers = array(
'Player' => 'PlayerCsvBulkLoader',
);
private static $url_segment = 'players';
}
?>
相当简单。我很早就尝试过这种方法,但是拼错了子类的名称!
更新:刚刚添加到SilverStripe's documentation