如何为报表中的记录设置自定义值?

时间:2015-05-05 23:47:40

标签: silverstripe

以下代码是我使用SilverStripe 3.1整理的自定义报告。

Title和ClassName值工作正常,但是虽然我可以获得每个页面的状态,但我不确定如何针对DataList中的每个页面设置Status值。我怎么能这样做?

完成后,应填充“状态”列。

class PageListByType extends SS_Report {

    function title() {
        return 'Page List by Type';
    }

    function description() {
        return 'List all the pages in the site, along with their page type';
    }

    public function sourceRecords($params = array(), $sort = null, $limit = null) {
        $pages = Page::get()->sort($sort);
        foreach ($pages as $pagenum=>$page) {
            $flags = $page->getStatusFlags();
            if ($flags) {
                foreach ($flags as $status) {
//                    if (isset($pages[$pagenum]->Status)) die(array($pages[$pagenum]->Status, $status)); #detect multiple statuses; not sure if this will happen
                    /////////////////////////
                    // The following line needs fixing:
                    /////////////////////////
                    $pages[$pagenum]->Status = "{$status['text']} ({$status['title']})";
                }
            }
        }
//        die($pages->debug());
        return $pages;
    }

    public function columns() {
        return array(
            'Title' => _t('PageListByTypeReport.PageName', 'Page name'),
            'ClassName' => _t('PageListByTypeReport.ClassName', 'Page type'),
            'Status' => _t('PageListByTypeReport.Status', 'Status')
        );
    }
}

编辑:感谢@Turnerj的回答!我的最终工作代码如下:

class PageListByType extends SS_Report {

    function title() {
        return 'Page List by Type';
    }

    function description() {
        return 'List all the pages in the site, along with their page type';
    }

    public function sourceRecords($params = array(), $sort = null, $limit = null) {
        $pages = DataObject::get("SiteTree", "", "");
        return $pages;
    }

    public function columns() {
        return array(
            'Title' => _t('PageListByTypeReport.PageName', 'Page name'),
            'ClassName' => _t('PageListByTypeReport.ClassName', 'Page type'),
            'Status' => _t('PageListByTypeReport.Status', 'Status')
        );
    }
}

并且在Page.php中:

public function getStatus() {
    $flags = $this->getStatusFlags();
    $result = array();
    if ($flags) {
        foreach ($flags as $status) {
            $result[] = "{$status['text']} ({$status['title']})";
        }
    } else {
        $result[] = 'Published';
    }
    return implode(', ', $result);
}

2 个答案:

答案 0 :(得分:2)

经过进一步调查,我重新创建了问题并找到了解决方案。

总的来说,我的解决方案涉及我在评论中建议通过添加Page函数将状态提取带到实际的getStatus

我基本上描述了以下内容:

public function getStatus()
{
    return $this->getStatusFlags();
}

技术上是正确的,它会获得状态标记,但您是对的,它不会在报告中显示它们。这是由于此函数返回一个报表无法理解的数组来呈现。

我的解决方案是更改此函数以返回一个字符串,所以通过几个简单的编辑将你写的内容与我写的内容相结合,我们得到以下内容:

public function getStatus()
{
    $flags = $this->getStatusFlags();
    $result = array();
    if ($flags)
    {
        foreach ($flags as $status)
        {
            $result[] = "{$status['text']} ({$status['title']})";
        }
    }
    return implode(', ', $result);
}

我在组合代码方面有一个独特的转折,我将每个状态添加到数组implode it back to a single string。这似乎有点过分,默认情况下getStatusFlag will return one key在数组中。但是,如果您的DataExtension具有updateStatusFlags方法,则可以为结果添加其他键。

基本上,如果将来你的代码与状态标志混淆,我会留下implode处理。

现在,您可以使用$casting上的Page属性执行类似操作,但鉴于您实际上只是为报表添加此功能,直接更新它更简洁。

我注意到,如果页面发布,状态标志数组实际上是空的,这意味着您的报告在发布的页面旁边没有任何内容。如果这是你的意图,太好了!

如果没有,你可以再做一点改动:

public function getStatus()
{
    $flags = $this->getStatusFlags();
    $result = array();
    if ($flags)
    {
        foreach ($flags as $status)
        {
            $result[] = "{$status['text']} ({$status['title']})";
        }
    }
    else
    {
        $result[] = 'Published (The page has been published)';
    }
    return implode(', ', $result);
}

当没有当前状态(也称为页面已发布)due to automatic casting时,if ($flags)将评估为false

答案 1 :(得分:0)

您是否尝试过使用column()中的匿名函数?

class PageListByType extends SS_Report {

  function title() {
      return 'Page List by Type';
  }

  function description() {
      return 'List all the pages in the site, along with their page type';
  }

  public function sourceRecords($params = array(), $sort = null, $limit = null) {
      return Page::get()->sort($sort);
  }

  public function columns() {
      return array(
          'Title' => _t('PageListByTypeReport.PageName', 'Page name'),
          'ClassName' => _t('PageListByTypeReport.ClassName', 'Page type'),
          'Status' => array(
             'title'=>_t('PageListByTypeReport.Status', 'Status'),
             'formatting' => function($value, $item) {
                $flags = $item->getStatusFlags();
                $status = '';
                if ($flags) {
                  foreach ($flags as $status) {
                    $status = "{$status['text']} ({$status['title']})";
                  }
                }
                return $status ? : _t('PageListByTypeReport.PagePublished', 'Page published');
             }
          )
      );
  }
}