Silverstripe-循环来自many_many关系的所有项目

时间:2019-04-25 20:55:22

标签: php silverstripe silverstripe-4

我正在尝试输出一组图标(来自一组GuidePages),我一直想在其中显示5个图标,但是需要能够选择将哪些图标应用于该特定页面。

enter image description here

在我要显示它们的页面中:

private static $many_many = array(
        'GuidePages' => GuidePage::class
    );

$source = GuidePages::get()->map('ID', 'Name');
$fields->addFieldToTab('Root.Main',CheckboxSetField::create('GuidePages','Select guide which apply', $source));

这很好,我可以选择图标,但是显然它只会输出我选择的实际图标(即3个而不是全部5个)。

我试图找到一种始终显示5的方法,但是能够选择一些适用的方法并将其全部循环到模板中(将活动的类添加到所选的类中)。

如果有另一种更简单的方法,也不一定需要在两个页面集之间建立多次关系或任何关系……即只需将值放入DataList或其他内容中……

1 个答案:

答案 0 :(得分:2)

最终与:

public function getCMSFields()
{
    $fields = parent::getCMSFields();
    $source = GuidePage::get()->map('ID', 'Name');        
    $fields->addFieldToTab('Root.Main', CheckboxSetField::create('GuidePages', 'Select guides which apply', $source));
    return $fields;
}

public function getAllGuidePages()
{
  $out = [];
  $source   = GuidePage::get();
  $selected = $this->GuidePages()->getIDList();
  foreach ($source as $page) {
    $out[] = [
        'Class' => (in_array($page->ID, $selected)) ? 'active' : '',
        'Name'  => $page->Name(),
        'Icon'  => $page->PageIcon()->Link(),
    ];
  }
  return ArrayList::create($out);
}

和在模板中

<% loop getAllGuidePages %>
    <div class="$Class">
        <img src="$Icon">
        $Name
    </div>
<% end_loop %>