Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 28.02.2015 12:55:24

проблема со ссылками previous и next

я делаю вывод страниц по полю sef из БД, чтобы сразу были красивые урлы
но не получается нормально сделать на странице с одной новостью ссылки previous и next

в файле routes.php

Route::get('news', 'NewsController@getIndex'); / все новости
Route::get('news/{title}', 'NewsController@showpage'); / одна новость

попытался сделать так в контроллере NewsController

	public function showpage($title)  
	{
		$pages = Page::where('sef', '=', $title)->get();

			foreach ($pages as $page) // access user properties here
			{	
        		$previous = Page::where('id', '<', $page->id)->get()->first();
        		$next = Page::where('id', '>', $page->id)->get()->first();
			}

		return View::make('news.item')->withPages($pages)->with('previous', $previous)->with('next', $next);
	
	}

в шаблоне вывожу
<a href="{{ URL::to( 'news/' . $previous->sef ) }}">Previous</a>
<a href="{{ URL::to( 'news/' . $next->sef ) }}">Next</a>

почти работает, но есть 2 проблемы:
1) ссылка previous всегда ссылается на одну и ту же статью, у которой id = 1
2) на предпоследней странице ссылка next уже вызывает ошибку

Trying to get property of non-object (View: D:\OpenServer\domains\schel4ok.dev\app\views\news\item.blade.php)

Не в сети

#2 28.02.2015 13:24:30

Re: проблема со ссылками previous и next

вот так получилось немного лучше
$previous = Page::where('id', '=', $page->id-1)->get()->first();
$next = Page::where('id', '>', $page->id+1)->get()->first();

при этом обе ссылки работают как надо, только не отображается страница с максимальным id в БД. Видимо потому, что для неё не существует $next.
Надо как-то сделать обработку этого события

Не в сети

#3 28.02.2015 13:58:06

Re: проблема со ссылками previous и next

немного доработал

class NewsController extends BaseController {


	public function getIndex()  
	{
		$pages = Page::where('category_id', '=', 85) 
					->orderBy('created_at', 'desc')
					->paginate(10); // все новости по 10 штук на страницу

		return View::make('news.index')->withPages($pages);
	}

	public function showpage($title)  
	{
		$pages = Page::where('category_id', '=', 85)->where('sef', '=', $title)->get();

			foreach ($pages as $page) // access user properties here
			{	
        		$previous = Page::where('id', '=', $page->id - 1)->get()->first();
				$next = 	Page::where('id', '=', $page->id + 1)->get()->first();
			}

		return View::make('news.item')
					->withPages($pages)
					->withPrevious($previous)
					->withNext($next);
	
	}

}
<a href="{{ URL::to( 'news/' . $previous->sef ) }}">Previous</a>

@if (isset ($next))
<a href="{{ URL::to( 'news/' . $next->sef ) }}">Next</a>
@endif

Новостей на сайте немного, поэтому они хранятся в одной таблице с остальными страницами в отдельной категории id=85
При этом новости расположены в конце БД, поэтому последняя страница рушилась с ошибкой, которую я вылечил при помощи @if (isset ($next)).
Но вот проблему с $previous я пока решить не могу.
При нажатии на ссылку previous на странице с первой новостью я попадаю на страницу из другой категории, которая выдает ошибку Undefined variable: previous
И вот как убрать ссылку previous со страницы с первой новостью мне пока непонятно.

Не в сети

#4 28.02.2015 14:31:28

Re: проблема со ссылками previous и next

всё!!! разобрался

@if (isset($previous) and $previous->category_id === $page->category_id )
<a href="{{ URL::to( 'news/' . $previous->sef ) }}">Previous</a>
@endif

@if (isset($next) and $next->category_id === $page->category_id )
<a href="{{ URL::to( 'news/' . $next->sef ) }}">Next</a>
@endif

Не в сети

#5 28.02.2015 17:02:40

Re: проблема со ссылками previous и next

Костыль тут, костыль там...

Первый вариант самый годный. Хинт: orderBy() или min() max().

Не в сети

Подвал раздела