2013-03-05 231 views
4

我有我的「服務器」表中的所有「服務器」列表在我的視圖中分頁返回。我一直在努力弄清楚如何進行排序(如果可能,請使用asc & desc)和篩選(在結果中搜索)工作。Laravel(3)分頁排序和篩選

這裏是我的控制器代碼:

$servers = Server::paginate(5); 
return View::make('servers.list') 
      ->with('game', '') 
      ->with('servers', $servers); 

這裏是我的排序視圖代碼:

<ul class="nav"> 
    <li class="active"><a href="#"><i class="icon-angle-down"></i>{{ Lang::line('servers.rank')->get() }}</a></li> 
    <li><a href="#">{{ Lang::line('servers.date')->get() }}</a></li> 
    <li><a href="#">{{ Lang::line('servers.language')->get() }}</a></li> 
    <li><a href="#">{{ Lang::line('servers.uptime')->get() }}</a></li> 
    <li>{{ HTML::link(URL::full() .'?sort=votes', Lang::line('servers.votes')->get()) }}  </li> 
</ul> 

我想爲通過簡單的錨鏈接進行排序並點擊投票或排名或日期將返回與該排序數據。點擊當前選中的同一排序錨點將顛倒排序的方向。

我也有一串「過濾器」選項,如類別和整數範圍,其當施加作爲過濾器之前選擇具有相同的排序將「過濾器」 /查詢的表,並返回結果。

是否所有這些可能與分頁類?如果不是,我可能會怎麼做呢?不太確定使用laravel的最佳方式。

回答

10

這是很容易在laravel感謝做偉大的分頁和輸入類。在你的看法試試這個:

示例View

盪滌視圖

<form action="" method="get" id="filter"> 

    Show <select name="game_id"> 
      <option value="">All</option> 
     <?php foreach ($games as $game):?> 
      <option value="<?=$game->id?>" <?=($game->id == Input::get('game_id')) ? 'selected="selected"' : null?>><?=$game->name?></option> 
     <?php endforeach;?> 
    </select> 

    Show <select name="server_id"> 
      <option value="">All</option> 
     <?php foreach ($servers as $server):?> 
      <option value="<?=$server->id?>" <?=($server->id == Input::get('server_id')) ? 'selected="selected"' : null?>><?=$server->name?></option> 
     <?php endforeach;?> 
    </select> 

    <input type="submit" value="Filter" rel="filter"> 

</form> 

<hr> 

<?php if (count($servers) > 0):?> 

    <?=$pagination?> 

    <table> 
     <tr> 
      <th><a href="<?=URL::to('servers?sort=id'.$querystr)?>">ID</a></th> 
      <th><a href="<?=URL::to('servers?sort=rank'.$querystr)?>">RANK</a></th> 
      <th><a href="<?=URL::to('servers?sort=date'.$querystr)?>">DATE</a></th> 
      <th><a href="<?=URL::to('servers?sort=language'.$querystr)?>">LANGUAGE</a></th> 
      <th><a href="<?=URL::to('servers?sort=uptime'.$querystr)?>">UP TIME</a></th> 
      <th><a href="<?=URL::to('servers?sort=votes'.$querystr)?>">VOTES</a></th> 
     </tr> 
     <tr> 
      <td> 
       ... 
      </td> 
     </tr> 
    </table> 

    <?=$pagination?> 

<?php else:?> 
    <h2>No results found.</h2> 
<?php endif;?> 

示例控制器

public function get_action() 
{ 
    // CACHE SORTING INPUTS 
    $allowed = array('rank', 'date', 'language', 'uptime', 'votes'); // add allowable columns to search on 
    $sort = in_array(Input::get('sort'), $allowed) ? Input::get('sort') : 'id'; // if user type in the url a column that doesnt exist app will default to id 
    $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; // default desc 

    $servers = Server::order_by($sort, $order); 

    // FILTERS 
    $game = null; 
    $server = null; 

    if (Input::has('game_id')) { 
     $servers = $servers->where('game_id', Input::get('game_id')); 
     $game = '&game_id='.Input::get('game_id'); 
    } 
    if (Input::has('server_id')) { 
     $servers = $servers->where('server_id', Input::get('server_id')); 
     $server = '&server_id='.Input::get('server_id'); 
    } 

    // PAGINATION 
    $servers = $servers->paginate(5); 

    $pagination = $servers->appends(
     array(
      'game_id'  => Input::get('game_id'), 
      'server_id' => Input::get('server_id'), 
      'sort'  => Input::get('sort'), 
      'order'  => Input::get('order') 
     ))->links(); 

    return View::make(servers.list)->with(
     array(
      'game'   => null, 
      'servers'  => $servers, 
      'pagination' => $pagination, 
      'querystr'  => '&order='.(Input::get('order') == 'asc' || null ? 'desc' : 'asc').$game.$server 
     )); 
} 
+0

感謝您抽出寶貴的時間來寫出了這一切,它非常有幫助和讚賞!只是想知道,如果您允許使用多個篩選器(例如多個篩選器),但用戶可以選擇使用哪個篩選器,那麼您將如何在控制器中處理這些篩選器?是否有更有效的方式比檢查每個類型是否有用戶輸入?也許像所有輸入項目的數組? – MCG 2013-03-06 01:59:59

+1

是的,我同意這很混亂。我清理了視圖。據我所知,你必須檢查用戶輸入,否則你會查詢你不想要的結果。最終,您可以在模型中構建很多這樣的內容,或者創建一個包裝類,以便您可以在其他地方使用它。包裝類是我想要做的,實際上可能有一個可用。 – dynamo 2013-03-06 17:38:28

+1

你稱之爲「簡單」? :) 我發現它在CakePHP中簡單得多,只需一行'Paginator-> sort('myField')'我希望Laravel也能這麼簡單! – Alvaro 2014-01-06 10:41:37