получить Dataobjects от детей – SilverStripe 3.1

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

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

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

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

  • GalleryHolder: http://sspaste.com/paste/show/525e4b9134940
  • Галерея: http://sspaste.com/paste/show/525e4bb25f236
  • VisualObject: http://sspaste.com/paste/show/525e4bd3cdfff

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

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 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 %>