Php SilverStripe-从一个管理模型中获取选中的复选框字段,以便在另一个管理模型中使用

Php SilverStripe-从一个管理模型中获取选中的复选框字段,以便在另一个管理模型中使用,php,silverstripe,Php,Silverstripe,我有一个名为PortfolioItemPage的管理模型,它与另一个名为MediaTypeTag的管理模型有$many\u many关系。在PortfolioItemPage中,我已将所有值映射到MediaTypeTag中的复选框,并将其映射到一个单独的选项卡中(这样,一个公文包项目就可以与不同的媒体标签相关联,以便在网站上进行过滤) 每个portfolioTempage数据对象都有一个$与数据对象PortfolioChildItem有许多关系。基本上,PortfolioItemPage代表一家

我有一个名为
PortfolioItemPage
的管理模型,它与另一个名为
MediaTypeTag
的管理模型有
$many\u many
关系。在
PortfolioItemPage
中,我已将所有值映射到
MediaTypeTag
中的复选框,并将其映射到一个单独的选项卡中(这样,一个公文包项目就可以与不同的媒体标签相关联,以便在网站上进行过滤)

每个
portfolioTempage
数据对象都有一个
$与数据对象
PortfolioChildItem
有许多关系。基本上,
PortfolioItemPage
代表一家公司,
PortfolioCildItem
代表该公司的工作样本。(即ABC公司有6个样本投资组合,XYZ公司有4个投资组合,等等)

我想做的是将
MediaTypeTags
的复选框列表添加到
PortfolioChildItem
数据对象中,但仅添加那些由子项对应的
PortfolioItemPage
选择的复选框列表。例如,如果ABC公司(a
PortfolioTempage
数据对象)选择了以下媒体标签:电视、网站、广告牌(所有三个都是
MediaTypeTag
数据对象),我只想让这三个媒体标签作为每个投资组合样本的复选框选项显示(每个都是
PortfolioChildItem

我不确定这样的事情是否可能,因为我以前从未尝试过这样的事情。这是可行的吗

以下是提到的数据对象的代码: 叶绿体

<?php
class PortfolioItemPage extends Page {

    private static $db = array(
        'Excerpt' => 'Text',
        'PreferredItem' => 'Boolean'
    );

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

    private static $has_many = array(
        'PortfolioChildItems' => 'PortfolioChildItem'
    );

    private static $many_many = array(
        'MediaTypeTags' => 'MediaTypeTag',
    );

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

        if ($this->ID) {
            $fields->addFieldToTab('Root.Media Type Tags', CheckboxSetField::create(
                'MediaTypeTags',
                'Media Type Tags',
                MediaTypeTag::get()->map()
            ));
        }

        $gridFieldConfig = GridFieldConfig_RecordEditor::create();

        $gridFieldConfig->addComponent(new GridFieldBulkUpload());

        $gridFieldConfig->addComponent(new GridFieldSortableRows('SortOrder'));
        $gridFieldConfig->getComponentByType('GridFieldDataColumns')->setDisplayFields(array(
            'YouTubeEmbedURL' => 'YouTube Video ID',
            'SoundCloudEmbedURL' => 'SoundCloud Embed Code',
            'Thumb' => 'Thumb (135px x 135px)',
        ));

        $gridfield = new GridField(
            "ChildItems",
            "Child Items",
            $this->PortfolioChildItems(),
            $gridFieldConfig
        );

        $fields->addFieldToTab('Root.Child Items', $gridfield);

        $fields->addFieldToTab("Root.Main", new TextareaField("Excerpt"), "Content");
        $fields->addFieldToTab("Root.Main", new UploadField('Thumbnail', "Thumbnail (400px x 400px)"), "Content");

        $fields->addFieldToTab("Root.Main", new CheckboxField('PreferredItem', 'Show on all pages?', 0), "Content");


        return $fields;
    }

    public function getChildItems() {
        return $this->PortfolioChildItems()->sort('SortOrder');
    }

    public function getFormattedContent() {
        return addslashes($this->Content);
    }
}

class PortfolioItemPage_Controller extends Page_Controller {


    private static $allowed_actions = array (
    );

    public function init() {
        parent::init();
    }

}

您应该能够通过获取
MediaTypeTag
ID,然后将其用作过滤器来实现这一点

在类
PortfolioChildItem
上的
getCMSFields
函数中添加如下内容

$mediaTypeTagIDs = array();
$mediaTypeTags = $this->PortfolioItemPage()->MediaTypeTags();
if ($mediaTypeTags->count()) {
  foreach ($mediaTypeTags as $mediaTypeTag) {
    $mediaTypeTagIDs[] = $mediaTypeTag->ID;
  }
  $mediaTypeTagList = DataList::create('MediaTypeTag')->byIDs($mediaTypeTagIDs);
}

然后将
$mediaTypeTagList
添加到网格字段中

您应该能够通过获取
MediaTypeTag
ID,然后将其用作过滤器来实现这一点

在类
PortfolioChildItem
上的
getCMSFields
函数中添加如下内容

$mediaTypeTagIDs = array();
$mediaTypeTags = $this->PortfolioItemPage()->MediaTypeTags();
if ($mediaTypeTags->count()) {
  foreach ($mediaTypeTags as $mediaTypeTag) {
    $mediaTypeTagIDs[] = $mediaTypeTag->ID;
  }
  $mediaTypeTagList = DataList::create('MediaTypeTag')->byIDs($mediaTypeTagIDs);
}
然后将
$mediaTypeTagList
添加到网格字段中

$mediaTypeTagIDs = array();
$mediaTypeTags = $this->PortfolioItemPage()->MediaTypeTags();
if ($mediaTypeTags->count()) {
  foreach ($mediaTypeTags as $mediaTypeTag) {
    $mediaTypeTagIDs[] = $mediaTypeTag->ID;
  }
  $mediaTypeTagList = DataList::create('MediaTypeTag')->byIDs($mediaTypeTagIDs);
}