SilverStripe Gridfield如何删除按钮

1 php silverstripe

我一直在浏览gridfield类文档; http://doc.silverstripe.org/framework/en/reference/grid-field

这是有问题的代码.虽然它确实显示了一个网格字段,但它在每列上添加了一个按钮.如何编辑此代码以不显示按钮?按钮是指向不存在的页面的链接.链接到渲染页面; http://www.silverstripe.org/assets/Uploads/Capture28.JPG

public function AllPages() {
$gridField = new GridField('pages', 'All pages', SiteTree::get()); 
$dataColumns = $gridField->getConfig()->getComponentByType('GridFieldDataColumns');
$dataColumns->setDisplayFields(array(
    'Title' => 'Title',
    'URLSegment'=> 'URL',
    'LastEdited' => 'Changed'
));
return new Form($this, "AllPages", new FieldList($gridField), new FieldList());
}
Run Code Online (Sandbox Code Playgroud)

Zau*_*sch 7

原因:

SilverStripe GridField构建得非常好.
Basic GridField几乎没有任何功能.它只是一个包含所需数据的普通表.
所有其他功能都由所谓的"组件"添加,这些组件由GridFieldConfig管理.

当您像创建GridField一样创建GridField而不指定配置时,它将为您创建一个配置(GridFieldConfig_Base).

该类GridFieldConfig_Base只是常规GridFieldConfig,已添加了一些组件.
已经为您添加的其中一个组件称为GridFieldSortableHeader允许您按字段对表进行排序(这是产生您看到的按钮的那些组件).
按钮的链接已经死亡的原因可能是因为存在一些路由问题(GridField尚未在FrontEnd中经过良好测试)或者您可能忘记将操作添加AllPages$allowed_actions.


解决方案:

  1. 普通表
    如果你真的不需要GridField的任何功能,而你只想要一个普通表,最简单的方法就是设置一个空配置:

    public function AllPages() {
        $config = GridFieldConfig::create(); 
        $dataColumns = GridFieldDataColumns::create();
        $dataColumns->setDisplayFields(array(
            'Title' => 'Title',
            'URLSegment'=> 'URL',
            'LastEdited' => 'Changed'
        ));
        $config->addComponent($dataColumns);
        $gridField = GridField::create('pages', 'All pages', SiteTree::get(), $config); 
        return Form::create($this, __FUNCTION__, FieldList::create($gridField), FieldList::create());
     }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 只删除可排序标题

    $gridField->getConfig()->removeComponentsByType('GridFieldSortableHeader');
    // if you don't have a SortableHeader, you probably also don't want a filter
    $gridField->getConfig()->removeComponentsByType('GridFieldFilterHeader');
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将Sortable Header替换为仅文本标题行

    不幸的是,目前SilverStripe中没有正常的标题,但Andrew Short的伟大gridfieldextensions模块为您带来了一个.在GitHubPackagist上获取模块

    $gridField->getConfig()->removeComponentsByType('GridFieldSortableHeader');
    // if you don't have a SortableHeader, you probably also don't want a filter
    $gridField->getConfig()->removeComponentsByType('GridFieldFilterHeader');
    $gridField->getConfig()->addComponent(new GridFieldTitleHeader());
    
    Run Code Online (Sandbox Code Playgroud)

  4. 如果您希望具有排序功能,则修复可排序标头,您将必须修复路由.
    自从我上次在前端使用GridField以来已经有一段时间了.我只能告诉你它在某个时候确实有效.

    1. 也许路由不起作用,因为你的表单action(AllPages)不能作为URL访问,如果是这样的话,它很容易修复:只需添加AllPages到你$allowed_actions的Controller中.
    2. 如果表单是可访问的,那么它可能是GridField中的一个错误,我需要调试它再告诉你.如果是这种情况,请通过评论回复或在IRC上与我联系,我会看一下.

更新:我刚刚回答了另一个前端GridField问题,并且深入了解了一下.也许这对你也有帮助:https://stackoverflow.com/a/22433159/1119263(见选项2)