Может войдёшь?
Черновики Написать статью Профиль

Комментарии mcrack

А подскажите пожалуйста как сделать ссылки такого вида http://localhost/page-1 или например такого http://localhost/page/1?

FreeWebber

Laravel 5.2.42. Сделал так: создал свой класс пагинации на основе \Illuminate\Pagination\LengthAwarePaginator и в ней изменил public function url($page) под себя.

<?php

use Illuminate\Pagination\LengthAwarePaginator;

namespace App\Models;

class Paginator extends \Illuminate\Pagination\LengthAwarePaginator
{
    public function url($page)
    {
        if ($page <= 0) {
            $page = 1;
        }

        return
            $this->pageName
            .$page
            .$this->buildFragment();


    }
}

А так же в контроллере беру данные о странице и из них строю запросы, а потом передаю в пагинатор, который и создаёт ссылки.

public function index(Post $postModel, Request $request, $page=1){ // если нет данных о странице, то по-умолчанию - первая

    $perpage = 2; // новостей на страницу
    $total = DB::table('posts')->where('published', '=', '1')->count(); // кол-во новостей
    if($page > ceil($total/$perpage)) return redirect()->route('posts'); // если страница больше чем последняя, то редиректим

    $posts = DB::table('posts')
                ->select('posts.*','users.name as author',DB::raw('GROUP_CONCAT(tags.tag) as tags'))
                ->leftjoin('post_tag', 'post_tag.post_id', '=', 'posts.id')
                ->leftjoin('tags', 'tags.id', '=', 'post_tag.tag_id')
                ->leftJoin('users', 'users.id', '=', 'user_id')
                ->where('published', '=', '1')
                ->groupBy('posts.id')
                ->orderBy('published_at', 'desc')->skip(($page-1)*2)->take(2)->get(); // посты с тегами и авторами

    if(strpos($request->getPathInfo(),'blog/page')) $pageName=''; else $pageName='blog/page/'; // если не на главной, то не надо добавлять 'blog/page/'
    $posts=new Paginator($posts, $total, $perpage, $page, ['path'=>'path','pageName'=>$pageName]);

Ну и во вьюхе:

 {{ $posts->render() }}

Роуты:

Route::get('blog/page/{page}',['as'=>'blog','uses'=>'PostController@index']);
Route::get('/',['as'=>'posts','uses'=>'PostController@index']);

В итоге у меня получилось что на главной всегда первая страница, а при переходе на другую адрес уже становится site.ru/blog/page/2. Можно убрать blog/ и тогда получится просто site.ru/page/1 По-хорошему может даже надо разделить контроллеры со страницами и бе3. В планах ещё изучить render() и сделать свой. Может я не совсем правильно делаю, но пока только учусь...

← Назад | Дальше → Движется на Habravel