从 DataObject ModelAdmin 中删除添加和删除按钮
Remove Add and Delete buttons from DataObject ModelAdmin
我有带有预定义条目的自定义数据对象。我不希望用户从 GridField 的编辑表单中删除或添加任何新条目。有没有办法从 ModelAdmins GridField 编辑表单中删除这两个按钮?
使用:Silverstripe 3.6
好的,我自己搞定了。如果您想从托管模型的 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;
}
}
希望这对以后的人有所帮助。
从 GridField
"globally" 中删除操作,例如。对于 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;
}
但是,用户可能仍然可以删除 detail-view 中的记录。但是由于 GridField 和 detail-view 都尊重 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');
}
这样,只有管理员才能 create/delete 这些对象。所有用户都可以查看它们,有权访问您的 ModelAdmin 部分(此处命名为 "TranslationAdmin")的用户可以编辑它们。
我有带有预定义条目的自定义数据对象。我不希望用户从 GridField 的编辑表单中删除或添加任何新条目。有没有办法从 ModelAdmins GridField 编辑表单中删除这两个按钮?
使用:Silverstripe 3.6
好的,我自己搞定了。如果您想从托管模型的 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;
}
}
希望这对以后的人有所帮助。
从 GridField
"globally" 中删除操作,例如。对于 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;
}
但是,用户可能仍然可以删除 detail-view 中的记录。但是由于 GridField 和 detail-view 都尊重 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');
}
这样,只有管理员才能 create/delete 这些对象。所有用户都可以查看它们,有权访问您的 ModelAdmin 部分(此处命名为 "TranslationAdmin")的用户可以编辑它们。