簡単な解決策は、子供たちに foreach することです
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 %>