在 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
在查看 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