下面的代码是我使用SilverStripe 3.1汇总的自定义报告。
Title和ClassName值工作正常,但是尽管我可以获取每个页面的状态,但是我不确定如何针对DataList中的每个页面设置状态值。我怎样才能做到这一点?
完成后,应填充“状态”列。
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);
}
经过进一步调查,我重新创建了问题并找到了解决方案。
总体而言,我的解决方案涉及我在注释中建议的有关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
其添加回单个字符串中。这似乎有点多余,默认情况下getStatusFlag
会在数组中返回一个键。但是,如果您有一个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);
}
在if ($flags)
将计算为false
在没有当前的状态(亦称页面被出版)由于自动注入。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句