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

SilverStripe - get selected checkbox fields from one admin model for use in another

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

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

我想做的是将 MediaTypeTags 的复选框列表添加到 PortfolioChildItem 数据对象,但只有那些已被子项的相应 PortfolioItemPage 选择的复选框.例如,如果公司 ABC(一个 PortfolioItemPage 数据对象)选择了以下媒体标签:电视、网站、广告牌(所有 3 个都是 MediaTypeTag 数据对象),我只想拥有这 3 个媒体标签显示为每个投资组合样本的复选框选项(每个样本都是 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();
    }

}

投资组合子项:

<?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;
    }
}

媒体类型标签:

<?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";
}

您应该能够通过获取 MediaTypeTag ID 然后将其用作过滤器来执行此操作。

在 class PortfolioChildItemgetCMSFields 函数中添加这样的内容。

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

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