Działa tak jak tego oczekiwałem, ale czy jest możliwość, aby zamiast linków sortowac zawartość opcjami z selecta? Chcę aby cena rosnąco i malejąco stanowiła dwie różne opcje zamiast linku działającego na zasadzie togglera.
Witam, postanowiłem napisać to po swojemu i finalnie działa. Jednak chciałbym poznać opinie kolegów z większym doświadczeniem i czy tego typu rozwiązanie jest dobre. Poniżej wypunktowałem moje czynności.
1. Dodałem do folderu config plik zawierający tablicę w której zdefiniowałem tabele i sposób w jaki ma być sortowana.
2. W szablonie znalazł się standardowy formularz z menu wyboru w którym pętlą foreach zwróciłem parametry sortowania czyli kolumna i w jaki sposób sortować.
3. Dla przychodzącego requesta z formularza utworzyłem middleware, który zmienia wartość requesta na domyślną w przypadku próby przesłania wartości niewystępującej w pliku config (sytuacja, w której użytkownik ręcznie zmienia wartość select).
4. W kontrolerze sprawdzam czy istnieje request i sortuje na jego podstawie pobierane dane.
1. sort.php (config)
<?php
return [
'created_at-desc',
'price-asc',
'price-desc'
];
2. sort-view.blade.php (view)
<form method="get">
<select name="sort">
@foreach(config('sort') as $sort)
<option value="{{ $sort }}" {{ $sort == Request::input('sort') ? 'selected="selected"' : '' }}>{{ $sort}}</option>
@endforeach
</select>
</form>
3. sort.php (middleware)
<?php
namespace App\Http\Middleware;
use Closure;
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$by = config('sort');
if($request->input('sort') != null && !in_array($request->input('sort'), $by)) { $request->replace(array('order' => $by[0
])); }
return $next($request);
}
}
4. SortController.php (controller)
<?php
namespace App\Http\Controllers;
use App\Data;
use Request;
class OrderController extends Controller
{
{
$sort = explode('-', Request
::input('sort'));
if(Request::input('sort')) {
$data = Data::all()->orderBy($sort[0], $sort[1])->get();
} else {
$data = Data::all()->get();
}
return view
('sort-view', compact('data')); }
}