Я работал над внедрением метода поиска в codeigniter, который использует функциональные возможности разбиения на страницы. Для этого потребовалось немного исследований, так как мы включаем фильтры, и пользователь может выбрать переменное количество фильтров, отбрасывая счет 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); }
МОДЕЛЬ:
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; }