SilverStripe 3.4自定义报告 - 将文件名设置为自定义报告中的链接,以便于编辑

时间:2017-10-19 15:53:35

标签: reporting silverstripe

我是SilverStripe报道的新手,但到目前为止我还没能找到与此特定问题相关的任何内容。

我有一个自定义报告,在网格视图中列出网站上的所有图像和文件,但是,我想这样做,以便人们可以点击文件名并转到图像或文件进行编辑,或者为每个图像和文件都有一个编辑按钮。现在,如果有人想编辑文件或图像,他们必须离开报告,转到文件选项卡,搜索所述文件/图像,然后单击编辑。这很乏味。

我知道有一种方法可以根据cms / code / reports中的现有报告示例在报告中点击页面标题。但我没有看到任何与链接到上传的图像和文件有关的内容。

有没有办法做到这一点?

以下是我的自定义报告的代码:

<?php

class CustomSideReport_ListofImagesAndFiles extends SS_Report {

    // the name of the report
    public function title() {
        return 'All Images and Files';
    }

    // what we want the report to return
    public function sourceRecords($params = null)
    {
        return File::get()
            ->sort('Title');
    }

    // which fields on that object we want to show
    public function columns() {
        return array(
            "Title" => 'Image Title',
            'Filename' => array(
                "Filename" => "Filename",
                "link" => true,
            ),
        );
    }

}

使用"link" => true无效 - 它会尝试创建一个页面链接,这是不对的。我试过&#34;编辑&#34;和&#34; CanEdit。&#34;

1 个答案:

答案 0 :(得分:1)

好的,我从参考Broken Links报告的设置中得出了这个:

// which fields on that object we want to show
public function columns()
{
    $linkBase = singleton('CMSFileAddController')->Link('EditForm/field/File/item');
    $linkBaseEditLink = str_replace("/add","",$linkBase);
    $fields = array(
        'Title' => 'Title',
        'AbsoluteLink' => array(
            'title' => _t('CustomSideReport_ListofImagesAndFiles.ColumnFilename', 'Filename'),
            'formatting' => function($value, $item) use ($linkBaseEditLink) {
                return sprintf('<a href="%s">%s</a>',
                    Controller::join_links($linkBaseEditLink, $item->ID."/edit"),
                    strstr($value, '/assets/', false)
                );
            }
        )
    );

   return $fields;
}

我不知道这是否是有史以来最好的解决方案 - 它有效,我无法找到与SilverStripe的这种报告创建相关的任何其他内容(我发现的一切)处理获取报告的Pages,而非图片或文件。

我不得不做一些调整,因为没有CMSFileEditController就像有一个CMSPageEditController,但是我用我所拥有的东西做了。

如果有人有更好的解决方案,那么请分享!