2010-12-16 4 views
0

Ich googelte und suchte überall, aber ich konnte keine klare Antwort auf dieses Problem finden.Wie implementiert man eine Suche mit Paginierung mit Kohana 2.3.x

Ich versuche, eine Webseite zu suchen und paginieren das Ergebnis (und sortiert sie nach Kopfzeilen).

Bitte siehe Prototyp http://i55.tinypic.com/2dlrqbs.png

Ich möchte, dass, wenn ein Benutzer als Suchkriterium ‚a‘ angeben, werden alle Namen, die ‚a‘ gezeigt enthält. Mein Problem ist, wie kann ich die Navigationslinks die Zeichenfolge anlegen:? Name = a.

Wenn ich die Suchkriterien nicht zurücksende, werden auf der nächsten Seite alle Datensätze angezeigt.

las ich viel Post zu diesem Thema, und ich weiß noch nicht verstehen, wie es

-Controller-Code (Entwurf)

function listall() 
{ 
$limit = 2 ; 
$orderby = 'u.id'; 
$direction = 'asc'; 
$name = ''; 

if ($_POST) 
{ 
$name = $this->input->post('name'); 
} 

if ($_GET) 
{ 
$name = $this->input->post('name'); 
if ($this->input->get('orderby')) 
list($orderby, $direction) = explode(':', $this->input->get('orderby')); 
} 


$view = new view('character/listall'); 
$db = Database::instance(); 

$sql = "select c.id id, c.lastactiontime, c.name character_name, k.name kingdom_name, k.image kingdom_image, from_unixtime(u.last_login, '%d-%m-%y') last_login, u.nationality 
from characters c, kingdoms k, users u 
where 1=1 and 
c.kingdom_id = k.id and 
c.user_id = u.id 
" ; 
if ($name != '') 
$sql .= "and c.name like '%" . $name . "%'" ; 

$characters = $db->query($sql); 

//$characters = ORM::factory("character")->orderby($orderby, $direction)->find_all(); 

$this->pagination = new Pagination(array(
'base_url'=>'character/listall', 
'uri_segment'=>'listall', 
'style'=>'digg', 
'query_string' => 'page', 
'total_items'=>$characters->count(), 
'items_per_page'=>$limit)); 

//$characters = ORM::factory("character")->orderby($orderby, $direction)->find_all($limit, $this->pagination->sql_offset); 

$sql .= " order by $orderby $direction "; 
$sql .= " limit $limit offset " . $this->pagination->sql_offset ; 

kohana::log('debug', $sql); 

$characters = $db->query($sql); 

$playersinfo = Character_Model::getplayersinfo(); 

$view->playersinfo = $playersinfo; 
$view->pagination = $this->pagination; 
$view->characters = $characters; 
$this->template->content = $view; 

} 

Dank

+0

sollte Ihr Code arbeiten?. AFAIR, Paginierung fügt automatisch die aktuelle Abfragezeichenfolge hinzu. – biakaveron

Antwort

0

ich es machen geschaffen zu tun Arbeit. Wenn Sie Kohana Pagination-Bibliotheken betrachten, werden nur die GET-Parameter mit der Funktion http_build_query erweitert. Ich habe dann die Formularmethode zu GET geändert.

Arbeitscode:

Controller:

function listall() 
{ 
    $limit = 25 ; 
    $orderby = 'u.id'; 
    $direction = 'asc'; 
    $name = ''; 
    $query_string= ''; 


    if ($_GET) 
    { 
     $name = $this->input->get('name'); 
     $online = $this->input->get('online'); 

     if ($this->input->get('orderby')) 
      list($orderby, $direction) = explode(':', $this->input->get('orderby')); 
    } 

    kohana::log('debug', kohana::debug($_GET)); 

    $view = new view('character/listall'); 
    $db = Database::instance(); 

    $sql = "select c.id id, c.lastactiontime, c.name character_name, k.name kingdom_name, 
     k.image kingdom_image, from_unixtime(u.last_login, '%d-%m-%y') last_login, u.nationality 
    from characters c, kingdoms k, users u 
    where 1=1 and 
    c.kingdom_id = k.id and 
    c.user_id = u.id 
    " ; 

    $criteria = kohana::lang('global.criteria'); 

    if ($name != '') 
    { 
     $sql .= " and c.name like '%" . $name . "%' " ; 
     $criteria .= kohana::lang('global.name') . ' ' . kohana::lang('global.contains') . ' ' . $name . ' ' ; 
    } 
    if ($online) 
    { 
     $sql .= " and c.lastactiontime > (unix_timestamp() - 15 * 60) " ; 
     $criteria .= kohana::lang('global.online') . ' = true' ; 
    } 

    if (!$online and $name == '') 
     $criteria .= kohana::lang('global.allrecords') ; 

    $characters = $db->query($sql); 

    //$characters = ORM::factory("character")->orderby($orderby, $direction)->find_all(); 

    $this->pagination = new Pagination(array(
     'base_url'=>'character/listall', 
     'uri_segment'=>'listall', 
     'style'=>'digg', 
     'query_string' => 'page', 
     'total_items'=>$characters->count(), 
     'items_per_page'=>$limit));    

    //$characters = ORM::factory("character")->orderby($orderby, $direction)->find_all($limit, $this->pagination->sql_offset);   

    $sql .= " order by $orderby $direction "; 
    $sql .= " limit $limit offset " . $this->pagination->sql_offset ; 

    kohana::log('debug', $sql); 

    $characters = $db->query($sql); 

    $playersinfo = Character_Model::getplayersinfo(); 

    $view->playersinfo = $playersinfo;  
    $view->pagination = $this->pagination; 
    $view->characters = $characters; 
    $view->criteria = $criteria ; 
    $this->template->content = $view; 

} 

Ansicht

[cut] 

<?php 
echo form::open('/character/listall', array('method' => 'get')); 
echo form::label(kohana::lang('global.name')) . '&nbsp;' . form::input(array('id' => 'name', 'name' => 'name', 'style' => 'width:200px')); 
echo '&nbsp;&nbsp;'; 
echo form::label(kohana::lang('global.online')) . '&nbsp;' . form::checkbox('online', true); 
echo "<div style='float:right'>"; 
echo form::submit(array('id' => 'submit', 'class' => 'submit', 'value' => kohana::lang('global.search'))); 
echo form::submit(array('id' => 'reset', 'class' => 'submit', 'value' => kohana::lang ('global.reset'))); 
echo "</div>"; 
echo form::close(); 
echo '<br/>'; 
echo '<b>' . $criteria .'</b>'; 

>