从儿童获取Dataobjects - SilverStripe 3.1

时间:2013-10-16 08:27:41

标签: php silverstripe

我有一个GalleryHolder,其中Gallery-Pages是孩子们。每个Gallery-Page都有一个Dataobject(VisualObject)来存储图像。

我设法从Gallery Gallery页面上的GalleryPage获取3张随机图像,并在GalleryHolder页面上从所有画廊中随机获取3张图像。

但我想要的是GalleryHolder页面上显示的每个图库的3个随机图像。

这是我的代码, 谁能告诉我怎么做?

1 个答案:

答案 0 :(得分:3)

简单的解决方案是让你的孩子远离

public function getRandomPreviewForAllChildren($numPerGallery=3) {
    $images = ArrayList::create();
    foreach($this->data()->Children() as $gallery) {
        $imagesForGallery = $gallery->GalleryImages()
            ->filter(array('Visibility' => 'true'))
            ->sort('RAND()')
            ->limit($numPerGallery);
        $images->merge($imagesForGallery);
    }
    return $images;
}

//编辑以回复您的评论:

如果您希望按库分组,我会一起做不同的事情(忘记上面的代码,然后执行以下操作):

将它放在您的Gallery类中:

// File: Gallery.php
class Gallery extends Page {   
    ...

    public function getRandomPreview($num=3) {
        return $this->GalleryImages()
            ->filter(array('Visibility' => 'true'))
            ->sort('RAND()')
            ->limit($num);
    }
}

然后在父模板(GalleryHolder)中调用该函数:

// File: GalleryHolder.ss
<% loop $Children %>
    <h4>$Title</h4>
    <ul class="random-images-in-this-gallery">
        <% loop $RandomPreview %>
            <li>$Visual</li>
        <% end_loop %>
    </ul>
<% end_loop %>

//编辑另一条评论要求提供单个数据对象:

如果您只想要1个随机图库图片,请使用以下内容:

// File: Gallery.php
class Gallery extends Page {   
    ...

    public function getRandomObject() {
        return $this->GalleryImages()
            ->filter(array('Visibility' => 'true'))
            ->sort('RAND()')
            ->first();
        // or if you want it globaly, not related to this gallery, you would use:
        // return VisualObject::get()->sort('RAND()')->first();
    }
}

然后在模板中直接访问该方法:
$RandomObject.ID$RandomObject.Visual或任何其他财产
或者您可以使用<% with %>来限定它:

<% with $RandomObject %>
    $ID<br>
    $Visual
<% end_with %>