Silverstripe 3.4.0 — установить связь между DataObject и Page — данные не сохраняются в базе данных

У меня есть веб-сайт с галереей проектов, и на сайте есть подстраницы, посвященные типам проектов. Я хочу, чтобы менеджеры контента могли выбирать любые элементы галереи проектов для отображения на любой подстранице по своему выбору. На подстранице может быть много элементов галереи проекта, и элемент галереи проекта может отображаться на одной или нескольких подстраницах.

Я создал CheckboxSetField на Page.php который отображает список всех имен проектов из ProjectGalleryItem DataObject. У меня есть список флажков, отображаемый на отдельной вкладке на всех подстраницах, но я не могу получить никакие выбранные значения для сохранения — отмеченные флажки автоматически снимаются при сохранении. Ошибки не отображаются в файлах журнала или в консоли.

Мне интересно, если мои отношения между Page а также ProjectGalleryItem неверны?

Вот код для ProjectGalleryItem:

<?php

class ProjectGalleryItem extends DataObject
{
private static $db = array(
'ProjectName'      => 'Varchar(250)',
'ProjectDescription' => 'Text',
);

private static $has_one = array(
'ProjectImage' => 'Image',
);

private static $belongs_many_many = array(
'Pages' => 'Page',
);

private static $summary_fields = array(
'ProjectName',
'ProjectDescription',
);
}

class ProjectGalleryItemAdmin extends ModelAdmin {
private static $managed_models = 'ProjectGalleryItem';
private static $url_segment = 'ProjectGalleryItems';
private static $menu_title = 'Project Gallery Items';
}

А вот половина Page.php файл:

<?php

class Page extends SiteTree
{
private static $db = array(
'BannerH1' => 'HTMLText',
'BannerSubH1' => 'HTMLText',
'H1' => 'varchar(250)',
'PageTitle' => 'varchar(250)',
'BottomContent' => 'HTMLText',
'StylizedList' => 'HTMLText',
);

private static $has_one = array(
'BannerImg' => 'Image',
);

private static $has_many = array(
'RotatorImages' => 'RotatorImage',
);

private static $many_many = array(
'ProjectGalleryItems' => 'ProjectGalleryItem'
);

public function getCMSFields()
{
$fields = parent::getCMSFields();

$fields->addFieldToTab("Root.Main", new TextField("H1"), "Content");
$fields->addFieldToTab("Root.Main", new HTMLEditorField("BannerH1"), "Content");
$fields->addFieldToTab("Root.Main", new HTMLEditorField("BannerSubH1"), "Content");
$fields->addFieldToTab("Root.Main", new HTMLEditorField('BottomContent', "Bottom Content"));
$fields->addFieldToTab("Root.Main", new HTMLEditorField('StylizedList', "Stylized List"), "BottomContent");
$fields->addFieldToTab('Root.Main', new TextField('PageTitle', 'Page Title'), 'MetaDescription');
$fields->addFieldToTab("Root.Main", new UploadField('BannerImg', "Subpage Banner"), "Content");$metadataTab = $fields->findOrMakeTab('Root.Main.Metadata');
$fields->removeByName('Metadata');
$fields->addFieldToTab('Root.Main', $metadataTab);

$gridFieldConfig = GridFieldConfig_RecordEditor::create();

$gridFieldConfig->addComponent(new GridFieldBulkUpload());
$gridFieldConfig->addComponent(new GridFieldSortableRows('SortOrder'));

$gridFieldConfig->getComponentByType('GridFieldDataColumns')->setDisplayFields(array(
// field from drawer class => label in UI
'ID' => 'ID',
'Title' => 'Title',
'Thumbnail' => 'Thumbnail',
'InternalURL.Link' => 'Internal URL',
));

$gridfield = new GridField(
"RotatorImages",
"Rotator Images",
$this->RotatorImages()->sort("SortOrder"),
$gridFieldConfig
);

$fields->addFieldToTab('Root.Rotator Images', $gridfield);

$projects = DataObject::get('ProjectGalleryItem');

if(!empty($projects))
{
$map = $projects->Map('ID', 'ProjectName');

$fields->addFieldToTab('Root.Projects',
CheckboxSetField::create(
$name = "Projects",
$title = "Select Projects",
$source = $map
));
}

return $fields;
}
}

0

Решение

Мне кажется, проблема в том, что ваше имя поля формы должно совпадать с именем отношения. Первый параметр для CheckboxsetField::create() должно быть ProjectGalleryItemsне Projects,

3

Другие решения

Других решений пока нет …