Php Silverstripe 3.4.0-设置数据对象和页面之间的关系-数据未保存到数据库

Php Silverstripe 3.4.0-设置数据对象和页面之间的关系-数据未保存到数据库,php,silverstripe,data-objects,Php,Silverstripe,Data Objects,我有一个带有项目库的网站,网站上有专门用于项目类型的子页面。我想让内容管理器能够选择任何项目库项目以显示在其选择的任何子页面上。子页面可以有许多项目库项,并且项目库项可以显示在一个子页面或多个子页面上 我在Page.php上设置了一个CheckboxSetField,其中显示了ProjectGalleryItemDataObject中所有项目名称的列表。我将复选框列表显示在所有子页面的单独选项卡中,但我无法获得任何要保存的选定值——选中的复选框在保存时会自动取消选中。日志文件或控制台中未显示任何

我有一个带有项目库的网站,网站上有专门用于项目类型的子页面。我想让内容管理器能够选择任何项目库项目以显示在其选择的任何子页面上。子页面可以有许多项目库项,并且项目库项可以显示在一个子页面或多个子页面上

我在
Page.php
上设置了一个
CheckboxSetField
,其中显示了
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';
}

在我看来,问题是您的表单字段名,它应该与关系的名称匹配。
CheckboxsetField::create()
的第一个参数应该是
ProjectGalleryItems
,而不是
Projects
,在我看来,问题是表单字段名,它应该与关系的名称匹配。
CheckboxsetField::create()
的第一个参数应该是
ProjectGalleryItems
,而不是问题所在的
Projects

。我甚至没有意识到这就是问题所在。我甚至没有意识到:\
<?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;
    }
}