Предишна и следваща снимка на галерия с Laravel

vinsbg

Registered
Здравейте,

Нужна ми е малко помощ с линковете на една галерия ... Prev & Next. Галерията е чист css/html и не използва JS ( такава трябва да е ). В моемнта съм я докарал до там, че изкарва всички снимки на страницата и когато се натисне на снимка се отваря в lightbox.

Сега се мъча с линковете за следваща и предишна снимка. Това е самата галерия
Код:
	@if(count($gallery) > 0)
		@foreach($gallery as $galImages)

		
		    <a href="#{{ $galImages->image_id }}" class="lightbox">
		        <img src="{{ $galImages->image }}" alt="">        
		    </a>

 	            <div class="lightbox-target" id="#">
                           <img src="{{ $galImages->image }}"/>
                           <a class="lightbox-close" href="#"></a>
                           <a class="nextLight" href="#"></a>
                           
                    </div> 

		    <div class="lightbox-target" id="#">
                           <img src="{{ $galImages->image }}"/>
                           <a class="lightbox-close" href="#"></a>
                           <a class="prevLight" href="#"></a>
                    </div> 		
		@endforeach
	@endif
Това ми е контролера
Код:
public function gallery() {
	
    $gallery = Gallery::all();
          
    //$previous = Gallery::where('image_id', '<', $gallery->image_id)->max('image_id');

   // $next = Gallery::where('image_id', '>', $gallery->image_id)->min('image_id');
              
          return View::make('site.gallery', [            
              'gallery' => $gallery
             // 'previous' => $previous,
             // 'next' => $next
          ]); 
}

Проблема е, че не съм сигурен как точно мога да взема следващо и предишно id на снимките... Ползвам Laravel 4.2.
 
Просто идея, но не е ли по-лесно вместо със заявки, просто да добавяш и изваждаш 1 от ид-то което вече си взел.
 
teroristd каза:
Просто идея, но не е ли по-лесно вместо със заявки, просто да добавяш и изваждаш 1 от ид-то което вече си взел.
Благодаря за идеята.. различните варианти вече ще ги пробвам после, но първо да намеря решение на как да стане това да предам предишно и следващо id към блейда..
 
Тъй като като направиш:
Код:
$gallery = Gallery::all();

$gallery вече е Collection от Gallery модела. Може да използваш методa first().
Код:
$firstGalleryElement = $gallery->first();

И после да вземеш следващия елемент, като използваш ID-то на първия елемент.
Код:
$nextGalleryElement = $gallery->where('id', '>', $firstGalleryElement->id)->first();

Но препоръчвам да си направиш някакво custom странициране за тази галерия, тъй като един вид това се явява странициране.

teroristd каза:
Просто идея, но не е ли по-лесно вместо със заявки, просто да добавяш и изваждаш 1 от ид-то което вече си взел.

Не, защото може запис от Gallery с id 5 да е изтрит и тогава +1/-1 не работи :)
 
Fakeheal каза:

Мерси, но така
Код:
    	$gallery = Gallery::all();

	$firstGalleryElement = $gallery->first();	
	$nextGalleryElement = $gallery->where('image_id', '>', $firstGalleryElement->image_id)->first();	
              
          return View::make('site.gallery', [            
              'gallery' => $gallery,
              'firstGalleryElement' => $firstGalleryElement,
              'nextGalleryElement' => $nextGalleryElement
          ]);
Получавам
'Call to undefined method Illuminate\Database\Eloquent\Collection::where()'
 
Fakeheal каза:
Коя версия на Laravel ползваш? Явно нещо по-малко от 5.

Ако е 4.2, ползвай filter().

Код:
$nextGalleryElement = $gallery->filter(function($item) {
    return $item->id > $firstGalleryElement->id;
})->first();

Да, 4.2. е .. написал съм го в първото мнение най-отдолу :D

Сега излиза 'Undefined variable: firstGalleryElement'
 
Аз видях грешката. Погледнах и линка, който пусна за filter.. нещо не мога да го схвана, защо трябва да се филтрира всеки елемент и какво всъщност се случва :)
 
vinsbg каза:
Аз видях грешката. Погледнах и линка, който пусна за filter.. нещо не мога да го схвана, защо трябва да се филтрира всеки елемент и какво всъщност се случва :)

Имаш два варианта, да използваш (и филтрираш) колекцията, която така или иначе вече си fetch-нал.

Или да правиш заявки за всеки един елемент.

Ако се чудиш да филтрираш е по-бързо, отколкото да select-ваш :)
 
Нещо не ми се получава и не мога да разбера, защо..

оригинала е това: https://jsfiddle.net/z30uf6bm/
Това, което аз имам в момента е това
Код:
    public function gallery() {
	
    	$gallery = Gallery::all();

	$firstGalleryElement = $gallery->first();

 	$nextGalleryElement = $gallery->filter(function($item) use ($firstGalleryElement) {
    		return $item->image_id > $firstGalleryElement->image_id;
	})->first();             
	
          return View::make('site.gallery', [            
              'gallery' => $gallery,
              'firstGalleryElement' => $firstGalleryElement,
              'nextGalleryElement' => $nextGalleryElement
          ]); 
    }
и блейда
Код:
	@if(count($gallery) > 0)
	
		@foreach($gallery as $galImages)

		    <a href="#{{ $galImages->image_id }}" class="lightbox">
		        <img src="{{ '../site5/' .$galImages->image }}" alt="">        
		    </a>

 	            <div class="lightbox-target" id="{{ $galImages->image_id }}">
                           <img src="{{ '../site5/' .$galImages->image }}"/>
                           <a class="lightbox-close" href="#"></a>
                           <a class="nextLight" href="#{{ $nextGalleryElement }}"></a>
                           
                    </div> 

		    <div class="lightbox-target" id="{{ $galImages->image_id }}">
                           <img src="{{ '../site5/' .$galImages->image }}"/>
                           <a class="lightbox-close" href="#"></a>
                           <a class="prevLight" href="#{{ $firstGalleryElement['image_id'] }}"></a>
                    </div> 		
		@endforeach
	@endif

var_dump($nextGalleryElement); връща NULL
var_dump($firstGalleryElement); връща "object(Gallery)#338 (20) ...."
var_dump($firstGalleryElement['image_id']); връща int(37) , което е последното ID-в таблицата...

Къде бъркам?
 
Много ясно....
Моя е грешката, вместо nextElement, дефакто взима последния.....

Трябва да се ползва и sortBy()

Код:
$nextGalleryElement = $gallery->filter(function($item) use ($firstGalleryElement) {
    return $item->id > $firstGalleryElement->id;
})->sortBy(function($item) {
    return $item->id;
})->first();

И за всеки случай направи:

Код:
$gallery = Gallery::orderBy('id','ASC')->get();

PS: Защо не ползваш някой популярен lightbox плъгин, който си има напред/назад навигация и му подаваш само всичките ти снимки? :)
 
edit:

Положението в момента е, че на всички линкове Next id-to e = 34, а на всички Prev id = 33...
Код:
		@foreach($gallery as $galImages)

		    <a href="#{{ $galImages->image_id }}" class="lightbox">
		        <img src="{{ $galImages->image }}" alt="">        
		    </a>

 	            <div class="lightbox-target" id="{{ $nextGalleryElement['image_id'] }}">
                           <img src="{{ $nextGalleryElement['image'] }}"/>
                           <a class="lightbox-close" href="#"></a>
                           <a class="nextLight" href="#{{ $nextGalleryElement['image_id'] }}"></a>   
                    </div> 

		    <div class="lightbox-target" id="{{ $firstGalleryElement['image_id'] }}">
                           <img src="{{ $firstGalleryElement['image'] }}"/>
                           <a class="lightbox-close" href="#"></a>
                           <a class="prevLight" href="#{{ $firstGalleryElement['image_id'] }}"></a>
                    </div> 		
		@endforeach

33 и 34 са първия и втория запис в таблицата от общо 5 ( 33, 34, 35, 36, 37 )
 
Не е нужно да го имплементираш, има го в стандартната библиотека на PHP http://php.net/manual/en/class.spldoublylinkedlist.php
 
pix3l каза:
Не е нужно да го имплементираш, има го в стандартната библиотека на PHP http://php.net/manual/en/class.spldoublylinkedlist.php

Този клас не го знаех, изглежда ми много добре :?:.
 
teroristd каза:
pix3l каза:
Не е нужно да го имплементираш, има го в стандартната библиотека на PHP http://php.net/manual/en/class.spldoublylinkedlist.php

Този клас не го знаех, изглежда ми много добре :?:.
И аз не го знаех... :D Последно време не пиша много (да не кажа изобщо) на PHP, ама като потърсих в нета, видях, че в стандартната библиотека има имплементации на повечето често използвани структури от данни... Stack, Queue, DoublyLinkedList. :D
 

Back
Горе