Silverstripe 3.1 ss 模板中字段的 title/name 是否可用?

Silverstripe 3.1 Is the title/name of a field available in an ss template?

例如

static $db = array('CarName' => 'Text')
public static $summary_fields = array('CarName' => 'Car Name')

在 ss 模板中,这将显示名为 CarName 的字段的值

<p>$CarName</p>

我还可以显示我在 $summary_field 中包含的标题吗? 'Car Name' 而不是在 ss 模板中手动输入?

据我所知,没有直接访问单个摘要字段的方法。你可以写一个简单的扩展来为你做这件事。大致如下:

<?php
class SummaryExtension extends DataExtension
{
    public function SummaryField($fieldName){
        $fields = $this->owner->summaryFields();
        if(isset($fields[$fieldName])){
            return $fields[$fieldName];
        }
        return $fieldName;
    }
}

然后通过 _config.yml 或直接作为静态变量将扩展添加到您的 DataObject:

private static $extensions = array('SummaryExtension');

在模板中,你可以输出标题:

$SummaryField('CarName')

我不知道这是否可行,但有 getName() function on DBField 所以我会尝试 $CarName.Name

写了这个有效的函数,把它放在你使用的页面的 Page_Controller -

public function getSummaryFlds() {
    $getSummFlds = $this->owner->summaryFields();
    $newArr = array();
    foreach ($getSummFlds as $dbfield => $title) {
        $value = $this->$dbfield;
        $newArr[] = ArrayData::create(array('Title' => $title, 'Value' => $value));
    }
    var_dump($getSummFlds);
    $newArray = ArrayList::create(
                $newArr
            );
    $result = $newArray;
    return $result;
}

然后在ss模板中

<% loop $SummaryFlds %>
    <dt>$Title</dt><dd>$Value</dd>
<% end_loop %>

结果是带有标题和值的所有 $summary_fields。