在Silverstripe中向ModelAdmin添加自定义CsvBulkUploader

时间:2017-05-30 20:55:11

标签: php silverstripe

在查看内置CSV导入的documentation之后,我仍然不清楚如何向ModelAdmin添加自定义CsvBulkUploader。我知道您可以如何轻松地add the default uploader以及如何create a custom controller for importing,但我不清楚如何将其添加到ModelAdmin中。我早上花了很多时间浏览Stack Overflow和SilverStripe社区论坛,但还没有找到任何东西。任何方向都将非常感谢!

1 个答案:

答案 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