Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting SilverStripe-按标记对项目进行排序_Sorting_Silverstripe - Fatal编程技术网

Sorting SilverStripe-按标记对项目进行排序

Sorting SilverStripe-按标记对项目进行排序,sorting,silverstripe,Sorting,Silverstripe,我有一个页面类型叫做PortfolioItemPage: <?php class PortfolioItemPage extends Page { private static $many_many = array( 'MediaTypeTags' => 'MediaTypeTag' ); public function getCMSFields() { $fields =

我有一个页面类型叫做
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;
        }
    }
但是当谈到
getByMediaTag
函数时,我不知道如何通过
MediaTypeTag
id获取所有
PortfolioItemPage
。数据库中有一个名为
PorfolioItemPage\u 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项目数组,您有什么想法吗?

根据评论,这就是您想要的

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;
    }
}
除此之外,您可以在控制器中执行类似操作(未经测试)

只是为了保持ajax URL的动态性

//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
    }
});
//portfolioItemPage.js
$.ajax({
类型:“POST”,
url:“$Link”+mediaTag,
数据类型:“json”
}).完成(功能(响应){
对于(变量i=0;i

这将是一个更干净的方法。

MediaTypeTag是否有属于PortfolioItemPage的许多?这似乎解决了问题,但它确实在MediaTypeTag管理模型中添加了PortfolioItemPage选项卡,我更愿意将其隐藏。我想我可以通过某种方式删除/隐藏此选项卡?
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());

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