1

我正在尝试从我的投资组合页面 (PortfolioPage.ss) 的每个孙子页面 (GalleryPage.ss) 中获取特定图像 ($FeaturedImage) 并以随机顺序显示它们。

我可以很容易地使用模板获取图像。投资组合页面.ss

<% loop Children %>
 <% loop Children %>
   <% loop FeaturedImage %>
      <img src="$Url"></>
   <% end_loop %>
 <% end_loop %>
<% end_loop %>

但这将按菜单中页面的顺序显示它们。

经过一些研究,似乎最好在页面控制器中创建一个函数,但我不确定如何编写这个..(任何有这些文档/教程链接的人也会很棒)。

到目前为止发现的类似代码示例: 从儿童获取数据对象 - SilverStripe 3.1 http://www.silverstripe.org/template-questions/show/23296

Silverstripe 文档: http ://doc.silverstripe.org/framework/en/topics/datamodel

我只是不确定如何将其应用于我的代码..谢谢

4

2 回答 2

3

基本上,您需要在您的投资组合页面控制器(或您需要此逻辑的任何页面)中创建一个函数。

这里有2个例子。第一个只是从数据库中获取所有现有FeaturedImage的,然后以随机顺序返回:

function AllFeaturedImages()
{
    return FeaturedImage::get()->sort('RAND()');
}

而这个FeaturedImage从页面的孩子的孩子那里得到所有的,并以随机顺序返回它们:

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关系只是 a has_one,这会发生一些变化:

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要么$DescendantFeaturedImages。在你的情况下,你会得到类似的东西:

<% loop $DescendantFeaturedImages %>
    <img src="$URL"/>
<% end_loop %>

我可以在 SilverStirpe 教程中找到一个使用控制器功能的示例:http: //doc.silverstripe.org/framework/en/tutorials/2-extending-a-basic-site

让我知道这是怎么回事。

于 2013-12-12T08:04:17.237 回答
2

我尝试了 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();

更详尽的解释可以在css-tricks.com上找到

于 2013-12-13T09:20:42.337 回答