Laravel View Composer, нумерация страниц с помощью ajax - PullRequest
0 голосов
/ 10 сентября 2018

Мне удалось найти некоторые ресурсы, чтобы разбить обычную страницу на страницы с помощью ajax. Это довольно легко. Вы можете просто иметь это:

if($request->ajax()) {
    return [
        'posts' => view('ajax.index')->with(compact('posts'))->render(),
        'next_page' => $posts->nextPageUrl()
    ];
}

Но для Composer View это не будет работать, так как у меня не может быть $request в View Composer. Кто-нибудь может просветить меня. Возможно, есть какой-то способ получить переменные внутри composer, так как ссылка на его разбиение на страницы - это, в основном, текущая страница плюс расширение для следующего контнета.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Итак, вот ответ на этот вопрос. В случае View Composer Pagination. Вы не можете разбивать на страницы в composer, у вас есть техническая возможность сделать это, но даже если вы пропустили выполнение запросов к поставщику (что, очевидно, является плохой идеей), нумерация страниц все равно не будет работать очень хорошо.

Одна из основных проблем, с которой вы будете сталкиваться в срочном порядке, - это разбиение на страницы на другой странице, такой как posts/postslug, эта будет легко выдавать ошибки. Поэтому вместо этого вы должны создать очень простую функцию в контроллере и выполнить запросы к этой странице.

Вот пример. Допустим, вы предоставляете данные с помощью следующего запроса:

$posts = Post::orderBy('created_at', 'desc')
->paginate(15, ["*"], 'sidebar')->withPath('postPaginator');

Функция, которая будет разбивать это на страницы, должна выглядеть примерно так:

public function postPaginator(){
$posts = Post::orderBy('created_at', 'desc')->paginate(15 , ["*"], 'sidebar');  
}

если вы хотите, чтобы этот pagiantor был гибким как для запросов ajax, так и для базовых запросов get, вы можете вернуть результат, например:

if($this->request->ajax()) {
      return [
          'posts' => view('ajax.sidebarindex', ['posts' => $posts])->render(),
          'next_page' => $posts->nextPageUrl(),
      ];
}

$posts->nextPageUrl() предназначен для предоставления ссылки на следующую страницу, чтобы вы могли назначить ее кнопке для следующей нумерации страниц.

0 голосов
/ 10 сентября 2018

можно!просто введите hint класс Request, и сервисный контейнер внедрит его во время выполнения. Затем вы можете получить доступ ко всем свойствам объекта запроса

use Illuminate\Http\Request;

class MyComposer 
{
    public function __construct(Request $request)
    {
        $this->request= $request;
    }

    function compose($view)
    {
        if($this->request->ajax()) {
          return [
            'posts' => view('ajax.index')->with(compact('posts'))->render(),
            'next_page' => $posts->nextPageUrl()
          ];
        }
    }

}

Обновление: Если вы не передаете его из контроллера в ваше представление, но объект $ category все еще используется в composer, вы получите ошибку.Чтобы избежать этого, вы можете либо удалить * и явно передать имена представлений тем представлениям, которые используют категорию, и создать еще одну декларацию с передачей имен тех представлений, которые этого не делают, поэтому вам понадобятся два составителя представлений

//these views use category
View::composer([ 'view1','view2'], 'App\Http\ViewComposers\MyComposerWithCategory' ); 


//these views don't
View::composer([ 'view3','view4'], 'App\Http\ViewComposers\MyComposerWithoutCategory' ); 

Или вы можете просто проверить, установлена ​​ли переменная $ category в операторе if

...