Php Silverstripe 3:创建页面控制函数,从孙子页面获取图像,并对所有页面进行随机排序
我试图从我的公文包页面(PortfolioPage.ss)的每个孙子页面(GalleryPage.ss)中获取一个特定的图像($FeaturedImage),并以随机顺序显示它们 我可以得到的图像使用模板很容易。PortfolioPage.ssPhp Silverstripe 3:创建页面控制函数,从孙子页面获取图像,并对所有页面进行随机排序,php,function,sorting,silverstripe,pagecontrol,Php,Function,Sorting,Silverstripe,Pagecontrol,我试图从我的公文包页面(PortfolioPage.ss)的每个孙子页面(GalleryPage.ss)中获取一个特定的图像($FeaturedImage),并以随机顺序显示它们 我可以得到的图像使用模板很容易。PortfolioPage.ss <% loop Children %> <% loop Children %> <% loop FeaturedImage %> <img src="$Url"></>
<% loop Children %>
<% loop Children %>
<% loop FeaturedImage %>
<img src="$Url"></>
<% end_loop %>
<% end_loop %>
<% end_loop %>
但这将按菜单中页面的顺序显示它们
经过一些研究,似乎最好在页面控制器中创建一个函数,但我不确定如何编写此函数。。(任何有这些文档/教程链接的人都会很好)
迄今为止发现的类似代码示例:
Silverstripe文档:
我只是不知道如何将其应用到我的代码中。谢谢,基本上你需要在你的公文包页面控制器中创建一个函数(或者在你需要这个逻辑的任何页面中) 这里有两个例子。第一个只是从数据库中获取所有现有的
FeaturedImage
,然后以随机顺序返回:
function AllFeaturedImages()
{
return FeaturedImage::get()->sort('RAND()');
}
function DescendantFeaturedImages()
{
$featuredImages = array();
foreach ($this->Children() as $child)
{
foreach ($child->Children() as $grandChild)
{
$images = $grandChild->FeaturedImage();
if ( $images )
{
$featuredImages = array_merge( $featuredImages, $images->toArray() );
}
}
}
shuffle($featuredImages);
return ArrayList::create($featuredImages);
}
这一个从页面的子级中获取所有FeaturedImage
,并以随机顺序返回它们:
function AllFeaturedImages()
{
return FeaturedImage::get()->sort('RAND()');
}
function DescendantFeaturedImages()
{
$featuredImages = array();
foreach ($this->Children() as $child)
{
foreach ($child->Children() as $grandChild)
{
$images = $grandChild->FeaturedImage();
if ( $images )
{
$featuredImages = array_merge( $featuredImages, $images->toArray() );
}
}
}
shuffle($featuredImages);
return ArrayList::create($featuredImages);
}
如果FeaturedImage
关系只是一个有一个
,则会有一点变化:
function DescendantFeaturedImages()
{
$featuredImages = array();
foreach ($this->Children() as $child)
{
foreach ($child->Children() as $grandChild)
{
$image = $grandChild->FeaturedImage();
if ( $image )
{
array_push( $featuredImages, $image );
}
}
}
shuffle($featuredImages);
return ArrayList::create($featuredImages);
}
然后,在您的公文包页面模板中,您可以通过调用函数名循环通过FeaturedImage
。所以在这里,要么$AllFeaturedImages
要么$genderantfeaturedimages
。在您的情况下,您将得到如下结果:
<% loop $DescendantFeaturedImages %>
<img src="$URL"/>
<% end_loop %>
我可以在SilverStirpe教程中找到一个使用控制器函数的示例:
让我知道这是怎么回事。基本上,你需要在你的公文包页面控制器中创建一个函数(或者在你需要这个逻辑的任何页面中) 这里有两个例子。第一个只是从数据库中获取所有现有的
FeaturedImage
,然后以随机顺序返回:
function AllFeaturedImages()
{
return FeaturedImage::get()->sort('RAND()');
}
function DescendantFeaturedImages()
{
$featuredImages = array();
foreach ($this->Children() as $child)
{
foreach ($child->Children() as $grandChild)
{
$images = $grandChild->FeaturedImage();
if ( $images )
{
$featuredImages = array_merge( $featuredImages, $images->toArray() );
}
}
}
shuffle($featuredImages);
return ArrayList::create($featuredImages);
}
这一个从页面的子级中获取所有FeaturedImage
,并以随机顺序返回它们:
function AllFeaturedImages()
{
return FeaturedImage::get()->sort('RAND()');
}
function DescendantFeaturedImages()
{
$featuredImages = array();
foreach ($this->Children() as $child)
{
foreach ($child->Children() as $grandChild)
{
$images = $grandChild->FeaturedImage();
if ( $images )
{
$featuredImages = array_merge( $featuredImages, $images->toArray() );
}
}
}
shuffle($featuredImages);
return ArrayList::create($featuredImages);
}
如果FeaturedImage
关系只是一个有一个
,则会有一点变化:
function DescendantFeaturedImages()
{
$featuredImages = array();
foreach ($this->Children() as $child)
{
foreach ($child->Children() as $grandChild)
{
$image = $grandChild->FeaturedImage();
if ( $image )
{
array_push( $featuredImages, $image );
}
}
}
shuffle($featuredImages);
return ArrayList::create($featuredImages);
}
然后,在您的公文包页面模板中,您可以通过调用函数名循环通过FeaturedImage
。所以在这里,要么$AllFeaturedImages
要么$genderantfeaturedimages
。在您的情况下,您将得到如下结果:
<% loop $DescendantFeaturedImages %>
<img src="$URL"/>
<% end_loop %>
我可以在SilverStirpe教程中找到一个使用控制器函数的示例:
让我知道这是怎么回事。我尝试了Colymba的代码,它像冠军一样工作。我建议遵循他的代码,而不是我将在下面解释的方法 正如您在评论中所说,您可以从模板访问祖父母的图像。您可以使用JavaScript或本例中的jQuery对图像进行随机排序
(function($){
$.fn.shuffle = function() {
var allElems = this.get(),
getRandom = function(max) {
return Math.floor(Math.random() * max);
},
shuffled = $.map(allElems, function(){
var random = getRandom(allElems.length),
randEl = $(allElems[random]).clone(true)[0];
allElems.splice(random, 1);
return randEl;
});
this.each(function(i){
$(this).replaceWith($(shuffled[i]));
});
return $(shuffled);
};
})(jQuery);
然后对要随机排序的元素调用函数:
$('#imgholder img').shuffle();
可以在上找到更全面的解释。我尝试了Colymba的代码,它像冠军一样工作。我建议遵循他的代码,而不是我将在下面解释的方法 正如您在评论中所说,您可以从模板访问祖父母的图像。您可以使用JavaScript或本例中的jQuery对图像进行随机排序
(function($){
$.fn.shuffle = function() {
var allElems = this.get(),
getRandom = function(max) {
return Math.floor(Math.random() * max);
},
shuffled = $.map(allElems, function(){
var random = getRandom(allElems.length),
randEl = $(allElems[random]).clone(true)[0];
allElems.splice(random, 1);
return randEl;
});
this.each(function(i){
$(this).replaceWith($(shuffled[i]));
});
return $(shuffled);
};
})(jQuery);
然后对要随机排序的元素调用函数:
$('#imgholder img').shuffle();
如果我理解正确,可以在上找到更详细的解释,您只想要孙子孙女的图像,而不是孩子或孙子孙女的图像?还是没关系?如果没有,您可以递归地遍历模板中的子级。如果这对你来说足够的话,给我喊一声。我想要一张孙子辈的照片。他们每页都有一张选定的图片,我想以随机顺序显示在他们的祖父母页面上。我可以在模板中循环很好地获取孙辈图像,但不要随机排序。如果我理解正确,您只想要孙辈的图像,而不是孩子或孙辈的图像?还是没关系?如果没有,您可以递归地遍历模板中的子级。如果这对你来说足够的话,给我喊一声。我想要一张孙子辈的照片。他们每页都有一张选定的图片,我想以随机顺序显示在他们的祖父母页面上。我可以在模板中循环很好地得到孙辈图片,只是不要随机排序。非常感谢你的全面回答!不幸的是,当我刷新公文包页面时,我刚刚收到一个“服务器错误”。。。页面只显示一个没有样式的版本,没有内容或主题。我使用了第二个示例和您提供的模板代码。我还可以提供哪些信息来了解我做错了什么?@pinkp是否刷新了模板?我的示例假设
->FeaturedImage()
返回了一个ManyList
,但显然它只是一个有一个关系。为此更新了上面的示例,在每个图像对象上使用push
。我的错误,ArrayList不支持RAND进行排序。更新示例以首先通过普通数组。为此,您必须返回页面
而非图像
的列表。基本上,在第二个foreach中,只需执行数组推送($featuredImages,$孙子)代码>将存储包含FeaturedImage的页面。然后在模板中,您应该能够执行类似于
。。。如果这还不清楚,最好是打开一个新的问题。非常感谢您的彻底回答!不幸的是,当我刷新公文包页面时,我刚刚收到一个“服务器错误”。。。页面只显示一个没有样式的版本,没有内容或主题。我使用了第二个示例和您提供的模板代码。我还可以提供哪些信息来了解我做错了什么?@pinkp是否刷新了模板?我的示例假设->FeaturedImage()
返回了ManyList
,但是