Получить Dataobjects от детей - SilverStripe 3.1

У меня есть GalleryHolder с Gallery-Pages в качестве детей. Каждая Галерея-страница имеет объект Dataobject (VisualObject) для хранения изображений.

Мне удалось получить 3 случайных изображения из галереи на странице галереи и 3 случайных изображения из всех галерей на странице GalleryHolder.

Но то, что я хочу, - это 3 случайных изображения для каждой галереи, показанной на странице GalleryHolder.

Здесь мой Кодекс, может кто-нибудь сказать мне, как это сделать?

1 ответ

простое решение состоит в том, чтобы просто направлять ваших детей

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;
}

//EDIT как ответ на ваши комментарии:

если вы хотите, чтобы он был сгруппирован по галерее, я бы сделал все по-другому (забудьте вышеприведенный код и просто выполните следующее):

поместите это в свой класс 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>
 <% 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
 $Visual
<% end_with %>

licensed under cc by-sa 3.0 with attribution.