SilverStripe - 按标签排序项目
SilverStripe - Sorting Items By Tag
我有一个名为 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
) 作为单独的选项卡映射到此页面类型。这是因为我想将某些媒体类型标签与每个 Portfolio Item 页面相关联以进行排序。 (我想指出,这不是博客——这是一个网站,其中包含可以 sorted/filtered 的项目页面)。
我无法使用基于所选 MediaTypeTags
排序 PortfolioItemPage
的功能。我有 jQuery 到位,它正在提取所选媒体类型标签的 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
函数,我不知道如何通过MediaTypeTag
id来抓取所有的PortfolioItemPages
。数据库中有一个名为 PorfolioItemPage_MediaTypeTags
的单独 table,它存储 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;
}
}
除此之外,您可以在您的控制器中执行类似的操作(未测试)
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 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
的页面类型:
<?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
) 作为单独的选项卡映射到此页面类型。这是因为我想将某些媒体类型标签与每个 Portfolio Item 页面相关联以进行排序。 (我想指出,这不是博客——这是一个网站,其中包含可以 sorted/filtered 的项目页面)。
我无法使用基于所选 MediaTypeTags
排序 PortfolioItemPage
的功能。我有 jQuery 到位,它正在提取所选媒体类型标签的 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
函数,我不知道如何通过MediaTypeTag
id来抓取所有的PortfolioItemPages
。数据库中有一个名为 PorfolioItemPage_MediaTypeTags
的单独 table,它存储 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;
}
}
除此之外,您可以在您的控制器中执行类似的操作(未测试)
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 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
}
});
这样做会更简洁一些。