jquery - Paginación AJAX con Laravel
search pagination (4)
Tengo esta vista llamada posts.blade.php
que se incluye en home.blade.php
:
<div id="posts">
@foreach ($posts as $post)
<div class="list-item clearfix">
<div class="content">
<img src="{{ URL::to($post->thumbnail) }}" alt="" />
<h1>{{{ $post->title }}}</h1>
</div>
<div class="score">{{ $post->rating }}</div>
</div>
@endforeach
<div id="pagination">{{{ $posts->links() }}}</div>
</div>
Cuando un usuario busca determinadas publicaciones, la función postSearch()
del controlador devuelve una respuesta JSON:
function postSearch()
{
$posts = $posts->select(...)->where(...)->orderBy(...)->paginate(5); //Search posts
return Response::json(View::make(''includes.posts'', [''posts'' => $posts])->render());
}
Y jQuery agrega el HTML en el div #posts
:
$(''#search'').submit(function(e) {
e.preventDefault();
var form = $(this);
$.post(form.attr(''action''), form.serialize(), function(data) {
$(''#posts'').html(data);
});
});
Esto funciona perfecto Pero ahora, cuando hago clic en un enlace de paginación, la página se vuelve a cargar y los resultados de mi búsqueda desaparecen (es obvio). ¿Cómo pagino estas publicaciones? He leído esto , este y este artículo, pero no entiendo cómo implementarlo.
Editar
Este es mi jQuery para la paginación hasta ahora:
$(''#posts'').on(''click'', ''.pagination a'', function(e) {
e.preventDefault();
var url = $(this).attr(''href''),
page = url.split(''page='')[1],
data = $(''#search'').serializeArray();
data.push({page: page}); // Add page variable to post data
console.log(data);
$.post($(''#search'').attr(''action''), data, function(data) {
$(''#posts'').html(data[''posts'']);
});
});
Estos son los datos que se envían cuando hago clic en un enlace de paginación (página 2):
Lamentablemente, no sucede nada, las publicaciones de la página 1 siguen apareciendo.
No estoy muy familiarizado con la paginación en Laravel, pero a juzgar por los enlaces que enumeró, no parece demasiado difícil. Este código aún no ha sido probado ...
$(''#pagination a'').on(''click'', function(e){
e.preventDefault();
var url = $(this).attr(''href'');
$.post(url, $(''#search'').serialize(), function(data){
$(''#posts'').html(data);
});
});
Actualizar
En caso de que los enlaces de paginación sean incorrectos (como lo fueron para OP), usted debe construir la url por su cuenta.
Simplemente tome la url que desea y agregue ?page=#number
a ella.
// page being the page number stripped from the original link
var url = $(''#search'').attr(''action'')+''?page=''+page;
Tengo la herramienta perfecta para el trabajo. Por favor revise este informe https://github.com/themightysapien/ajaxtable
Por favor, lea los documentos, es muy fácil de usar y está especialmente diseñado para laravel. Todo lo que necesita hacer es devolver sus resultados como en el siguiente ejemplo.
return Response::json(array(
''data''=> View::make(''only_table_row_view'', compact(''collection'')->render(),
''pagination''=>(string) $collection->links()
));
Los archivos requeridos son agregados
<link rel="stylesheet" href="css/ajaxtable.css">
<script src="js/plugins.js"></script>
$(".yourtable").ajaxtable();
Inicialice su url ajax a través del atributo data-requestUrl en su tabla. Agregue un id = "paginationWrapper" div en su página donde desea que aparezca su paginación.
Si tiene algún problema, ejecute el repositorio en su servidor local y vea la fuente de las marcas de revisión html y las opciones de complementos.
Estoy usando following js para obtener datos sobre href click.
// Your Local url
var Url = ''laraveltestproject/laravelpagination'';
$(''#ajaxContent'').load("Url");
$(''.pagination a'').on(''click'', function(event) {
event.preventDefault();
if ($(this).attr(''href'') != ''#'') {
$(''#ajaxContent'').load($(this).attr(''href''));
}
});
Para ver un ejemplo completo, puede visitar http://www.tutsway.com/laravel-ajax-pagination-example.php .
Ejemplo de publicación en un blog, resuelva paginar recarga en el botón eliminar: (sinple foreach pero debe dar una identificación al panel y botón y una clase a botón y usar $ post-> id para definir todo)
El truco al fin no es llamar a la vista / controlador que usa pagination () pero la vista cambia con javascript como lo desee.
@foreach($posts as $post)
<div id="panel{{$post->id}}" class="panel panel-default">
<div class="panel-body">
{!! $post->content !!}
</div>
<div class="panel-footer">
<span class="label label-default"><span class="glyphicon glyphicon-time"></span> creado {{$post->created_at->diffForHumans()}}</span>
<span class="label label-default"><span class="glyphicon glyphicon-time"></span> modificado {{$post->updated_at->diffForHumans()}}</span>
<span class="label label-success">autor: {{ imagica/User::find($post->user_id)->name}}</span>
@if(Auth::user()->id === $post->user_id)
<form method="post" style="position:relative; top:-25px;">
<button class="btn btn-danger btn-sm pull-right destroy" id="{{$post->id}}" type="button" >eliminar</button>
</form>
<form action="{{ action(''PostsController@edit'', $post->id) }}" method="get" style="position:relative; top:-25px;">
<button class="btn btn-warning btn-sm pull-right" type="submit" >Editar</button>
{{-- {{ csrf_field() }} --}}
</form>
@endif
</div>
</div>
@endforeach
al final de la vista javascript:
$(function(){
$(".destroy").on("click", function(){
var vid = $(this).attr("id");
var v_token = "{{csrf_token()}}";
var parametros = {_method: ''DELETE'', _token: v_token};
var archivo = "http://imagica.app/posts/" + vid + "";
$.ajax({
type: "POST",
url: archivo,
data: parametros,
success: function(data){
$(''#panel''+ data).hide();
location.reload();
}
});
});
});
En la función de destrucción del controlador (note que envía $ post-> id como datos a ajax, se usa para definir selectores para ocultar el panel de la publicación que elimina):
public function destroy($id)
{
$post= Post::find($id);
$article_id= $post->article_id;
$article= Article::find($article_id);
$msg = session()->flash(''message'', "Post eliminado.");
$post-> delete();
$data= $post->id;
return $data;
}
En la última función de javascript, "location.reload ()" es para cargar el mensaje flash.