Добавление пользовательского CsvBulkUploader в ModelAdmin в Silverstripe

После просмотра документации по встроенному импорту CSV мне все еще не ясно, как добавить пользовательский CsvBulkUploader в ModelAdmin. Я вижу, как вы можете легко добавить загрузчик по умолчанию и как вы можете создать собственный контроллер для импорта, но мне не ясно, как вы добавите это в ModelAdmin. Я провел утро, просматривая Stack Overflow и форумы сообщества SilverStripe, но пока не смог ничего найти. Любое направление будет с благодарностью!

1 ответ

Решение

Я понял.

Вы можете добавить загрузчик CSV в ModelAdmin, объявив его в $model_importers:

<?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();
   }
}
?>

В документации не было указано, что вы добавили новый расширенный Bulk Loader, просто добавив его в $model_importers в вашем ModelAdmin. Так что теперь вместо использования 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

Другие вопросы по тегам