在 Silverstripe 中将自定义 CsvBulkUploader 添加到 ModelAdmin

Adding Custom CsvBulkUploader to ModelAdmin in Silverstripe

在查看 documentation for the built-in CSV importing, it's still not clear to me how to add a custom CsvBulkUploader to ModelAdmin. I see how you can easily add the default uploader and how you can create a custom controller for importing 之后,但我不清楚如何将其添加到 ModelAdmin。我整个早上都在浏览 Stack Overflow 和 SilverStripe 社区论坛,但还没有找到任何东西。任何方向将不胜感激!

我想通了。

您可以通过在 $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 class。例如:

<?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。上面的代码片段将被这样修改:

<?php
class PlayerAdmin extends ModelAdmin {
   private static $managed_models = array(
      'Player'
   );
   private static $model_importers = array(
      'Player' => 'PlayerCsvBulkLoader',
   );
   private static $url_segment = 'players';
}
?>

相当简单。我很早就尝试过这种方法,但拼错了 subclass!

的名称

更新: 刚刚将此添加到 SilverStripe's documentation