Jumat, 06 Maret 2020

PBKK A - Tugas 7 - Mengatur Akses User

Nama: Ayu Mutiara Sari
NRP: 05111740000149

1. Pertama, buat database untuk menyimpan data user pada localhost/phpMyAdmin. untuk lebih mudahnya gunakan code sql dibawah ini:

 CREATE TABLE `users` (  
  `user_id` int(11) NOT NULL AUTO_INCREMENT,  
  `username` varchar(64) NOT NULL,  
  `password` varchar(255) NOT NULL,  
  `email` varchar(255) NOT NULL,  
  `full_name` varchar(255) NOT NULL,  
  `phone` varchar(20) NOT NULL,  
  `role` enum('admin','customer') NOT NULL DEFAULT 'customer',  
  `last_login` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,  
  `photo` varchar(64) NOT NULL DEFAULT 'user_no_image.jpg',  
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,  
  `is_active` tinyint(1) NOT NULL DEFAULT '0',  
  PRIMARY KEY (`user_id`)  
 );  
database tersebut berisi:
  •  user_id: untuk menyimpan id user
  •  username: untuk menyimpan username 
  •  password: untuk menyimpan password (dalam bentuk hash)
  •  email: untuk menyimpan email user
  •  full_name: untuk menyimpan nama lengkap user
  •  phone: untuk menyimpan nomer telepon
  •  role: untuk menyimpan status user (admin/customer)
  •  last_login: untuk menyimpan catatan riwayat login
  •  photo: untuk menyimpan foto user
  •  created_at: untuk menyimpan riwayat pembuatan akun
  •  is_active: untuk menyimpan status aktif atau tidaknya akun user
setelah itu masuk ke halaman insert untuk mengisi data user (akan digunakan untuk percobaan nantinya), contoh:

2. Selanjutnya, membuat model baru pada folder application/models/ dengan nama User_model.php lalu isi dengan kode berikut:
 <?php  
 class User_model extends CI_Model  
 {  
   private $_table = "users";  
   public function doLogin(){  
           $post = $this->input->post();  
     // cari user berdasarkan email dan username  
     $this->db->where('email', $post["email"])  
         ->or_where('username', $post["email"]);  
     $user = $this->db->get($this->_table)->row();  
     // jika user terdaftar  
     if($user){  
       // periksa password-nya  
       $isPasswordTrue = password_verify($post["password"], $user->password);  
       // periksa role-nya  
       $isAdmin = $user->role == "admin";  
       // jika password benar dan dia admin  
       if($isPasswordTrue && $isAdmin){   
         // login sukses yay!  
         $this->session->set_userdata(['user_logged' => $user]);  
         $this->_updateLastLogin($user->user_id);  
         return true;  
       }  
     }  
     // login gagal  
           return false;  
   }  
   public function isNotLogin(){  
     return $this->session->userdata('user_logged') === null;  
   }  
   private function _updateLastLogin($user_id){  
     $sql = "UPDATE {$this->_table} SET last_login=now() WHERE user_id={$user_id}";  
     $this->db->query($sql);  
   }  
 }  

Terdapat 3 method dalam model tersebut, yaitu:

1. method doLogin() untuk melakukan login
2. method isNotLogin() untuk mengecek status telah terlogin atau belum
3. method _updateLastLogin() untuk mengupdate waktu login terakhir

3. selanjutnya, membuat controller baru pada controllers/admin/ untuk login, beri nama Login.php dan isi dengan code berikut:
 <?php  
 class Login extends CI_Controller  
 {  
   public function __construct()  
   {  
     parent::__construct();  
     $this->load->model("user_model");  
     $this->load->library('form_validation');  
   }  
   public function index()  
   {  
     // jika form login disubmit  
     if($this->input->post()){  
       if($this->user_model->doLogin()) redirect(site_url('admin'));  
     }  
     // tampilkan halaman login  
     $this->load->view("admin/login_page.php");  
   }  
   public function logout()  
   {  
     // hancurkan semua sesi  
     $this->session->sess_destroy();  
     redirect(site_url('admin/login'));  
   }  
 }  

4. lal
u atur juga controller lain untuk meload method isNotLogin() untuk mengecek apakah user sudah login atau belum dengan menambahkan kode ini:

 $this->load->model("user_model");  
 if($this->user_model->isNotLogin()) redirect(site_url('admin/login'));  
pada controller/admin/Overview.php dan controller/admin/Product.php pada masing-masing fungsi  _construct sehingga terlihat seperti:

Overview.php
 <?php defined('BASEPATH') OR exit('No direct script access allowed');  
 class Overview extends CI_Controller {  
   public function __construct()  
   {  
           parent::__construct();  
           $this->load->model("user_model");  
           if($this->user_model->isNotLogin()) redirect(site_url('admin/login'));  
      }  
      public function index()  
      {  
     // load view admin/overview.php  
     $this->load->view("admin/overview");  
      }  
 }  


Product.php
 <?php  
 defined('BASEPATH') OR exit('No direct script access allowed');  
 class Products extends CI_Controller  
 {  
   public function __construct()  
   {  
     parent::__construct();  
     $this->load->model("product_model");  
     $this->load->library('form_validation');  
     $this->load->model("user_model");  
     if($this->user_model->isNotLogin()) redirect(site_url('admin/login'));  
   }  
   public function index()  
   {  
     $data["products"] = $this->product_model->getAll();  
     $this->load->view("admin/product/list", $data);  
   }  
   public function add()  
   {  
     $product = $this->product_model;  
     $validation = $this->form_validation;  
     $validation->set_rules($product->rules());  
     if ($validation->run()) {  
       $product->save();  
       $this->session->set_flashdata('success', 'Berhasil disimpan');  
     }  
     $this->load->view("admin/product/new_form");  
   }  
   public function edit($id = null)  
   {  
     if (!isset($id)) redirect('admin/products');  
     $product = $this->product_model;  
     $validation = $this->form_validation;  
     $validation->set_rules($product->rules());  
     if ($validation->run()) {  
       $product->update();  
       $this->session->set_flashdata('success', 'Berhasil disimpan');  
     }  
     $data["product"] = $product->getById($id);  
     if (!$data["product"]) show_404();  
     $this->load->view("admin/product/edit_form", $data);  
   }  
   public function delete($id=null)  
   {  
     if (!isset($id)) show_404();  
     if ($this->product_model->delete($id)) {  
       redirect(site_url('admin/products'));  
     }  
   }  
 }  


5. lalu, buat halaman view untuk login dengan nama login_page.php dan letakan pada folder application/views/admin/

login_page.php
 <!DOCTYPE html>  
 <html lang="en">  
 <head>  
   <meta charset="UTF-8">  
   <meta name="viewport" content="width=device-width, initial-scale=1.0">  
   <meta http-equiv="X-UA-Compatible" content="ie=edge">  
   <title>Login Admin</title>  
   <!-- Bootstrap core CSS-->  
   <link href="<?php echo base_url('assets/bootstrap/css/bootstrap.min.css') ?>" rel="stylesheet">  
 </head>  
 <body>  
   <div class="container">  
     <div class="row">  
       <div class="col-12 col-md-6 text-center mt-5 mx-auto p-4">  
         <h1 class="h2">Login Admin</h1>  
         <p class="lead">Silahkan masuk ke Panel Admin</p>  
       </div>  
     </div>  
     <div class="row">  
       <div class="col-12 col-md-5 mx-auto mt-5">  
         <form action="<?= site_url('admin/login') ?>" method="POST">  
           <div class="form-group">  
             <label for="email">Email</label>  
             <input type="text" class="form-control" name="email" placeholder="Pakai username juga bisa.." required />  
           </div>  
           <div class="form-group">  
             <label for="password">Password</label>  
             <input type="password" class="form-control" name="password" placeholder="Password.." required />  
           </div>  
           <div class="form-group">  
             <div class="d-flex justify-content-between">  
               <div class="custom-control custom-checkbox">  
                 <input type="checkbox" class="custom-control-input" name="rememberme" id="rememberme" />  
                 <label class="custom-control-label" for="rememberme"> Ingat Saya</label>  
               </div>  
               <a href="<?= site_url('reset_password') ?>">Lupa Password?</a>  
             </div>  
           </div>  
           <div class="form-group">  
             <input type="submit" class="btn btn-success w-100" value="Login" />  
           </div>  
         </form>  
       </div>  
     </div>  
   </div>  
 </body>  
 </html>  

6. setelah itu, buka file views/admin/_partials/modal.php untuk mengubah link logout dari kode ini:
 <a class="btn btn-primary" href="login.html">Logout</a>  

menjadi:
 <a class="btn btn-primary" href="<?= site_url('admin/login/logout') ?>">Logout</a>  

setelah semua langkah telah dilakukan maka buka halaman http://localhost/[nama folder]/index.php/admin/ untuk melihat apakah kamu akan diarahkan ke halaman login atau tidak. jika iya, maka autentikasi untuk halaman telah berhasil.

Hasil:
login awal

halaman awal setelah login
ketika akan logout

setelah logout





Kamis, 05 Maret 2020

PBKK A - Tugas 6 - Penanganan File Upload

Nama: Ayu Mutiara Sari
NRP: 05111740000149

1. Pada tutorial sebelumnya, saat menambahkan produk, file foto yang dihasilkan adalah berupa broken image. ketika ditelusuri ternyata foto berada pada direktori /upload/product/ untuk itu maka kita harus membuat direktori  /upload/product/ 

2. Ketika mengupload produk tanpa foto, foto akan terisi dengan default.jpg. kita dapat mendownload file default.jpg pada default.jpg dan menaruhnya pada direktori /upload/product/ maka akan terlihat sebagai berikut:



3. Tetapi untuk produk dengan foto masih belum bisa. maka kita perlu menambahkan fitur upload image.Buka file Product_model.php, kemudian tambahkan method _uploadImage() tepat di bawah method delete().
 private function _uploadImage()  
 {  
   $config['upload_path']     = './upload/product/';  
   $config['allowed_types']    = 'gif|jpg|png';  
   $config['file_name']      = $this->product_id;  
   $config['overwrite']               = true;  
   $config['max_size']       = 1024; // 1MB  
   // $config['max_width']      = 1024;  
   // $config['max_height']      = 768;  
   $this->load->library('upload', $config);  
   if ($this->upload->do_upload('image')) {  
     return $this->upload->data("file_name");  
   }  
   return "default.jpg";  
 }  

4. lalu, ubah method  save() dan update() menjadi seperti ini:
 public function save()  
   {  
     $post = $this->input->post();  
     $this->product_id = uniqid();  
     $this->name = $post["name"];  
     $this->price = $post["price"];  
     $this->image = $this->_uploadImage();  
     $this->description = $post["description"];  
     $this->db->insert($this->_table, $this);  
   }  
   public function update()  
   {  
     $post = $this->input->post();  
     $this->product_id = $post["id"];  
     $this->name = $post["name"];  
     $this->price = $post["price"];  
     if (!empty($_FILES["image"]["name"])) {  
       $this->image = $this->_uploadImage();  
     } else {  
       $this->image = $post["old_image"];  
     }  
     $this->description = $post["description"];  
     $this->db->update($this->_table, $this, array('product_id' => $post['id']));  
   }  

Maka, ketika produk baru ditambah dengan foto, akan terlihat seperti berikut:

5. ketika produk dihapus, file didalam folder tidak terhapus, untuk menghapus file yang sudah dihapus, perlu menambahkan method _deleteImage() pada Product_model.


 private function _deleteImage($id)  
 {  
   $product = $this->getById($id);  
   if ($product->image != "default.jpg") {  
        $filename = explode(".", $product->image)[0];  
           return array_map('unlink', glob(FCPATH."upload/product/$filename.*"));  
   }  
 }  

lalu, tambahkan code pada method delete() untuk memanggil method _deleteImage() sehingga menjadi seperti:
 public function delete($id)  
   {  
     $this->_deleteImage($id);  
     return $this->db->delete($this->_table, array("product_id" => $id));  
   }  

PBKK A - Tugas 5 - Mengenal Model dan CRUD

Nama: Ayu Mutiara Sari
NRP: 05111740000149

1. Untuk membuat CRUD, langkah pertama adalah membuat database, karena pada percobaan menggunakan localhost maka buat database pada localhost/phpmyadmin

2. Isi nama database lalu create table bernama product dan isi kolom dengan:

  1. product_id (Primary Key) bertipe string dengan panjang 64;
  2. name bertipe string dengan panjang 255.
  3. price bertipe integer.
  4. image bertipe string dengan panjang 255.
  5. description bertipe TEXT.

3. Setelah membuat database product, lakukan konfigurasi database pada config/database.php:
 $db['default'] = array(  
      'dsn'     => '',  
      'hostname' => 'localhost',  
      'username' => 'root',  
      'password' => '',  
      'database' => 'tokodagingku',  
      'dbdriver' => 'mysqli',  
      'dbprefix' => '',  
      'pconnect' => FALSE,  
      'db_debug' => (ENVIRONMENT !== 'production'),  
      'cache_on' => FALSE,  
      'cachedir' => '',  
      'char_set' => 'utf8',  
      'dbcollat' => 'utf8_general_ci',  
      'swap_pre' => '',  
      'encrypt' => FALSE,  
      'compress' => FALSE,  
      'stricton' => FALSE,  
      'failover' => array(),  
      'save_queries' => TRUE  
 );  

karena menggunakan localhost dengan XAMPP maka username menggunakan root dan password dikosongkan.
4. lalu lakukan konfigurasi pada config/autoload.php untuk meload library database dan session yang berguna untuk pengoperasian database dan login. ubah seperti berikut:
 $autoload['libraries'] = array('database', 'session');  

5. Langkah selanjutnya adalah membuat model untuk table, pertama buat file baru pada application/model/ dengan nama Product_model.php dan isi file tersebut dengan code ini
 <?php defined('BASEPATH') OR exit('No direct script access allowed');  
 class Product_model extends CI_Model  
 {  
   private $_table = "products";  
   public $product_id;  
   public $name;  
   public $price;  
   public $image = "default.jpg";  
   public $description;  
   public function rules()  
   {  
     return [  
       ['field' => 'name',  
       'label' => 'Name',  
       'rules' => 'required'],  
       ['field' => 'price',  
       'label' => 'Price',  
       'rules' => 'numeric'],  
       ['field' => 'description',  
       'label' => 'Description',  
       'rules' => 'required']  
     ];  
   }  
   public function getAll()  
   {  
     return $this->db->get($this->_table)->result();  
   }  
   public function getById($id)  
   {  
     return $this->db->get_where($this->_table, ["product_id" => $id])->row();  
   }  
   public function save()  
   {  
     $post = $this->input->post();  
     $this->product_id = uniqid();  
     $this->name = $post["name"];  
     $this->price = $post["price"];  
     $this->description = $post["description"];  
     return $this->db->insert($this->_table, $this);  
   }  
   public function update()  
   {  
     $post = $this->input->post();  
     $this->product_id = $post["id"];  
     $this->name = $post["name"];  
     $this->price = $post["price"];  
     $this->description = $post["description"];  
     return $this->db->update($this->_table, $this, array('product_id' => $post['id']));  
   }  
   public function delete($id)  
   {  
     return $this->db->delete($this->_table, array("product_id" => $id));  
   }  
 }  

6. Membuat controller untuk produk dengan membuat file pada application/controllers/admin/ dengan nama Products.php dan isikan dengan code berikut: 
 <?php  
 defined('BASEPATH') OR exit('No direct script access allowed');  
 class Products extends CI_Controller  
 {  
   public function __construct()  
   {  
     parent::__construct();  
     $this->load->model("product_model");  
     $this->load->library('form_validation');  
   }  
   public function index()  
   {  
     $data["products"] = $this->product_model->getAll();  
     $this->load->view("admin/product/list", $data);  
   }  
   public function add()  
   {  
     $product = $this->product_model;  
     $validation = $this->form_validation;  
     $validation->set_rules($product->rules());  
     if ($validation->run()) {  
       $product->save();  
       $this->session->set_flashdata('success', 'Berhasil disimpan');  
     }  
     $this->load->view("admin/product/new_form");  
   }  
   public function edit($id = null)  
   {  
     if (!isset($id)) redirect('admin/products');  
     $product = $this->product_model;  
     $validation = $this->form_validation;  
     $validation->set_rules($product->rules());  
     if ($validation->run()) {  
       $product->update();  
       $this->session->set_flashdata('success', 'Berhasil disimpan');  
     }  
     $data["product"] = $product->getById($id);  
     if (!$data["product"]) show_404();  
     $this->load->view("admin/product/edit_form", $data);  
   }  
   public function delete($id=null)  
   {  
     if (!isset($id)) show_404();  
     if ($this->product_model->delete($id)) {  
       redirect(site_url('admin/products'));  
     }  
   }  
 }  

terdapat 5 method dalam code tersebut:
1. _constructs() adalah method yang berguna untuk mengload model (product_model) dan library form_validation yang digunakan untuk menvalidasi method add() dan edit()
2. index() adalah method yang digunakan untuk mengambil data dari model
3. add() adalah method untuk menampilkan form add dan menyimpan data ke database
4. edit() adalah method untuk menampilkan form dan menyimpan data
5. delete() adalah method untuk menangani penghapusan data

7. Selanjutnya membuat tiga macam view, yaitu list.php untuk menampilkan data, new_form.php untuk menampilkan form tambah data, dan edit_form.php untuk menampilkan form edit data. view tersebut dibuat dalam direktori views/admin dengan nama product.

list.php
 <!DOCTYPE html>  
 <html lang="en">  
 <head>  
      <?php $this->load->view("admin/_partials/head.php") ?>  
 </head>  
 <body id="page-top">  
      <?php $this->load->view("admin/_partials/navbar.php") ?>  
      <div id="wrapper">  
           <?php $this->load->view("admin/_partials/sidebar.php") ?>  
           <div id="content-wrapper">  
                <div class="container-fluid">  
                     <?php $this->load->view("admin/_partials/breadcrumb.php") ?>  
                     <!-- DataTables -->  
                     <div class="card mb-3">  
                          <div class="card-header">  
                               <a href="<?php echo site_url('admin/products/add') ?>"><i class="fas fa-plus"></i> Add New</a>  
                          </div>  
                          <div class="card-body">  
                               <div class="table-responsive">  
                                    <table class="table table-hover" id="dataTable" width="100%" cellspacing="0">  
                                         <thead>  
                                              <tr>  
                                                   <th>Name</th>  
                                                   <th>Price</th>  
                                                   <th>Photo</th>  
                                                   <th>Description</th>  
                                                   <th>Action</th>  
                                              </tr>  
                                         </thead>  
                                         <tbody>  
                                              <?php foreach ($products as $product): ?>  
                                              <tr>  
                                                   <td width="150">  
                                                        <?php echo $product->name ?>  
                                                   </td>  
                                                   <td>  
                                                        <?php echo $product->price ?>  
                                                   </td>  
                                                   <td>  
                                                        <img src="<?php echo base_url('upload/product/'.$product->image) ?>" width="64" />  
                                                   </td>  
                                                   <td class="small">  
                                                        <?php echo substr($product->description, 0, 120) ?>...</td>  
                                                   <td width="250">  
                                                        <a href="<?php echo site_url('admin/products/edit/'.$product->product_id) ?>"  
                                                         class="btn btn-small"><i class="fas fa-edit"></i> Edit</a>  
                                                        <a onclick="deleteConfirm('<?php echo site_url('admin/products/delete/'.$product->product_id) ?>')"  
                                                         href="#!" class="btn btn-small text-danger"><i class="fas fa-trash"></i> Hapus</a>  
                                                   </td>  
                                              </tr>  
                                              <?php endforeach; ?>  
                                         </tbody>  
                                    </table>  
                               </div>  
                          </div>  
                     </div>  
                </div>  
                <!-- /.container-fluid -->  
                <!-- Sticky Footer -->  
                <?php $this->load->view("admin/_partials/footer.php") ?>  
           </div>  
           <!-- /.content-wrapper -->  
      </div>  
      <!-- /#wrapper -->  
      <?php $this->load->view("admin/_partials/scrolltop.php") ?>  
      <?php $this->load->view("admin/_partials/modal.php") ?>  
      <?php $this->load->view("admin/_partials/js.php") ?>  
 </body>  
 </html>  

new_form.php
 <!DOCTYPE html>  
 <html lang="en">  
 <head>  
      <?php $this->load->view("admin/_partials/head.php") ?>  
 </head>  
 <body id="page-top">  
      <?php $this->load->view("admin/_partials/navbar.php") ?>  
      <div id="wrapper">  
           <?php $this->load->view("admin/_partials/sidebar.php") ?>  
           <div id="content-wrapper">  
                <div class="container-fluid">  
                     <?php $this->load->view("admin/_partials/breadcrumb.php") ?>  
                     <?php if ($this->session->flashdata('success')): ?>  
                     <div class="alert alert-success" role="alert">  
                          <?php echo $this->session->flashdata('success'); ?>  
                     </div>  
                     <?php endif; ?>  
                     <div class="card mb-3">  
                          <div class="card-header">  
                               <a href="<?php echo site_url('admin/products/') ?>"><i class="fas fa-arrow-left"></i> Back</a>  
                          </div>  
                          <div class="card-body">  
                               <form action="<?php echo site_url('admin/products/add') ?>" method="post" enctype="multipart/form-data" >  
                                    <div class="form-group">  
                                         <label for="name">Name*</label>  
                                         <input class="form-control <?php echo form_error('name') ? 'is-invalid':'' ?>"  
                                          type="text" name="name" placeholder="Product name" />  
                                         <div class="invalid-feedback">  
                                              <?php echo form_error('name') ?>  
                                         </div>  
                                    </div>  
                                    <div class="form-group">  
                                         <label for="price">Price*</label>  
                                         <input class="form-control <?php echo form_error('price') ? 'is-invalid':'' ?>"  
                                          type="number" name="price" min="0" placeholder="Product price" />  
                                         <div class="invalid-feedback">  
                                              <?php echo form_error('price') ?>  
                                         </div>  
                                    </div>  
                                    <div class="form-group">  
                                         <label for="name">Photo</label>  
                                         <input class="form-control-file <?php echo form_error('price') ? 'is-invalid':'' ?>"  
                                          type="file" name="image" />  
                                         <div class="invalid-feedback">  
                                              <?php echo form_error('image') ?>  
                                         </div>  
                                    </div>  
                                    <div class="form-group">  
                                         <label for="name">Description*</label>  
                                         <textarea class="form-control <?php echo form_error('description') ? 'is-invalid':'' ?>"  
                                          name="description" placeholder="Product description..."></textarea>  
                                         <div class="invalid-feedback">  
                                              <?php echo form_error('description') ?>  
                                         </div>  
                                    </div>  
                                    <input class="btn btn-success" type="submit" name="btn" value="Save" />  
                               </form>  
                          </div>  
                          <div class="card-footer small text-muted">  
                               * required fields  
                          </div>  
                     </div>  
                     <!-- /.container-fluid -->  
                     <!-- Sticky Footer -->  
                     <?php $this->load->view("admin/_partials/footer.php") ?>  
                </div>  
                <!-- /.content-wrapper -->  
           </div>  
           <!-- /#wrapper -->  
           <?php $this->load->view("admin/_partials/scrolltop.php") ?>  
           <?php $this->load->view("admin/_partials/js.php") ?>  
 </body>  
 </html>  

edit_form.php
 <!DOCTYPE html>  
 <html lang="en">  
 <head>  
      <?php $this->load->view("admin/_partials/head.php") ?>  
 </head>  
 <body id="page-top">  
      <?php $this->load->view("admin/_partials/navbar.php") ?>  
      <div id="wrapper">  
           <?php $this->load->view("admin/_partials/sidebar.php") ?>  
           <div id="content-wrapper">  
                <div class="container-fluid">  
                     <?php $this->load->view("admin/_partials/breadcrumb.php") ?>  
                     <?php if ($this->session->flashdata('success')): ?>  
                     <div class="alert alert-success" role="alert">  
                          <?php echo $this->session->flashdata('success'); ?>  
                     </div>  
                     <?php endif; ?>  
                     <!-- Card -->  
                     <div class="card mb-3">  
                          <div class="card-header">  
                               <a href="<?php echo site_url('admin/products/') ?>"><i class="fas fa-arrow-left"></i>  
                                    Back</a>  
                          </div>  
                          <div class="card-body">  
                               <form action="" method="post" enctype="multipart/form-data">  
                               <!-- Note: atribut action dikosongkan, artinya action-nya akan diproses   
                                    oleh controller tempat vuew ini digunakan. Yakni index.php/admin/products/edit/ID --->  
                                    <input type="hidden" name="id" value="<?php echo $product->product_id?>" />  
                                    <div class="form-group">  
                                         <label for="name">Name*</label>  
                                         <input class="form-control <?php echo form_error('name') ? 'is-invalid':'' ?>"  
                                          type="text" name="name" placeholder="Product name" value="<?php echo $product->name ?>" />  
                                         <div class="invalid-feedback">  
                                              <?php echo form_error('name') ?>  
                                         </div>  
                                    </div>  
                                    <div class="form-group">  
                                         <label for="price">Price</label>  
                                         <input class="form-control <?php echo form_error('price') ? 'is-invalid':'' ?>"  
                                          type="number" name="price" min="0" placeholder="Product price" value="<?php echo $product->price ?>" />  
                                         <div class="invalid-feedback">  
                                              <?php echo form_error('price') ?>  
                                         </div>  
                                    </div>  
                                    <div class="form-group">  
                                         <label for="name">Photo</label>  
                                         <input class="form-control-file <?php echo form_error('image') ? 'is-invalid':'' ?>"  
                                          type="file" name="image" />  
                                         <input type="hidden" name="old_image" value="<?php echo $product->image ?>" />  
                                         <div class="invalid-feedback">  
                                              <?php echo form_error('image') ?>  
                                         </div>  
                                    </div>  
                                    <div class="form-group">  
                                         <label for="name">Description*</label>  
                                         <textarea class="form-control <?php echo form_error('description') ? 'is-invalid':'' ?>"  
                                          name="description" placeholder="Product description..."><?php echo $product->description ?></textarea>  
                                         <div class="invalid-feedback">  
                                              <?php echo form_error('description') ?>  
                                         </div>  
                                    </div>  
                                    <input class="btn btn-success" type="submit" name="btn" value="Save" />  
                               </form>  
                          </div>  
                          <div class="card-footer small text-muted">  
                               * required fields  
                          </div>  
                     </div>  
                     <!-- /.container-fluid -->  
                     <!-- Sticky Footer -->  
                     <?php $this->load->view("admin/_partials/footer.php") ?>  
                </div>  
                <!-- /.content-wrapper -->  
           </div>  
           <!-- /#wrapper -->  
           <?php $this->load->view("admin/_partials/scrolltop.php") ?>  
           <?php $this->load->view("admin/_partials/js.php") ?>  
 </body>  
 </html>  

8. Membuat fitur hapus data pada file list php dan tambahkan kode berikut pada bagian bawah sebelum </body>
 <script>  
 function deleteConfirm(url){  
      $('#btn-delete').attr('href', url);  
      $('#deleteModal').modal();  
 }  
 </script>  

Hasil:
List Produk

Tambah Produk
Produk Berhasil Ditambahkan

Hapus Produk