Я работаю над приложением Laravel PHP, где на домашней странице пользователь выбирает определенную категорию, и результаты возвращаются после того, как пользователь делает свой выбор. В настоящий момент результаты возвращаются правильно, за исключением одной проблемы, если есть несколько страниц результатов.
Например, допустим, что у меня есть 15 записей, относящихся к категории 1. Прямо сейчас у меня установлена разбивка на страницы, чтобы на странице отображалось 10 результатов. Таким образом, эти 15 записей должны отображаться следующим образом: Страница 1 содержит 10 записей и содержит 5 записей. Однако проблема заключается в том, что на странице 1 отображаются первые 10 записей для выбранной категории, но при выборе Page 2 она отображает ВСЕ дополнительные записи, а не только оставшиеся 5 записей, относящихся к категории 1.
контроллер:
<!-- Form -->
{{Form::model(array('method' => 'GET', 'route' => 'overview_select', 'files' => true)) }}
<div class="form-group">
{{ Form::label('category', 'Category:') }}
{{ Form::select('category', array('category1' => 'Category1', 'category2' => 'Category2', 'category3' => 'Category3', 'category4' => 'Category4'), (isset($category) ? $category : 'category')) }}
<div class="form-group">
{{ Form::submit('Select Category', array('class' => 'btn btn-primary')) }}
</div>
{{ Form::close() }}
</div>
public function index()
{
$vdo = Video::query();
$pic = Picture::query();
if($category = Input::get('category')){
$vdo->where('category', $category);
$pic->where('category', $category);
}
$allvids = $vdo->paginate(10);
$allpics = $pic->paginate(10);
$data = compact('allvids','allpics');
$data['category'] = Input::get('category');
$this->layout->content = \View::make('home.pics_vids_overview',$data);
}
Посмотреть:
<div class="panel-body">
@if ($allvids->count())
<dl class="dl-horizontal">
<!-- Add this div class to make the table responsive -->
<div class = "table-responsive">
<table class="table">
<b>Results: </b>{{ $allvids->count() }}<br>
<tr>
<th>ID</th>
<th>Name</th>
<th>Description</th>
<th>Corner</th>
<th>Rock</th>
<th>Category</th>
<th>Project</th>
<th>Update Video</th>
</tr>
@foreach($allvids as $video)
<tr>
<td>{{ $video->video_id }}</b></td>
<td>{{ $video->video_name }}</td>
<td>{{ $video->video_description }}</td>
<td>{{ $video->video_corners }} </td>
<td>{{ $video->video_rocks }}</td>
<td>{{ $video->category }}</td>
<td>{{ $video->video_project }}</td>
<td><b>{{ link_to_route("show_video", 'Edit', array($video->video_id)) }}</b></td>
</tr>
@endforeach
{{ $allvids-> links()}}
</table>
</div>
</dl>
@else
<b>{{ 'No Videos in this category.' }}</b>
@endif
</div>
routes.php
Route::post('pics_vids', array('as'=>'overview_select', 'uses' => 'OverviewController@index'));
Route::get('pics_vids', array('as'=>'overview', 'uses' => 'OverviewController@index'));
Я не совсем уверен, что мне нужно добавить что-либо в свой контроллер, чтобы дополнительные страницы отображали только результаты из выбранной категории. Любая помощь очень ценится!
Я считаю, что проблема заключается в том, что вы извлекаете разбивку на страницы по категориям. Лучше использовать метод GET для получения результатов листинга, потому что использование метода POST для разбивки на страницы может вызвать предупреждение о повторной отправке формы в некоторых браузерах, когда пользователи нажимают кнопку "Назад".
Теперь, причина, по которой вы получаете все продукты на странице 2,
if($category = Input::get('category')){
$vdo->where('category', $category);
$pic->where('category', $category);
}
Здесь, когда нажата вторая ссылка, запрос больше не отправляется, поэтому метод Input :: get() пуст. Измените маршрутизацию так, чтобы категория формировалась как часть URL-адреса, либо в форме строки запроса, либо в строке URI.
РЕДАКТИРОВАТЬ:
Я изменил форму в представлении от:
{{Form::model(array('method' => 'GET', 'route' => 'overview_select', 'files' => true)) }}
чтобы:
{{Form::open(array('method' => 'GET', 'route' => 'overview_select', 'files' => true)) }}
Итак, теперь поле "категория" появится в URL после того, как пользователь сделает свой выбор.
По мнению, я изменил
{{ $allvids-> links()}}
чтобы:
{{ $allvids->appends(array('category' => $category))->links()}}
И теперь разбивка на страницы будет работать для дополнительных страниц.
Ссылка ниже помогла мне с моим решением, а также дает хорошее объяснение того, как методы GET/POST работают в формах для Laravel 4.
Разбиение страницы в Laravel 4 работает на одну страницу, но не работает для другого