我一直致力于在codeigniter中实现一个使用codeigniters分页功能的搜索方法。 这需要进行一些研究,因为我们包括过滤器,用户可以选择可变数量的过滤器, 抛弃uri_segment计数。我在下面有一个工作解决方案(只发布了我认为与理解相关的代码 这个过程不要混淆。如果我错过任何让我知道的事情,如果他们遇到同样的事情就会让某人开始 问题,但想问几个问题:
问题:
是否有更好,更有效的方法可以对过滤后的搜索结果进行分页?
有没有人会改进这种方法?
如何在初始发布后在用户的浏览器中显示当前的uri?分页库的运行方式 在通过生成的链接单击之前,它不会显示“first_url”。我正在折腾一个重定向的想法,但是 我想在走这条路之前得到反馈。
查看
<!-- SEARCH FILTERS -->
<form action="/account/classified/browse" method="post" id="searchForm">
<p>Search
<br/>
<input type="text" name="phrase" id="searchString" value="<?php echo $selectedPhrase; ?>"/></p>
<p>Type<br/>
<?php echo form_dropdown('type', $types, $selectedType); ?>
</p>
<p>County<br/>
<?php echo form_dropdown('location', $locations, $selectedLocation); ?>
</p>
<p>Market<br/>
<?php echo form_dropdown('market', $markets, $selectedMarket); ?>
</p>
<p>
<input type="submit" id="searchClassifiedButton" name="" value="Search"/>
</p>
</form>
<table>
<?
/*
Results returned
*/
if (count($classifieds) > 0) {
foreach ($classifieds as $classified) {
echo '<tr>';
//rows returned from query using search filters
echo '</tr>';
}
} else {
echo 'There are no classifieds posted at this time';
}
?>
</table>
控制器:
<?
public function browse() {
$this -> load -> helper("url");
$this -> load -> library("pagination");
$this -> load -> model('classified_model');
$post = $this -> input -> post();
/*
Here we determine if the post array contains values. If it does, then we know that the
user has clicked the search button and wishs to view results by different filters.
If the post array is empty, but the uri segment contains values, this would mean that we
are viewing listings narrowed by the search filters.
If the post array is empty as well as the uri segment, then we are viewing all results
with no filters applied.
*/
if ($post) {
foreach ($post as $key => $val) {
if ($val != '') {
$filters[$key] = $val;
}
}
} elseif ($this -> uri -> uri_to_assoc(4)) {
$filters = $this -> uri -> uri_to_assoc(4);
} else {
$filters = array();
}
/*
Here we create the config array for the pagination.
We assign 'first_url' so that the first generated paginated link will contain the uri filter
When filters array is not empty we assign 'suffix' so that the uri segment can be appended to the link AFTER the page offest
*/
$pageConfig = array();
$pageConfig['first_url'] = !empty($filters) ? '/account/classified/browse/0/' . $this -> uri -> assoc_to_uri($filters) : '/account/classified/browse/0';
$pageConfig["suffix"] = !empty($filters) ? '/' . $this -> uri -> assoc_to_uri($filters) : '';
$pageConfig["base_url"] = "/account/classified/browse/";
$pageConfig["per_page"] = 15;
$pageConfig["uri_segment"] = 3;
$pageConfig["total_rows"] = $this -> classified_model -> approved_classifieds_count($filters);
$this -> pagination -> initialize($pageConfig);
$page = ($this -> uri -> segment(3)) ? $this -> uri -> segment(3) : 0;
$data['classifieds'] = $this -> classified_model -> approved_classifieds($filters, $pageConfig["per_page"], $page);
$data['links'] = $this -> pagination -> create_links();
//PHRASE
$data['selectedPhrase'] = (isset($filters['phrase'])) ? $filters['phrase'] : '';
//TYPES
$returnTypes = array('' => '-- View All --');
foreach($this->classified_model->classified_search_types() as $type){
$returnTypes[$type->id] = $type->name;
}
$data['types'] = $returnTypes;
$data['selectedType'] = (isset($filters['type'])) ? $filters['type'] : '';
//MARKETS
$returnMarkets = array('' => '-- View All --');
foreach($this->classified_model->market_types() as $market){
$returnMarkets[$market->id] = $market->name;
}
$data['markets'] = $returnMarkets;
$data['selectedMarket'] = (isset($filters['market'])) ? $filters['market'] : '';
//COUNTIES
$returnLocations = array('' => '-- View All --');
foreach($this->classified_model->locations() as $key => $val){
$returnLocations[$key] = $val;
}
$data['locations'] = $returnLocations;
$data['selectedLocation'] = (isset($filters['location'])) ? $filters['location'] : '';
//using phil sturgeon's template library
$this -> template -> build('browse_classified', $data);
}
MODEL:
public function classified_search_types(){
$q = $this->db->query("SELECT * FROM classified_types");
return $q->result();
}
public function market_types(){
$query = $this -> db -> get('market_types');
return $query -> result();
}
public function locations(){
$query = $this -> db -> get('locations');
return $query -> result();
}
public function approved_classifieds_count($filters){
$result = $this->search($filters);
return $result->num_rows();
}
public function approved_classifieds($filters, $limit, $start) {
$result = $this->search($filters, $limit, $start);
return $result->result();
}
function search($filters, $limit='', $start=''){
$this->load->helper('security');
/*
Obtain values from filters array, set to '' if value not in array
*/
$phrase = xss_clean((isset($filters['phrase'])) ? $filters['phrase'] : '');
$type = xss_clean((isset($filters['type'])) ? $filters['type'] : '');
$market = xss_clean((isset($filters['market'])) ? $filters['market'] : '');
$location = xss_clean((isset($filters['location'])) ? $filters['location'] : '');
/*
QUERY LOGIC
*/
$q = $this->db->query($query);
return $q;
}