2017-07-21 9 views
0

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

答えて

2

あなたは取得することによってこれを行うことができるはずMediaTypeTagのIDを使用し、それらをフィルタとして使用する。

getCMSFieldsのクラスPortfolioChildItemの機能では、次のように追加します。

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

次に、$mediaTypeTagListをグリッドフィールドに追加します。

関連する問題