【问题标题】:Silverstripe 3: create page control function to get images from grandchild pages and sort all randomlySilverstripe 3:创建页面控制功能以从孙页面获取图像并随机排序
【发布时间】:2013-12-30 03:41:45
【问题描述】:

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

我可以很容易地使用模板获取图像。 PortfolioPage.ss

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

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

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

目前发现的类似代码示例: get Dataobjects from Children - SilverStripe 3.1 http://www.silverstripe.org/template-questions/show/23296

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

我只是不确定如何将它应用到我的代码中......谢谢

【问题讨论】:

  • 如果我理解正确的话,您只想要孙子的图像,而不是子孙的图像?还是没关系?如果没有,您可以递归地遍历模板中的子项。如果这对你来说足够了,请给我大声喊叫。
  • 我想要来自孙子页面的图像。他们每页都有一个选择的图像,我想以随机顺序显示在他们的祖父母页面上。我可以很好地循环模板来获取孙子图像而不是随机排序它们..

标签: php function sorting silverstripe pagecontrol


【解决方案1】:

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

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

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

而这个从页面的children中获取所有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 关系只是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

让我知道这是怎么回事。

【讨论】:

  • 非常感谢您的详尽回答!不幸的是,当我刷新投资组合页面时,我只是收到一个“服务器错误”......该页面只显示一个没有内容或主题的无样式版本。我使用了第二个示例和您提供的模板代码。我还可以提供哪些信息来查看我做错了什么?
  • @pinkp 你刷新你的模板了吗?
  • 我的示例假设-&gt;FeaturedImage() 返回了ManyList,但显然它只是has_one 关系。为此更新了上面的示例,改为在每个图像对象上使用push
  • 我的错,ArrayList 不支持 RAND 进行排序。将示例更新为先通过普通数组。
  • 为此,您必须返回 Page 而不是 Image 的列表。基本上在第二个 foreach 中只需执行array_push( $featuredImages, $grandChild );,它将存储包含 FeaturedImage 的页面。然后在模板中你应该可以做类似&lt;a href=$Link" title="$Title"&gt;&lt;img src="$FeaturedImage.URL"&gt;&lt;/a&gt;... 如果不清楚,最好是打开一个新问题。
【解决方案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找到

【讨论】:

  • 谢谢 Marius,我会试试看的。
猜你喜欢
  • 1970-01-01
  • 2014-01-11
  • 2020-11-28
  • 2017-01-05
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
相关资源
最近更新 更多