菜单的 SilverStripe 枚举值

SilverStripe enum values to menu

我正在尝试从数据对象中提取枚举值以充当 menu/filter。我无法找到有关如何执行此操作的任何文档,而且我的尝试都失败了。

例如我有:

class Specification extends DataObject {
    private static $db = array (
        'Standard' => 'Enum("BS 1400,AS 1565")'
    );
}

我正在尝试做类似的事情:

public function Standards() {
    $stnds = Specification::get()->dbObject('Standard')->enumValues();
    $list = ArrayList::create();

    foreach ($stnds as $stnd) {
        $list->push($stnd);
    }
    return $list;
}

我希望能够循环模板中的结果值,但无法访问标签 - 如果我这样做:

<% loop Standards %>
    $Pos
<% end_loop %>

这给了我 1 2,这表明它正在工作,但无法访问模板中的枚举值标签。

如何正确 return 这些值以便它们可以在模板中循环?

当您将项目推入 ArrayList 对象时,它们只是存储在 php 数组中。 SS 模板解析器不处理 php 数组,因此解决您的问题的一种方法是在推送之前将您的项目包装在 ArrayData 中,如下所示:

public function Standards(){
  $stnds = Specification::get()->dbObject('Standard')->enumValues();
  $list = ArrayList::create();

  foreach ($stnds as $stnd) {
      $list->push(new ArrayData(array('Standard' => $stnd)));
  }
  return $list;
}   

然后,在您的模板中:

<% loop Standards %>
  <h1>$Pos $Standard</h1>
<% end_loop %>