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公司(aPortfolioTempage
数据对象)选择了以下媒体标签:电视、网站、广告牌(所有三个都是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);
}