【问题标题】:Remove Add and Delete buttons from DataObject ModelAdmin从 DataObject ModelAdmin 中删除添加和删除按钮
【发布时间】:2018-02-28 14:47:41
【问题描述】:

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

使用:Silverstripe 3.6

【问题讨论】:

  • 您想全局删除它们,还是只从单个记录中删除?另外:什么版本的 SilverStripe?
  • 单条记录编辑和列表视图。银条 3.6

标签: silverstripe


【解决方案1】:

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 和 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');
}

这样,只有管理员可以创建/删除这些对象。所有用户都可以查看它们并由有权访问您的 ModelAdmin 部分的用户(此处称为“TranslationAdmin”)进行编辑。

【讨论】:

    【解决方案2】:

    好的,我自己搞定了。如果您想从托管模型的 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中管理一个模型。如果您安装了betterbuttons 之类的模块,它也不会阻止删除或创建新项目。
    猜你喜欢
    • 2018-01-27
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多