2010-12-16 30 views
0

我到处搜索和搜索,但我无法找到明确的答案在这个问题上。如何实施与Kohana 2.3.x分页搜索

我想做一个网页搜索和分页结果(并按标题排序)。

请参阅原型http://i55.tinypic.com/2dlrqbs.png

我想,如果一个用户指定为搜索条件“A”,包含“A”显示所有名称。我的问题是我怎样才能把导航链接的字符串:?name = a。

如果我不发回搜索条件,单击下一页将显示所有记录。

我看了很多帖子关于这个问题,我还不知道怎么办呢

控制器代码(草案)

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; 

} 

感谢

+0

你的代码应工作? AFAIR,分页会自动添加当前查询字符串。 – biakaveron 2010-12-16 13:41:19

回答

0

我设法使它工作。查看Kohana分页库,它只扩展GET参数和函数http_build_query。然后我改变了表单方法到GET。

工作代码:

控制器:

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; 

} 

查看

[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>'; 

>