Добавление пользовательского 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