Callback mempengaruhi required

saat saya buat code seperti dibawah ini

$this->form_validation->set_rules('email', 'Email', 'required|callback_checkEmail|callback_checkRole');
    $this->form_validation->set_rules('password', 'Password', 'required|callback_checkPassword');

fungsi dari required gak berguna. saat saya coba kosongkan kedua input, lalu saya submit yang di eksekusi malah kode dari callback.

ini tamplian saat keduanya saya sengaja isi secara kosong, sepertinya rule "required" tidak berhasil dijalankan. karena, "required" biasanya kalo diisi kosong akan menampilkan contoh tulisan "email wajib diisi" / "email is required"

apakah karena ini ?

gimana agar rule "required" bisa berjalan seperti normal, tidak terkena rule callback yang saya buat.

terimakasih

avatar HabibulUmam
@HabibulUmam

59 Kontribusi 10 Poin

Diperbarui 5 tahun yang lalu

Tanggapan

function callback kamu seperti apa? coba ditambahkan di pertanhannya

sebelumnya, saya pakai custom_validation agar bisa berbahasa indonesia tampilan errornya. lebih lengkap nya dibawah

tambahkan info denga mengedit pertanyaan ya, bukan di jawaban, agar rapi dan mudah dibaca yang lain

oke bang hilman, ditunggu jawabannya

  1. sekarang kalo rule callback nya lolos, apakah required terpanggila atau tidak? tambahkan juga infonya 2. tampilkan kode sebagai kode ya, jangan sebagai gambar :D

3 Jawaban:

  1. Saya tidak bisa mencoba kode kamu, jadi yang bisa saya lakukan, bandingkan dengan dokumentais resmi dan menebak salahnya, Dari <a href='https://www.codeigniter.com/userguide3/libraries/form_validation.html '>dokuemntasi validation codeigntier </a> sejauh ini benar, tapi yang bisa dicoba pemberian nama callback_check_email (jadi underscore) dan return diCAPSLOCK TRUE atau FALSE

  2. Alternatif kalau masih belum berhasil (saya tidak tahu kesalahannya sejauh ini dimana) coba menuliskan fungsi callablenya di model, dan memanggilnya dengan cara ini

<pre> $this-&gt;form_validation-&gt;set_rules( 'username', 'Username', array( 'required', array($this-&gt;users_model, 'nama_custom_method_kamu') ) ); </pre>

avatar hilmanski
@hilmanski

2686 Kontribusi 2135 Poin

Dipost 5 tahun yang lalu

Tanggapan

makasih bang hilman.

itu harus users_model ya ? kalau saya taruh di check_model agar lebih rapi kode saya bisa ? soalnya saya coba taruh dikeduanya kok ada error Undefined property: CI_Loader::$check_model

itu rule nya saya tempatkan di application/config

jangan tanya bisa atau tidak gan, kalo ngoding dicoba langsung :D

set_rule nya saya buat seperti ini, dan saya tempatkan di application/config/form_validation.php

<pre> &lt;?php

$config['error_prefix'] = '&lt;div class="alert alert-danger" role="alert"&gt;'; $config['error_suffix'] = '&lt;/div&gt;';

$config = array( 'login' =&gt; array( array( 'field' =&gt; 'email', 'label' =&gt; 'Email', 'rules' =&gt; array( 'trim|required', [$this-&gt;check_model, 'checkEmail'], [$this-&gt;check_model, 'checkRole'] ) ), array( 'field' =&gt; 'password', 'label' =&gt; 'Password', 'rules' =&gt; array( 'trim|required', [$this-&gt;check_model, 'checkPassword'] ) ) ), </pre>

Semuanya bisa berjalan dengan baik, sebelum saya ubah rules nya jadi seperti diatas. dan muncul error seperti dibawah ini.

<pre>

A PHP Error was encountered

Severity: Notice

Message: Undefined property: CI_Loader::$check_model

Filename: config/form_validation.php

Line Number: 12

Backtrace:

File: C:\xampp\htdocs\lister\application\config\form_validation.php Line: 12 Function: _error_handler

File: C:\xampp\htdocs\lister\application\controllers\Auth\Auth.php Line: 10 Function: __construct

File: C:\xampp\htdocs\lister\index.php Line: 315 Function: require_once

</pre>

ini fungsi callback yang saya buat di check_model

<pre> &lt;?php

class Check_Model extends CI_Model { public function __construct() { parent::__construct(); }

//get user data from db
public function get_user($key, $value)
{
    $query = $this-&amp;gt;db-&amp;gt;get_where(&#039;users&#039;, [$key =&amp;gt; $value]);
    if (!empty($query-&amp;gt;row_array())) {
        return $query-&amp;gt;row_array();
    }
    return false;
}

//function check email
public function checkEmail($email)
{
    if (!$this-&amp;gt;checkEmails($email)) {
        $this-&amp;gt;form_validation-&amp;gt;set_message(&#039;checkEmail&#039;, &#039;Email is not Registered!&#039;);
        return false;
    }

    return true;
}

public function checkRole($email)
{
    $data = $this-&amp;gt;get_user(&#039;email&#039;, $email)[&#039;role&#039;];
    if ($data == 0) {
        $this-&amp;gt;form_validation-&amp;gt;set_message(&#039;checkRole&#039;, &#039;Email is not activated yet!&#039;);
        return false;
    }

    return true;
}
public function checkEmails($email)
{
    $query = $this-&amp;gt;db-&amp;gt;get_where(&#039;users&#039;, array(&#039;email&#039; =&amp;gt; $email));
    if (!empty($query-&amp;gt;row_array())) {
        return true;
    }

    return false;
}

//function check password
public function checkPassword($password)
{
    $email = $this-&amp;gt;get_user(&#039;email&#039;, $this-&amp;gt;input-&amp;gt;post(&#039;email&#039;))[&#039;email&#039;];

    if (!$this-&amp;gt;checkPasswords($email, $password)) {
        $this-&amp;gt;form_validation-&amp;gt;set_message(&#039;checkPassword&#039;, &#039;Invalid Password!&#039;);
        return false;
    }

    return true;
}

public function checkPasswords($email, $password)
{
    $hash = $this-&amp;gt;get_user(&#039;email&#039;, $email)[&#039;password&#039;];

    if (password_verify($password, $hash)) {
        return true;
    }

    return false;
}

} </pre>

avatar HabibulUmam
@HabibulUmam

59 Kontribusi 10 Poin

Dipost 5 tahun yang lalu

Tanggapan

2 hari saya stuck di bagian ini :(

kamu ada refrensi cara penulisan custom di config dari mana? *kalo errornya berartinya modelnya belum diload di file yang kamu mau

hanya kepikiran untuk menulis kode lebih rapi :) *eksperimen

saya gak mau fungsi check bercampur aduk dengan fungsi lain,

Jawaban Terpilih

Akhirnya bisa juga :D Kuncinya untuk membuat libarary validation agar kode lebih rapi dan menghindari bug dari callback yang mencegah required tereksekusi. saya juga buat rule nya di config agar lebih rapi lagi.

ternyata cukup mudah untuk membuat/menetapkan library validation untuk menyimpan fungsi callback. kuncinya hanya menambahkan __construct seperti dibawah ini.

saya simpan di application/library/MY_Form_validation.php <pre> &lt;?php

class MY_Form_validation extends CI_Form_validation { public function __construct($config = array()) { parent::__construct($config); $this-&gt;CI-&gt;load-&gt;model('Auth/check_model'); }

#callback yang sudah dibuat

</pre>

dan untuk rule saya seperti ini application/config/myrule.php

catatan : untuk memanggil fungsi callback di file config atau rule , gausah memakai prefix callback_ , cukup tulis fungsi callback teman-teman. misal: checkEmail | gakusah callback_checkEmail

<pre> &lt;?php

$config['error_prefix'] = '&lt;div class="alert alert-danger" role="alert"&gt;'; $config['error_suffix'] = '&lt;/div&gt;';

$config = array( 'login' =&gt; array( array( 'field' =&gt; 'email', 'label' =&gt; 'Email', 'rules' =&gt; 'trim|required|valid_email|checkEmail|checkRole' ), array( 'field' =&gt; 'password', 'label' =&gt; 'Password', 'rules' =&gt; 'trim|required|checkPassword' ) ), 'register' =&gt; array( array( 'field' =&gt; 'username', 'label' =&gt; 'Username', 'rules' =&gt; 'trim|required|is_unique[users.username]|min_length[2]|max_length[12]' ), array( 'field' =&gt; 'email', 'label' =&gt; 'Email', 'rules' =&gt; 'trim|required|valid_email|is_unique[users.email]|min_length[7]' ), array( 'field' =&gt; 'password', 'label' =&gt; 'Password', 'rules' =&gt; 'trim|required|min_length[8]' ), array( 'field' =&gt; 'password2', 'label' =&gt; 'Confirm Password', 'rules' =&gt; 'trim|required|matches[password]' ) ) ); </pre>

untuk menjalankannya

<pre> if ($this-&gt;form_validation-&gt;run('login') === false) { </pre>

saya berniat menshare ini, barangkali ada yang menemui masalah seperti saya. dan/atau ingin merefraktori kodenya agar lebih rapi strukturnya. terima kasih sebelumnya untuk bantuannya

avatar HabibulUmam
@HabibulUmam

59 Kontribusi 10 Poin

Dipost 5 tahun yang lalu

Tanggapan

if ($this->form_validation->run('login') === false) {

yang 'login' tinggal ganti rule yang dibuat, misal 'register'

nice share, selamat ya berat pasti perjuangannya sampai sini, terima kasih mau sharing

Login untuk ikut Jawaban