Laravel (3) Сортировка и фильтрация по страницам


У меня есть список всех "серверов" в моей таблице "серверы", возвращенный в моем представлении с разбиением на страницы. Я изо всех сил пытался понять, как заставить работать сортировку (asc и desc, если это возможно) и фильтрацию (поиск в результатах).

Вот мой код контроллера:

 $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>

Я хотел бы, чтобы сортировка производилась с помощью простых якорных ссылок, и нажатие на голоса, рейтинг или дату вернет данные с эта сортировка. Нажатие на тот же якорь сортировки, который выбран в данный момент, изменит направление сортировки.

У меня также есть куча опций "фильтра", таких как категории и целочисленные диапазоны, которые при применении будут "фильтровать"/искать в таблице и возвращать результаты с той же сортировкой, что и перед фильтром.

Возможно ли все/что-либо из этого с помощью класса разбиения на страницы? Если нет, то как я могу поступить в этом случае? Не совсем уверен, что лучший способ при использовании ларавель.

Author: MCG, 2013-03-05

1 answers

Это легко сделать в laravel благодаря отличной разбивке на страницы и классу ввода. Попробуйте сделать это в своих представлениях:

Пример Представления

Очищенный вид

<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
        ));
}
 12
Author: dynamo, 2013-03-06 20:40:25