0

Gallery-Pages を子として持つ GalleryHolder があります。各ギャラリー ページには、画像を格納するための Dataobject(VisualObject) があります。

ギャラリー ページの GalleryPage から 3 つのランダムな画像を取得し、GalleryHolder ページのすべてのギャラリーから 3 つのランダムな画像を取得することができました。

しかし、私が欲しいのは、GalleryHolder ページに表示されるギャラリーごとに 3 つのランダムな画像です。

これが私のコードです。誰かがその方法を教えてくれますか?

4

1 に答える 1

3

簡単な解決策は、子供たちに 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 %>
于 2013-10-16T11:51:31.163 に答える