查看了内置CSV导入的文档后,我仍然不清楚如何将自定义的CSVBulkuploader添加到ModelAdmin中。我看到如何轻松添加默认的上传器以及如何创建用于导入的自定义控制器,但是我不清楚如何将其添加到ModelAdmin中。我花了整个早晨查看堆栈溢出和SilverStripe社区论坛,但还没有找到任何东西。任何方向都将不胜感激!
我弄清楚了。
您可以通过在$model_importers
中声明CSV散装装载机将CSV散装装载机添加到您的模型。
<?php
class PlayerAdmin extends ModelAdmin {
private static $managed_models = array(
'Player'
);
private static $model_importers = array(
'Player' => 'CsvBulkLoader',
);
private static $url_segment = 'players';
}
?>
,并且如CSV导入文档所示,您可以扩展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的文档