Silverstripe 3: создайте функцию управления страницей для получения изображений со страниц внуков и сортировки произвольно

Я пытаюсь получить конкретное изображение ($ FeaturedImage) со страницы каждого внука (GalleryPage.ss) моей страницы портфолио (PortfolioPage.ss) и отображать их в произвольном порядке.

Я могу получить изображения с помощью шаблона достаточно легко. PortfolioPage.ss

<% loop Children %>
 <% loop Children %>
 <% loop FeaturedImage %>
 
 <% end_loop %>
 <% end_loop %>
<% end_loop %>

Но это отобразит их в порядке страниц в меню.

После некоторого исследования лучше всего создать функцию в контроллере страницы, но я не уверен, как это написать. (Любой, у кого есть ссылка на документацию/учебники по этим вопросам, также будет замечательным).

Примеры аналогичного кода, найденного до сих пор: получить Dataobjects от детей - SilverStripe 3.1 http://www.silverstripe.org/template-questions/show/23296

Документы Silverstripe: http://doc.silverstripe.org/framework/en/topics/datamodel

Я просто не уверен, как применить это к моему коду.

2 ответа

В основном вам нужно создать функцию в вашем диспетчере страниц портфолио (или на любой странице, для которой вам нужна эта логика).

Вот два примера. Сначала он просто получает весь существующий FeaturedImage из базы данных и возвращается в случайном порядке:

function AllFeaturedImages()
{
 return FeaturedImage::get()->sort('RAND()');
}

И этот получает все FeaturedImage из дочерних детей страницы и возвращает их в случайном порядке:

function DescendantFeaturedImages()
{
 $featuredImages = array();

 foreach ($this->Children() as $child)
 {
 foreach ($child->Children() as $grandChild)
 {
 $images = $grandChild->FeaturedImage();
 if ( $images )
 {
 $featuredImages = array_merge( $featuredImages, $images->toArray() );
 }
 }
 }

 shuffle($featuredImages);

 return ArrayList::create($featuredImages);
}

Если отношение FeaturedImage просто has_one, это немного изменится:

function DescendantFeaturedImages()
{
 $featuredImages = array();

 foreach ($this->Children() as $child)
 {
 foreach ($child->Children() as $grandChild)
 {
 $image = $grandChild->FeaturedImage();
 if ( $image )
 {
 array_push( $featuredImages, $image );
 }
 }
 }

 shuffle($featuredImages);

 return ArrayList::create($featuredImages);
}

Затем на вашем шаблоне страницы портфолио вы можете просто пропустить FeaturedImage, вызвав имя функции. Итак, здесь: $AllFeaturedImages или $DescendantFeaturedImages. В вашем случае вы получите что-то вроде:

<% loop $DescendantFeaturedImages %>
 
<% end_loop %>

Я мог бы найти один пример в учебниках SilverStirpe с помощью функции Controller: http://doc.silverstripe.org/framework/en/tutorials/2-extending-a-basic-site

Дайте мне знать, как это происходит.


Я пробовал код Колимбы, и он работал как чемпион. Я бы рекомендовал следовать его коду по методу, который я объясню ниже.

Как вы говорите в комментарии, вы можете получить доступ к изображениям бабушки и дедушки из шаблона. Вы можете использовать JavaScript или, как в этом примере jQuery, случайным образом сортировать свои изображения.

(function($){

 $.fn.shuffle = function() {

 var allElems = this.get(),
 getRandom = function(max) {
 return Math.floor(Math.random() * max);
 },
 shuffled = $.map(allElems, function(){
 var random = getRandom(allElems.length),
 randEl = $(allElems[random]).clone(true)[0];
 allElems.splice(random, 1);
 return randEl;
 });

 this.each(function(i){
 $(this).replaceWith($(shuffled[i]));
 });

 return $(shuffled);

 };

})(jQuery);

А затем вызовите функцию на элементы, которые вы хотите отсортировать случайным образом:

$('#imgholder img').shuffle();

Более подробное объяснение можно найти на css-tricks.com

licensed under cc by-sa 3.0 with attribution.