以下代码是我使用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);
}
答案 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');
}
)
);
}
}