Properti Input

Seme Framework memiliki properti untuk menerima atau memproses hasil pengiriman nilai melalui $_POST, $_GET, dan $_REQUEST. Properti ini berisikan object dari kelas SENE_Input.

Metode SENE_Input::post()

Metode SENE_Input::post() akan menerima isi nilai dari tag form HTML dengan atribut method berisikan post dan atribut enctype berisikan multipart/form-data.

Berikut ini adalah bentuk umum dari metode SENE_Input::post().

SENE_Input::post($keyname, $default_value=0): mixed

Parameter

Metode SENE_Input::post terdiri atas 2 parameter yaitu $keyname dan $default_value.

Parameter $keyname wajib diisi dan harus sesuai dengan isi dari atribut name yang ada dalam tag input, select, dan komponen form html lainnya.

Sementara parameter $default_value tidak wajib diisi.

Contoh Kode

Berikut ini adalah contoh potongan kode HTML form.

...
<form method="post" enctype="multipart/form-data">
<input type="text" name="nama" />
<select name="gender">
<option value="1">Pria</option>
<option value="0">Wanita</option>
</select>
</form>
...

Berikut ini adalah contoh kode di Controller Seme Framework.

<?php
class Home extends SENE_Controller{
  public function __construct(){
    parent::__construct();
  }
  public function index(){
    $nama = $this->input->post('nama'); // disesuaikan dengan tag input untuk atribut name="nama"
    $gender = $this->input->post('gender'); // disesuaikan dengan tag select untuk atribut name="gender"
    ...
  }
}

Metode SENE_Input::get()

Metode SENE_Input::get() akan menerima isi nilai dari tag form HTML dengan atribut method berisikan get. Metode ini juga akan menerima input GET, yang dilewatkan melalui alamat URL.

Berikut ini adalah bentuk umum dari metode SENE_Input::get().

SENE_Input::get($keyname, $default_value=0): mixed

Parameter

Metode SENE_Input::get terdiri atas 2 parameter yaitu $keyname dan $default_value.

Parameter $keyname wajib diisi dan harus sesuai dengan isi dari atribut name yang ada dalam tag input, select, dan komponen form html lainnya.

Sementara parameter $default_value tidak wajib diisi.

Contoh Kode melalui FORM

Berikut ini adalah contoh potongan kode HTML form.

...
<form method="get">
<input type="text" name="nama" />
<select name="gender">
<option value="1">Pria</option>
<option value="0">Wanita</option>
</select>
</form>
...

Berikut ini adalah contoh kode di Controller Seme Framework.

<?php
class Home extends SENE_Controller{
  public function __construct(){
    parent::__construct();
  }
  public function index(){
    $nama = $this->input->get('nama'); // disesuaikan dengan tag input untuk atribut name="nama"
    $gender = $this->input->get('gender'); // disesuaikan dengan tag select untuk atribut name="gender"
    ...
  }
}

Contoh Kode melalui URL

Berikut ini adalah alamat URL, dengan https://example.com/ sebagai BASE_URL.

https://example.com/login/proses/?username=RuliWidura1&password=123456

Berikut ini adalah contoh kode di Controller Seme Framework.

<?php
class Login extends SENE_Controller{
  public function __construct(){
    parent::__construct();
  }
  ...
  public function proses(){
    $username = $this->input->get('username'); // didapatkan dari parameter URL username
    $password = $this->input->get('password'); // didapatkan dari parameter URL password
    ...
  }
}

Metode SENE_Input::request()

Metode SENE_Input::request() akan menerima isi nilai baik dari metode GET maupun POST. Jadi, metode ini mengizinkan untuk memproses input baik dari proses pengiriman FORM maupun URL.

Berikut ini adalah bentuk umum dari metode SENE_Input::request().

SENE_Input::request($keyname, $default_value=0): mixed

Parameter

Metode SENE_Input::request terdiri atas 2 parameter yaitu $keyname dan $default_value.

Parameter $keyname wajib diisi dan harus sesuai dengan isi dari atribut name yang ada dalam tag input, select, dan komponen form html lainnya.

Sementara parameter $default_value tidak wajib diisi.

Contoh Kode

Berikut ini adalah contoh potongan kode HTML form.

...
<form action="<?=base_url()?>produk/review/?id=96" method="post" enctype="multipart/form-data">
<input type="text" name="review" />
<select name="like">
<option value="1">Like</option>
<option value="0">Dislike</option>
</select>
</form>
...

Berikut ini adalah contoh kode di Controller Seme Framework.

<?php
class Produk extends SENE_Controller{
  public function __construct(){
    parent::__construct();
  }
  ...
  public function review(){
    $id = $this->input->request('id'); // nilai yang dikirim melalui parameter URL / GET
    $review = $this->input->get('nama'); // nilai yang dikirim dari atribut name="review" melalui POST
    $rating = $this->input->get('gender'); // nilai yang dikirim dari atribut name="gender" melalui POST
    ...
  }
}

Menangani Upload File ($_FILES)

Untuk menangani $_FILES Anda harus membuatnya secara manual sesuai dengan kebutuhan aplikasi Anda.

Ngoding untuk penanganan upload FILE

Pertama-tama kita harus membuat metode __uploadImage() secara private, supaya tidak bisa diakses langsung melalui rute default Seme Framework. Berikut ini adalah contoh potongan kode untuk pembuatan metode __uploadImage() di Controller.

<?php
class Produk extends SENE_Controller{
  public function __construct(){
    parent::__construct();
  }
  ...
  /**
  * Method for handling file upload
  * Only allowed .png, .jpeg, .jpg, .gif extension
  * Max file size 2000000 bytes
  * Unsupported WebP encoding image
  * @param       string $keyname           the $_FILES key that send from html
  * @param       string $id                the id of user, product, or uniqid
  * @param       string $ke                sequencer
  * @constructor
  * @return      object                    result with object, contain status, message, image, and thumb.
  */
  private function __uploadImage($keyname, $id, $ke="")
  {
    $sc = new stdClass();
    $sc->status = 500;
    $sc->message = 'Error';
    $sc->image = '';
    $sc->thumb = '';
    if (isset($_FILES[$keyname]['name'])) {
      if ($_FILES[$keyname]['size']>2000000) {
        $sc->status = 301;
        $sc->message = 'Ukuran gambar terlalu besar. Silakan pilih dengan ukuran kurang dari 2 MB';
        $this->seme_log->write('User::__uploadImagex -- forceClose '.$sc->status.' '.$sc->message);
        return $sc;
      }
      $filenames = pathinfo($_FILES[$keyname]['name']);
      if (isset($filenames['extension'])) {
        $fileext = strtolower($filenames['extension']);
      } else {
        $fileext = 'jpg';
      }

      if (!in_array($fileext, array("jpg","png","jpeg","gif"))) {
        $sc->status = 303;
        $sc->message = 'Invalid file extension, please try other image file.';
        $this->seme_log->write('User::__uploadImagex -- forceClose '.$sc->status.' '.$sc->message);
        return $sc;
      }
      $filename = "$id-$ke";
      $filethumb = $filename.'-thumb';

      $targetdir = 'media/upload/';
      $targetdircheck = realpath(SEMEROOT.$targetdir);
      if (empty($targetdircheck)) {
        if (PHP_OS == "WINNT") {
          if (!is_dir(SEMEROOT.$targetdir)) {
            mkdir(SEMEROOT.$targetdir);
          }
        } else {
          if (!is_dir(SEMEROOT.$targetdir)) {
            mkdir(SEMEROOT.$targetdir, 0775);
          }
        }
      }

      $tahun = date("Y");
      $targetdir = $targetdir.DIRECTORY_SEPARATOR.$tahun;
      $targetdircheck = realpath(SEMEROOT.$targetdir);
      if (empty($targetdircheck)) {
        if (PHP_OS == "WINNT") {
          if (!is_dir(SEMEROOT.$targetdir)) {
            mkdir(SEMEROOT.$targetdir);
          }
        } else {
          if (!is_dir(SEMEROOT.$targetdir)) {
            mkdir(SEMEROOT.$targetdir, 0775);
          }
        }
      }

      $bulan = date("m");
      $targetdir = $targetdir.DIRECTORY_SEPARATOR.$bulan;
      $targetdircheck = realpath(SEMEROOT.$targetdir);
      if (empty($targetdircheck)) {
        if (PHP_OS == "WINNT") {
          if (!is_dir(SEMEROOT.$targetdir)) {
            mkdir(SEMEROOT.$targetdir);
          }
        } else {
          if (!is_dir(SEMEROOT.$targetdir)) {
            mkdir(SEMEROOT.$targetdir, 0775);
          }
        }
      }

      $sc->status = 998;
      $sc->message = 'Invalid file extension uploaded';
      if (in_array($fileext, array("gif", "jpg", "png","jpeg"))) {
        $filecheck = SEMEROOT.$targetdir.DIRECTORY_SEPARATOR.$filename.'.'.$fileext;
        if (file_exists($filecheck)) {
          unlink($filecheck);
          $rand = rand(0, 999);
          $filename = "$id-$ke-".$rand;
          $filecheck = SEMEROOT.$targetdir.DIRECTORY_SEPARATOR.$filename.'.'.$fileext;
          if (file_exists($filecheck)) {
            unlink($filecheck);
            $rand = rand(1000, 99999);
            $filename = "$id-$ke-".$rand;
          }
        }
        $filethumb = $filename."-thumb.".$fileext;
        $filename = $filename.".".$fileext;

        move_uploaded_file($_FILES[$keyname]['tmp_name'], SEMEROOT.$targetdir.DIRECTORY_SEPARATOR.$filename);
        if (is_file(SEMEROOT.$targetdir.DIRECTORY_SEPARATOR.$filename) && file_exists(SEMEROOT.$targetdir.DIRECTORY_SEPARATOR.$filename)) {
          if (@mime_content_type(SEMEROOT.$targetdir.DIRECTORY_SEPARATOR.$filename) == 'image/webp') {
            $sc->status = 302;
            $sc->message = 'WebP image format currently unsupported';
            $this->seme_log->write('User::__uploadImagex -- forceClose '.$sc->status.' '.$sc->message);
            return $sc;
          }

          $this->lib("wideimage/WideImage", 'wideimage', "inc");
          if (file_exists(SEMEROOT.$targetdir.DIRECTORY_SEPARATOR.$filethumb) && is_file(SEMEROOT.$targetdir.DIRECTORY_SEPARATOR.$filethumb)) {
            unlink(SEMEROOT.$targetdir.DIRECTORY_SEPARATOR.$filethumb);
          }
          if (file_exists(SEMEROOT.$targetdir.DIRECTORY_SEPARATOR.$filename) && is_file(SEMEROOT.$targetdir.DIRECTORY_SEPARATOR.$filename)) {
            WideImage::load(SEMEROOT.$targetdir.DIRECTORY_SEPARATOR.$filename)->reSize(370)->saveToFile(SEMEROOT.$targetdir.DIRECTORY_SEPARATOR.$filethumb);
            $sc->status = 200;
            $sc->message = 'Successful';
            $sc->thumb = str_replace("//", "/", $targetdir.'/'.$filethumb);
            $sc->image = str_replace("'\'", "/", $targetdir.'/'.$filename);
            $sc->image = str_replace("//", "/", $targetdir.'/'.$filename);
          } else {
            $sc->status = 997;
            $sc->message = 'Failed: file image not exists';
            $this->seme_log->write('User::__uploadImagex -- forceClose '.$sc->status.' '.$sc->message);
          }
        } else {
          $sc->status = 999;
          $sc->message = 'Upload file failed';
          $this->seme_log->write('User::__uploadImagex -- forceClose '.$sc->status.' '.$sc->message);
        }
      } else {
        $sc->status = 998;
        $sc->message = 'Invalid file extension uploaded';
        $this->seme_log->write('User::__uploadImagex -- forceClose '.$sc->status.' '.$sc->message);
      }
    } else {
      $sc->status = 988;
      $sc->message = 'Keyname file does not exists';
      $this->seme_log->write('User::__uploadImagex -- forceClose '.$sc->status.' '.$sc->message);
    }
    return $sc;
  }
  ...
}

Penggunaan Kode Pustaka (Library)

Berikut ini adalah daftar pustaka yang digunakan oleh potongan kode diatas:

  • Library/Seme_Log
  • Library/WideImage
  • Direktori media/upload/ dengan hak akses write sehingga web server dapat memindahkan file yang diupload kedalam susunan direktori Seme Framework.
public function __construct(){
  parent:: __construct();
  $this->lib("seme_log");
}

Cara Penggunaan Kode Penanganan Upload File

Berikut ini adalah contoh penggunaan kode didalam sebuah metode yang ada di kelas Controller.

...
// mengeksekusi metode __uploadImage()
$sc = $this->__uploadImage("foto",$id,"1");
// variabel $sc berisikan objek
// jika tidak berisikan objek, maka proses penanganan upload file gagal

// validasi bahwa $sc ini berisi objek, untuk menghindari ketika validasi error
if(!is_object($sc)) $sc = new stdClass();

// validasi bahwa $sc berisikan objek $status, untuk menghindari ketika validasi error
if(!isset($sc->status)) $sc->status=0;

// validasi bahwa $sc berisikan objek $message, untuk menghindari ketika validasi error
if(!isset($sc->message)) $sc->message='no response from upload processor';

//validasi terakhir error tidaknya
if($sc->status == 200){
  //berhasil diupload
  ....
}else{
  //gagal diupload
  ....
}
...