Silverstripe - петля всех предметов от многих - PullRequest
2 голосов
/ 25 апреля 2019

Я пытаюсь вывести набор значков (из набора 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, но могу выбрать несколько подходящих и зациклить их все в шаблоне (добавив активный класс к выбранным).

Это не обязательно должно быть many_many или какие-либо отношения между двумя наборами страниц, если есть другой более простой способ сделать это ... т.е. просто поместить значения в DataList или что-то в этом роде ...

1 Ответ

2 голосов
/ 01 мая 2019

Закончено:

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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...