SilverStripe - 按标签排序项目

时间:2016-05-03 18:51:04

标签: sorting silverstripe

我有一个名为PortfolioItemPage的网页类型:

  <?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)映射到此页面类型作为单独的选项卡。这是因为我想将某些Media Type标签与每个Portfolio Item页面相关联以进行排序。 (我想要注意的是,这不是博客 - 这是一个可以对其进行排序/过滤的项目页面)。

我已经陷入了根据所选PortfolioItemPage排序MediaTypeTags的功能。我有jQuery,它将所选的Media Type标签的id拉入并传递给服务器:

(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功能时,我不确定如何通过PortfolioItemPages ID获取所有MediaTypeTag。数据库中有一个名为PorfolioItemPage_MediaTypeTags的单独表,它存储了PortfolioItemPage ID及其对应的MediaTypeTag ID,但我不确定如何访问该信息。这就是我到目前为止所做的:

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

关于如何根据MediaTypeTag id获取一系列PortfolioItemPage项目的任何想法?

1 个答案:

答案 0 :(得分: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;
    }
}

除此之外,您可以在控制器中执行此类操作(未测试)

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

}

只是为了保持ajax网址的动态

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

这样做会更清洁。