我是codeigniter的新手。希望可以帮助解决codeigniter分页问题。
步骤1-3是okey,视图显示正确的信息。
我简化了以下代码: -
控制器:
$config['total_rows']=$this->invdata_model->getFilterData_numRows();
$config['base_url']=site_url('site/users_area') ;
$config['uri_segment'] = '3';
$config['per_page']=18;
$config['num_links']=4;
$this->pagination->initialize($config);
$data['records']=$this->invdata_model->getFilterData_Rows($config['per_page'],$this->uri->segment(3));
$data['rec_country']=$this->invdata_model->country();
$this->load->view('includes/header');
$this->load->view('users_area_view',$data);
$this->load->view('includes/footer');
模型:
$country = $this->input->post('country') ;
$this->db->select('stockno, bdlno, country,volton');
if (isset($country)) { $this->db->where_in('country',$country); }
$q=$this->db->get('inventory')->num_rows();
return $q ;
查看
<?php echo form_open('site/users_area');
echo $this->table->generate($records);
echo $this->pagination->create_links() ; ?>
<div class="gadget">
<?php echo form_submit('submit','Apply','class="button_form"'); ?>
</div>
$gadget['gadget_name']='country';
$gadget['gadget_rec']=$rec_country;
$this->load->view('gadget',$gadget);
</form>
查看小工具
<div class="gadget">
<?php
$gadget_name2=$gadget_name.'[]';
echo "<ul>";
foreach ($gadget_rec as $item) {
echo '<li >';
echo '<div id="sectionname">'.$item.'</div>';
echo '<div id="sectioninput"><input type="checkbox" name="'.$gadget_name2.'" value="'.$item.'"></div>' ;
echo '-';
echo "</li>";
}
echo "<ul>";
?>
</div>
谢谢。
答案 0 :(得分:1)
这听起来像是一个方法问题。为什么使用POST数据来过滤数据?分页库构建查询字符串以确定数据库查询结果的偏移量。为什么不能使用$ _GET而不是$ _POST?
我想可以将您的分页配置'base_url'设置为:
$this->load->helper('url');
$this->load->library('pagination');
$config['base_url'] = current_url().'?'.http_build_query($_POST);
$config['total_rows'] = 200;
$config['per_page'] = 20;
$this->pagination->initialize($config);
echo $this->pagination->create_links();
然后在你的控制器中,使用$ this-&gt; input-&gt; get_post(),而不是$ this-&gt; input-&gt; post()。这里要小心 - 将完整的后期数据直接传递到模型中进行处理是很安全的。最好使用CI的输入类来防止XSS攻击...
<强>更新强>
要使用CI的输入类,而不是直接使用$ _POST或$ _GET,我通常会将表单数据保存在各种类型的“命名空间”中,即:
<input type="text" name="search[criteria1]" />
<input type="text" name="search[criteria2]" />
<input type="text" name="search[criteria3]" />
然后,在你的控制器中:
...
public function some_resource()
{
$this->load->model('Some_model');
$search_criteria = $this->input->get_post('search');
if ($search_criteria)
{
// make sure here to remove any unsupported criteria
// (or in the model is usually a bit more modular, but
// it depends on how strictly you follow MVC)
$results = $this->Some_model->search($search_criteria);
}
else
{
// If no search criteria were given, return unfiltered results
$results = $this->Some_model->get_all();
}
$this->load->view('some_view', array(
'results' => $results,
'pagination_base' => current_url().'?'.http_build_query($search_criteria)
));
}
...
因为我指定了$ this-&gt; input-&gt; get_post (),所以它会首先检查查询字符串参数;如果它不存在,它将回退到发布数据。这将允许您在表单中使用POST,但仍然通过带有分页类的查询字符串传递相同的数据。但是,实际上表单应该使用GET方法,因为您将这些参数作为查询发送,而不是向服务器发送内容。只是我在这个细节上的$ .02。
答案 1 :(得分:0)
分页类使用GET请求,只需使用页面的记录偏移量修改URL。例如,第2页显示每页显示50条记录的列表为/ some / url / 50,第3页为/ some / url / 100。
你可以:
我认为#1可能是最好的选择。这是SEF,可以加入书签,并且整体上更清晰。
例如,您可以像平常一样使用表单,但也可以使用/ some / unique / url直接转到结果
然后每个分页链接将调用/ some / unique / url / 50,其中50是记录偏移量(分页类使用偏移而不是页码)。
答案 2 :(得分:0)
我建议您编辑:
$config['base_url']=site_url('site/users_area/arg1/arg2') ;
然后“$ _GET”它形成url或jst使用
$val1 = $this->uri->segment(3);
$val1 = $this->uri->segment(4);
并且还会更改您的uri_segment
$config['uri_segment'] = '3';to
$config['uri_segment'] = '5'.
取决于通过网址的argumnts数量