Я попытался сделать autocomplete в codeignter, используя код, который я получил с сайта. Но он не работает для меня. Кто-нибудь может найти проблему
Функция просмотра, которую я использовал, приведен ниже
<html> <head> <title>Autocomplete</title> <script src="<?php echo base_url().'js/jquery.autocomplete.js'?>"></script> <script src="<?php echo base_url().'js/jquery-1.6.4.js'?>"></script> <script type="text/javascript"> $(function() { $( "#username" ).autocomplete({ //the recipient text field with id #username source: function( request, response ) { $.ajax({ url: "http://localhost/autocomplete/index.php/autocontroller/search_username", dataType: "json", data: request, success: function(data){ if(data.response == 'true') { response(data.message); } } }); } }); }); </script> </head> <body> <h1>Autocomplete</h1> <input type="text" id="username" value="" /> </body> </html>
И контроллер, который я использовал, приведен ниже
<?php /* * To change this template, choose Tools | Templates * and open the template in the editor. */ /** * Description of autocontroller * * @author Sivam */ class autocontroller extends CI_Controller { public function __construct() { parent::__construct(); $this->load->helper(array('form', 'url')); $this->load->database(); } function index() { $this->load->view('autoview'); } function search_username() { $username = trim($this->input->get('term', TRUE)); //get term parameter sent via text field. Not sure how secure get() is $this->db->select('fname'); $this->db->from('users'); $this->db->like('fname', $username); $this->db->limit('5'); $query = $this->db->get(); if ($query->num_rows() > 0) { $data['response'] = 'true'; //If username exists set true $data['message'] = array(); foreach ($query->result() as $row) { $data['message'][] = array( 'label' => $row->fname, 'value' => $row->fname ); } } else { $data['response'] = 'false'; //Set false if user not valid } echo json_encode($data); } } ?>
Я не могу понять, почему вы используете
$data['message'][] = array( 'label' => $row->fname, 'value' => $row->fname );
Вы можете попробовать с помощью одномерного массива.
$data['message'] = array( 'label' => $row->fname, 'value' => $row->fname );
Я также использую автозаполнение, ссылаясь на это. http://www.jamipietila.fi/codeigniter-and-autocomplete-with-jquery/ Пожалуйста, попробуйте это … Его работы для меня .. Надеюсь, это сработает и для вас.
Это простой способ использования автозаполнения в codeigniter. Это сработало для меня.
Ввиду:
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script> <script type="text/javascript"> function lookup(inputString) { if(inputString.length == 0) { $('#suggestions').hide(); } else { $.post("<?php echo base_url() ?>your_controller/your_action/"+inputString, function(data){ if(data.length > 0) { $('#suggestions').show(); $('#autoSuggestionsList').html(data); } }); }
}
function fill(thisValue) { $('#id_input').val(thisValue); setTimeout("$('#suggestions').hide();", 200); } </script> <?php echo form_input('company_name', '', "id='id_input' autocomplete='off' onKeyUp='lookup(this.value)'") ?> <div id="suggestions"> <div class="autoSuggestionsList_l" id="autoSuggestionsList"></div> </div>
Здесь первая строка – это, конечно, вызов библиотеки jquery.
Далее мы имеем 2 функции. lookup () принимает вход пользователя, а затем вызывает соответствующий URL-адрес, который будет выполнять необходимый вызов базы данных.
Следующая функция fill () выгружает div, который будет содержать результирующий вывод.
Наконец, в представлении я добавил поле ввода текста, а также подключил функцию поиска, как только пользователь вводит ввод в поле. Ниже поля ввода у нас есть div, который покажет результат, если он есть. Этот div будет виден только тогда, когда вход пользователя даст результат.
В контроллере мы имеем:
function autocomplete($a) { $i = 0; $this->load->model('company'); $companyList = $this->company->get_companies($a); if(count($companyList) > 0): echo "<ul>"; foreach($companyList as $comp): echo "<li id='".$companyList[$i]['id']."'><a href='#'>".$companyList[$i]['name']."</a></li>"; $i++; endforeach; echo "</ul>"; endif; }
Здесь, в приведенной выше функции, он принимает название компании (или ее часть), а затем я вызываю функцию get_companies () со строкой. Эта функция вызовет вызов базы данных и вернет результат в виде массива.
В модели:
public function get_companies($name) { //$this->db->_compile_select(); $this->db->like('company_name', $name, 'after'); //$this->db->where('id', $name); $query = $this->db->get('companies'); //echo $this->db->last_query(); //echo $query->num_rows(); $companies = array(); $i = 0; if($query->num_rows() > 0) { foreach ($query->result() as $row) { $companies[$i]['id'] = $row->id; $companies[$i]['name'] = $row->company_name; $i++; } } //print_r($companies); return $companies; }
Эта выше функция выполняет вызов базы данных и возвращает 2D-массив, одним из которых является идентификатор, а другое – имя.