从DataObject ModelAdmin中删除“添加”和“删除”按钮

问题描述 投票:0回答:2

我有自定义数据对象与预定义的条目。我不希望用户从GridField的编辑表单中删除或添加任何新条目。有没有办法从ModelAdmins GridField编辑表单中删除这两个按钮?

使用:Silverstripe 3.6

silverstripe
2个回答
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
投票

好吧,我得到了自己。如果要从托管模型的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;
    }
}

希望这有助于将来的某些人。

© www.soinside.com 2019 - 2024. All rights reserved.