2016-05-03 6 views
1

商品の並べ替え私はPortfolioItemPageと呼ばれるページ・タイプを持っている:SilverStripeは - タグ

<?php 
    class PortfolioItemPage extends Page { 

     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() 
       )); 
      } 

      return $fields; 
     } 
    } 

私はDataObjectを(MediaTypeTag)は別々のタブとして、このページ・タイプにマップされています。これは、並べ替えの目的で特定のメディアタイプタグを各ポートフォリオアイテムページに関連付けたいからです。 (これはブログではなく、ソート/フィルタリングできるアイテムのページです)。

PortfolioItemPageベースを選択してMediaTypeTagsをソートする機能が問題になりました。

(function($) { 

    $(document).ready(function() { 
     var media = $('.media'); 

     media.each(function(e) { 
      $(this).bind('click', function(e) { 
       e.preventDefault(); 
       $(this).toggleClass('selectedTag'); 
       sendMediaTag($(this).attr('id')); 
      }.bind($(this))); 
     }); 

     function sendMediaTag(mediaTag){ 
      $.ajax({ 
       type: "POST", 
       url: "/home/getByMediaTag/"+mediaTag, 
       dataType: "json" 
      }).done(function (response) { 
       for(var i=0; i < response.length; i++){ 
        //sort through the response items here 
       } 
      }); 
     } 
    }); 

}(jQuery)); 

しかし、それはgetByMediaTag機能に来るとき、私はすべてつかむするかどうかはわかりません。私は、選択したメディアタイプのタグのIDに引き出し、それをサーバに渡しているその場所でのjQueryを持っていますMediaTypeTagによってIDはPortfolioItemPagesです。データベースには、対応するMediaTypeTag IDを持つPortfolioItemPage IDを格納するPorfolioItemPage_MediaTypeTagsという別のテーブルがありますが、その情報にアクセスする方法がわかりません。これは私がこれまで持っているものです:

私はMediaTypeTag IDに基づいてPortfolioItemPageアイテムの配列を得ることができる方法上の任意のアイデア
//get all Portfolio Items by media tag(s) 
public function getByMediaTag(){ 
    $mediaID = $this->getRequest()->param('ID'); 

    //get an array of PortfolioItemPage based on value of $mediaID 

    $return = array(); 

    foreach($portfolioItems as $portfolioItem){ 
     $return[] = array(
      'thumbnail' => $portfolioItem->Thumbnail()->Link(), 
      'name' => $portfolioItem->H1, 
      'logo' => $portfolioItem->Logo()->Link(), 
      'excerpt' => $portfolioItem->Excerpt, 
      'id' => $portfolioItem->ID 
     ); 
    } 
    return json_encode($return); 
} 

+0

MediaTypeTagには、PortfolioItemPageへのbelongs_many_manyがありますか? – wmk

+0

これは問題を解決したようですが、PortfolioItemPageタブにMediaTypeTag管理モデルを追加します。これはむしろ非表示にします。私はこのタブを何らかの方法で削除/非表示にすることができますか? –

答えて

1

コメントに基づいて、これはあなたが探しているものです。そのほかに

class MediaTypeTag extends DataObject 
{ 
    private static $db = array(
     'Title' => 'Varchar' 
     // ... 
    ); 

    private static $belongs_many_many = array(
     'PortfolioItemPages' => 'PortfolioItemPage' 
    ); 

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

     $fields->removeByName('PortfolioItemPages'); 

     return $fields; 
    } 
} 

、あなたはほんの少しのだろう

//portfolioItemPage.js 
$.ajax({ 
    type: "POST", 
    url: "$Link"+mediaTag, 
    dataType: "json" 
}).done(function (response) { 
    for(var i=0; i < response.length; i++){ 
     //sort through the response items here 
    } 
}); 

動的なAjaxのURLを保つために(テストしていません)あなたのコントローラに

private static $allowed_actions = array(
    'getByMediaTag' => '->isAjax' 
); 

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

    Requirements::javascriptTemplate("{$this->ThemeDir()}/javascript/PortfolioItemPage.js", array(
     'Link' => $this->Link('getByMediaTag/') 
    )); 
} 

protected function isAjax() 
{ 
    return Director::is_ajax(); 
} 

public function getByMediaTag() 
{ 
    $mediaID = $this->getRequest()->param('ID'); 

    if(! $tag = MediaTypeTag::get()->ByID($mediaID)) 
     return false; 

    return json_encode($tag->PortfolioItemPages()->toNestedArray()); 

} 

をこのような何かを単に行うことができますよりクリーンな方法でそれを行う。

関連する問題