【问题标题】:Pagination in Laravel 4 works for one page. but not working for anotherLaravel 4 中的分页适用于一页。但不为另一个工作
【发布时间】:2013-07-29 11:21:00
【问题描述】:

我使用 sentry 从 GitHub 下载了 laravel 的入门工具包。

到目前为止一切都很好。博客页面有分页。我可以通过更改相同的 pagination(x) 值来更改每页的项目数。

现在的问题是,我自己手动创建了一个名为“搜索”的新页面,它显示搜索关键字的结果。

在这里我添加了相同的分页,它显示了提到的每页的项目数、页码、箭头。一切都很完美,但是当我单击第 2 页时,它显示一个空白页。空白页的页源也是空的。该 URL 非常适合第二页。它正确生成为

sitename.dev/search?page=2

请指导我哪里出错了。博客页面分页仍然可以正常工作。问题仅出现在新创建的 SEARCH 页面分页中。

这是我的控制器

public function postSearch()
{
    $searchString = Input::get('searchInput');

    $posts = Post::where('title', 'LIKE', '%' . $searchString . '%')->orderBy('created_at', 'DESC')->paginate(4);

    if($searchString){

    return View::make('frontend/search', compact('posts'))->with('success', 'Account successfully updated')->with('posts', $posts);
    }
    else{
        return Redirect::route('home')->with('error', 'Please enter Search Term');
    }

}

这是我的路线

Route::any('/search', 'BlogController@postSearch');

【问题讨论】:

    标签: php mysql pagination laravel laravel-4


    【解决方案1】:

    使用 GET 方法更好地搜索表单,因为它可以很容易地为 URL 添加书签/保存以供以后使用。在 Laravel 4 的分页中,有一个附加查询字符串的方法。因此,我们可以将搜索查询字符串保留在其他页面中。

    文档: http://laravel.com/docs/pagination#appending-to-pagination-links

    我的代码:

    搜索表单

    <form method="get" action="{{{ URL::to('lib/search') }}}">
    <input class="input-xxlarge" name="q" type="text" placeholder="Search...">
    <div class="control-group">
        <div class="controls">
            <input type="submit" class="btn" id="submit" value="Submit" />
        </div>
    </div>
    

    路由

    Route::get('lib/search', 'LibraryController@getSearch');
    

    控制器

    public function getSearch()
    {
        $search = Input::get('q');
    
        $posts = $this->post->where('title', 'like', '%'.$search.'%')->paginate(10);
    
        return View::make('site/libraries/list', compact('posts', 'search'));
    }   
    

    视图/刀片 At方法显示分页:

    {{ $posts->appends(array('q' => $search))->links() }}
    

    所以我们可以将 q=? 查询字符串保留在其他页面中(例如:/lib/search?page=2&q=apple)

    【讨论】:

    • 谢谢,这个答案对我有帮助,+1。但是在 Laravel 5.1 中,我在 View 中添加了 {!! $users-&gt;appends($filters)-&gt;render() !!} 而不是 -&gt;links(),在 Model 中添加了 $users-&gt;setPath('search');,在查询并将过滤器保存到 $filters 数组之后。
    【解决方案2】:

    首先

    return View::make('frontend/search', compact('posts'))->with('success', 'Account successfully updated')->with('posts', $posts);
    

    在执行compact 时,您已经将$posts 变量包含在视图中用作$posts,与使用with('posts', $posts) 完全相同。所以这个最后一个可以被删除。如果您想使用compact 加载更多变量,只需用逗号分隔变量名称即可。

    您正在对SearchPOST 操作中的项目进行分页,当您单击任何分页链接或调用page=2 时,您没有运行postSearch 方法,您可能正在调用@ 987654332@ 因为你现在没有做POST 请求。

    看看RESTful controllers

    【讨论】:

    • 好的,但是有没有办法在搜索的 Page1 中获取 &search=SEARCHTERM 呢?我已经从 Page2 得到它。 Page1 简单显示为 site.dev/search 如果用户将此链接加入书签,他们将不会得到结果
    • 通过 GET 方法发送表单
    • 将我的路由从“any”更改为“get”,在这种情况下我得到 Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException
    • 我的意思是你的表单方法来获取。阅读我在上面发布的链接。
    • {{ Form::open(array('url'=>'search', 'class' => 'form-search form-horizo​​ntal pull-right', 'id' => 'custom -search-form')) }} 这是我的表单代码。如何在表单方法中指定 GET。我是 Laravel 和 PHP 的新手。请不要误会我的意思
    【解决方案3】:

    需要检查的几件事。

    1. app/routes.php 文件中存在新路由。
    2. 您正在返回新路线的视图文件。
    3. 该视图文件具有分页输出。例如:&lt;?php echo $articles-&gt;links(); ?&gt;

    最终,似乎发生了某种错误,这就是页面呈现空白的原因。尝试在您的开发环境中打开 php 错误,然后看看会发生什么。

    【讨论】:

    • 问题出在 Get / Post 方法上。在我将其更改为适用于第 2 页的任何内容之后。但它显示了数据库中的所有结果。其中第一页特别显示仅搜索的关键字。据我所知,它将第一页作为 POST,但第二页被转换为 GET 方法
    【解决方案4】:

    appends 解决了我的问题。此外,使用附加功能将使我们的用户能够保存/收藏 URL 以供将来使用。

    但一个问题是,它没有附加结果的第一页。

    【讨论】:

      猜你喜欢
      • 2016-07-03
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多