PortfolioItemPage
という管理モデルが$many_many
の関係を持ち、MediaTypeTag
という管理モデルがあります。 PortfolioItemPage
では、チェックボックスにすべての値をMediaTypeTag
から別のタブにマップしました(これは、ポートフォリオアイテムをサイトのフィルタリング目的でさまざまなメディアタグに関連付けるためのものです)。SilverStripe - ある管理者モデルから別の管理者モデルで選択されたチェックボックスフィールドを取得する
各PortfolioItemPage
データオブジェクトは、データオブジェクトPortfolioChildItem
との関係が$has_many
です。基本的にPortfolioItemPage
は会社を表し、PortfolioCildItem
は前記会社の仕事のサンプルを表します。 (つまり、ABC社はXYZ社は4点のポートフォリオ作品などがあり、6つのサンプルポートフォリオピースを持っている)
私は何をしたいのですがPortfolioChildItem
データオブジェクトにMediaTypeTags
のチェックボックスのリストを追加することですが、唯一のものを選択されていること子供のアイテムの対応するPortfolioItemPage
によって。たとえば、会社ABC(PortfolioItemPage
データオブジェクト)に、テレビ、ウェブサイト、ビルボード(すべて3つはMediaTypeTag
データオブジェクト)のメディアタグが選択されている場合、これらの3つのメディアタグを各ポートフォリオサンプルのチェックボックスオプション(それぞれはPortfolioChildItem
です)。
私はこのようなことを一度も試みたことがないので、このようなことが可能かどうかは分かりません。これは実行可能なものですか?ここで
が言及したデータ・オブジェクトのためのコードです: 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();
}
}
PortfolioChildItem:
<?php
class PortfolioChildItem extends DataObject {
private static $db = array(
'YouTubeEmbedURL' => 'Varchar(25)',
'SoundCloudEmbedURL' => 'Text',
'SortOrder' => 'Int'
);
private static $has_one = array(
'Banner' => 'Image',
'Thumb' => 'Image',
'PortfolioItemPage' => 'Page'
);
private static $many_many = array(
'MediaTypeTags' => 'MediaTypeTag',
'IndustryTags' => 'IndustryTag'
);
// tidy up the CMS by not showing these fields
public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->removeFieldFromTab("Root.Main","PortfolioItemPageID");
//code to create checkboxes goes here
return $fields;
}
private static $field_labels = array(
'Banner' => 'Banner (1280px x 700px)',
'Thumb' => 'Thumb (135px x 135px)',
'YouTubeEmbedURL' => 'YouTube Video ID (ex: OVgpJIkHmAw from video URL)',
'SoundCloudEmbedURL' => 'SoundCloud Embed Code',
);
// this function creates the thumnail for the summary fields to use
public function getThumbnail() {
return $this->Image()->CMSThumbnail();
}
public function getSoundCloudURL() {
return;
}
}
MediaTypeTag:
<?php
class MediaTypeTag extends DataObject {
private static $db = array(
'Name' => 'varchar(250)',
);
private static $summary_fields = array(
'Name' => 'Title',
);
private static $field_labels = array(
'Name'
);
private static $belongs_many_many = array(
'PortfolioItemPages' => 'PortfolioItemPage'
);
// tidy up the CMS by not showing these fields
public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->removeByName("PortfolioItemPages");
return $fields;
}
static $default_sort = "Name ASC";
}