在查看内置CSV导入的documentation之后,我仍然不清楚如何向ModelAdmin添加自定义CsvBulkUploader。我知道您可以如何轻松地add the default uploader以及如何create a custom controller for importing,但我不清楚如何将其添加到ModelAdmin中。我早上花了很多时间浏览Stack Overflow和SilverStripe社区论坛,但还没有找到任何东西。任何方向都将非常感谢!
答案 0 :(得分:2)
我明白了。
您可以通过$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
,即可引入新的扩展批量加载程序。现在,您将使用CsvBulkLoader
而不是PlayerCsvBulkLoader
。这样的片段将被修改:
<?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