我有自定义条目的自定义数据对象。我不希望用户从GridField的编辑表单中删除或添加任何新条目。有没有办法从ModelAdmins GridField编辑表单中删除这两个按钮?
使用:Silverstripe 3.6
答案 0 :(得分:2)
要从GridField
“全局”删除操作,例如。对于GridField管理的所有记录,最好修改GridFieldConfig
实例。
在ModelAdmin上下文中,可以通过覆盖getEditForm
:
public function getEditForm($id = null, $fields = null)
{
$form = parent::getEditForm($id, $fields);
// make sure to check if the modelClass matches the object you want to edit
// otherwise, the config will get applied to all models managed
// by this ModelAdmin instance
if ($this->modelClass === Translation::class) {
$fieldName = $this->sanitiseClassName($this->modelClass);
/** @var GridField $grid */
if ($grid = $form->Fields()->dataFieldByName($fieldName)) {
$grid->getConfig()->removeComponentsByType([
GridFieldDeleteAction::class,
GridFieldAddNewButton::class
]);
}
}
return $form;
}
但是,用户可能仍然可以删除详细信息视图中的记录。但由于GridField和详细视图都尊重DataObject权限,因此您应该使用它们...这也可以防止用户通过其他方式删除对象。
一个简单的解决方案是(这些方法应该在你的DataObject中实现):
public function canDelete($member = null)
{
return Permission::check('ADMIN');
}
public function canCreate($member = null)
{
return Permission::check('ADMIN');
}
public function canView($member = null)
{
return true;
}
public function canEdit($member = null)
{
return Permission::check('CMS_ACCESS_TranslationAdmin');
}
这样,只有管理员才能创建/删除这些对象。所有用户都可以查看它们,并且可以访问您的ModelAdmin部分(此处命名为“TranslationAdmin”)的用户进行编辑。
答案 1 :(得分:1)
好的,我得到了自己。如果要从托管模型的ModelAdmin中删除“添加”和“删除”按钮,则需要添加此代码
class Translation extends DataObject {
// ...
public function canDelete($member = null) {
return false;
}
}
class TranslationAdmin extends ModelAdmin {
public static $managed_models = ['Translation'];
static $url_segment = 'translations';
static $menu_title = 'Translations';
public function getEditForm($id = null, $fields = null) {
$form = parent::getEditForm($id, $fields);
$form
->Fields()
->fieldByName($this->sanitiseClassName($this->modelClass))
->getConfig()
->removeComponentsByType('GridFieldDeleteAction')
->removeComponentsByType('GridFieldAddNewButton');
return $form;
}
}
希望这有助于将来。