Php Silverstripe 3:创建页面控制函数,从孙子页面获取图像,并对所有页面进行随机排序

Php 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"></>

我试图从我的公文包页面(PortfolioPage.ss)的每个孙子页面(GalleryPage.ss)中获取一个特定的图像($FeaturedImage),并以随机顺序显示它们

我可以得到的图像使用模板很容易。PortfolioPage.ss

<% 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
,但是