How to Load data using jQuery AJAX in Select2 – CodeIgniter 4
With the Select2 jQuery plugin, you can customize the default HTML select element.
It allows searching, multiple option selection, loading data using jQuery AJAX, etc.
In this tutorial, I show how you can load MySQL database data remotely using jQuery AJAX in the Select2 plugin in the CodeIgniter 4 project.
1. Database configuration
- Open
.env
file which is available at the project root.
NOTE – If dot (.) not added at the start then rename the file to .env.
- Remove # from start of database.default.hostname, database.default.database, database.default.username, database.default.password, and database.default.DBDriver.
- Update the configuration and save it.
database.default.hostname = 127.0.0.1 database.default.database = testdb database.default.username = root database.default.password = database.default.DBDriver = MySQLi
2. Enable CSRF
- Again open
.env
file. - Remove # from the start of the
app.CSRFProtection
,app.CSRFTokenName
,app.CSRFCookieName
,app.CSRFExpire
, andapp.CSRFRegenerate
. - I update the
app.CSRFTokenName
value with'csrf_hash_name'
. With this name read CSRF hash. You can update it with any other value. - If you don’t want to regenerate CSRF hash after each AJAX request then set
app.CSRFRegenerate = false
.
app.CSRFProtection = true app.CSRFTokenName = 'csrf_hash_name' app.CSRFCookieName = 'csrf_cookie_name' app.CSRFExpire = 7200 app.CSRFRegenerate = true # app.CSRFExcludeURIs = []
- Open
app/Config/Filters.php
file. - Uncomment in
'csrf'
in'before'
if commented.
// Always applied before every request public $globals = [ 'before' => [ //'honeypot' 'csrf', ], 'after' => [ 'toolbar', //'honeypot' ], ];
3. Create Table
- Create a new table
users
using migration.
php spark migrate:create create_users_table
- Now, navigate to
app/Database/Migrations/
folder from the project root. - Find a PHP file that ends with
create_users_table
and open it. - Define the table structure in the
up()
method. - Using the
down()
method deleteusers
table which calls when undoing migration.
<?php namespace App\Database\Migrations; use CodeIgniter\Database\Migration; class CreateUsersTable extends Migration { public function up() { $this->forge->addField([ 'id' => [ 'type' => 'INT', 'constraint' => 5, 'unsigned' => true, 'auto_increment' => true, ], 'name' => [ 'type' => 'VARCHAR', 'constraint' => '100', ], 'email' => [ 'type' => 'VARCHAR', 'constraint' => '100', ], 'city' => [ 'type' => 'VARCHAR', 'constraint' => '100', ], ]); $this->forge->addKey('id', true); $this->forge->createTable('users'); } //-------------------------------------------------------------------- public function down() { $this->forge->dropTable('users'); } }
- Run the migration –
php spark migrate
4. Download Select2
- Download the select2 plugin from here.
- Extract it in the
public/
folder at the root.
5. Model
- Create
Users.php
file inapp/Models/
folder. - Open the file.
- Specify table name
"users"
in$table
variable, primary key"id"
in$primaryKey
, Return type"array"
in$returnType
. - In
$allowedFields
Array specify field names –['name','email','city']
that can be set during insert and update.
Completed Code
<?php namespace App\Models; use CodeIgniter\Model; class Users extends Model { protected $table = 'users'; protected $primaryKey = 'id'; protected $returnType = 'array'; protected $allowedFields = ['name', 'email','city']; protected $useTimestamps = false; protected $validationRules = []; protected $validationMessages = []; protected $skipValidation = false; }
6. Route
- Open
app/Config/Routes.php
file. - Define 2 routes –
- /
- users/getUsers – It is used to load select2 data.
Completed Code
$routes->get('/', 'UsersController::index'); $routes->post('users/getUsers', 'UsersController::getUsers');
7. Controller
- Create
UsersController.php
file inapp/Controllers/
folder. - Open the file.
- Import
Users
Model. - Create 2 methods –
- index() – Load
index
view. - getUsers() – This method is use to handle select2 AJAX requests.
- index() – Load
Read POST values and assign to $postData
variable. Create $response
Array to store return response. Assign new CSRF token to $response['token']
.
If searchTerm
is not POST then fetch 5 records from the users
table otherwise fetch records from users
table where searchTerm
exists in the name
field.
Loop on the fetched records and initialize $data
Array with id
and text
keys. Assign $user['id']
to 'id'
key and $user['name']
to 'text'
key.
Assign $data
Array to $response['data']
.
Return $response
Array in JSON format.
Completed Code
<?php namespace App\Controllers; use App\Models\Users; class UsersController extends BaseController{ public function index(){ return view('index'); } public function getUsers(){ $request = service('request'); $postData = $request->getPost(); $response = array(); // Read new token and assign in $response['token'] $response['token'] = csrf_hash(); if(!isset($postData['searchTerm'])){ // Fetch record $users = new Users(); $userlist = $users->select('id,name') ->orderBy('name') ->findAll(5); }else{ $searchTerm = $postData['searchTerm']; // Fetch record $users = new Users(); $userlist = $users->select('id,name') ->like('name',$searchTerm) ->orderBy('name') ->findAll(5); } $data = array(); foreach($userlist as $user){ $data[] = array( "id" => $user['id'], "text" => $user['name'], ); } $response['data'] = $data; return $this->response->setJSON($response); } }
8. View
Create index.php
file in app/Views/
.
Create a hidden element to store CSRF token name specified in .env
file in the name
attribute and store CSRF hash in the value
attribute.
<input type="hidden" class="txt_csrfname" name="<?= csrf_token() ?>" value="<?= csrf_hash() ?>" />
Create a <select id='selUser' >
element.
Script –
Initialize select2 on #selUser
.
With 'ajax'
option load data.
Set url: "<?=site_url('users/getUsers')?>"
, type: "post"
, dataType: 'json'
.
Read CSRF Token name and hash from the hidden field and assign it to the csrfName
and csrfHash
.
Pass typed value and CSRF token as data.
Handle AJAX response with processResults
. Initialize results
with the response.data
and also, update CSRF token value – $('.txt_csrfname').val(response.token)
.
Completed Code
<!doctype html> <html> <head> <title>How to Load data using jQuery AJAX in Select2 – CodeIgniter 4</title> <!-- Select2 CSS --> <link rel="stylesheet" type="text/css" href="/select2/dist/css/select2.min.css"/> <!-- jQuery --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <!-- Select2 JS --> <script type="text/javascript" src="/select2/dist/js/select2.min.js"></script> </head> <body> <!-- CSRF token --> <input type="hidden" class="txt_csrfname" name="<?= csrf_token() ?>" value="<?= csrf_hash() ?>" /> <!-- Select Element --> <select id='selUser' style='width: 200px;'> <option value='0'>-- Select user --</option> </select> <!-- Script --> <script type='text/javascript'> $(document).ready(function(){ // Initialize select2 $("#selUser").select2({ ajax: { url: "<?=site_url('users/getUsers')?>", type: "post", dataType: 'json', delay: 250, data: function (params) { // CSRF Hash var csrfName = $('.txt_csrfname').attr('name'); // CSRF Token name var csrfHash = $('.txt_csrfname').val(); // CSRF hash return { searchTerm: params.term, // search term [csrfName]: csrfHash // CSRF Token }; }, processResults: function (response) { // Update CSRF Token $('.txt_csrfname').val(response.token); return { results: response.data }; }, cache: true } }); }); </script> </body> </html>
9. Run & Output
- Navigate to the project using Command Prompt if you are on Windows or terminal if you are on Mac or Linux, and
- Execute “php spark serve” command.
php spark serve
- Run
http://localhost:8080
in the web browser.
10. Conclusion
If the CSRF token is not enabled in your project then remove the CSRF token code from the controller and view.
I used LIMIT
to only fetch 5 records you can update its value or remove it according to your requirement.