Frage Hinzufügen eines benutzerdefinierten Rückrufs zur Codeigniter Formularvalidierung


Ich möchte meine Registrierung auf E-Mails mit @ mywork.com beschränken. Ich habe Folgendes in My_Form_validation vorgenommen.

public function email_check($email)
    {
        $findme='mywork.com';
        $pos = strpos($email,$findme);
        if ($pos===FALSE)
        {
            $this->CI->form_validation->set_message('email_check', "The %s field does not have our email.");
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    }

Ich benutze es wie folgt. Ich benutze CI-Regeln für Benutzername und Passwort und es funktioniert, für E-Mail akzeptiert es jede E-Mail-Adresse. Irgendwelche ich schätze jede Hilfe.

function register_form($container)
    {
....
....

/ Set Rules
$config = array(
...//for username
// for email            
    array(
  'field'=>'email',
  'label'=>$this->CI->lang->line('userlib_email'),
  'rules'=>"trim|required|max_length[254]|valid_email|callback_email_check|callback_spare_email"
   ),
...// for password
 );

$this->CI->form_validation->set_rules($config);

6
2017-10-14 02:42


Ursprung


Antworten:


Das Problem beim direkten Erstellen eines Callbacks im Controller besteht darin, dass er jetzt in der URL durch Aufrufen zugänglich ist http://localhost/yourapp/yourcontroller/yourcallback was nicht wünschenswert ist. Es gibt einen modulareren Ansatz, der Ihre Validierungsregeln in Konfigurationsdateien versteckt. Ich empfehle:

Ihr Controller:

<?php
class Your_Controller extends CI_Controller{
    function submit_signup(){
        $this->load->library('form_validation');
        if(!$this->form_validation->run('submit_signup')){
            //error
        }
        else{
            $p = $this->input->post();
            //insert $p into database....
        }
    }
}

application/config/form_validation.php:

<?php
$config = array
(   
    //this array key matches what you passed into run()
    'submit_signup' => array
    (
        array(
            'field' => 'email',
            'label' => 'Email',
            'rules' => 'required|max_length[255]|valid_email|belongstowork'
        )
        /*
        ,
        array(
            ...
        )
        */

    )
    //you would add more run() routines here, for separate form submissions.
);

application/libraries/MY_Form_validation.php:

<?php
class MY_Form_validation extends CI_Form_validation{    
     function __construct($config = array()){
          parent::__construct($config);
     }
     function belongstowork($email){
         $endsWith = "@mywork.com";
         //see: http://stackoverflow.com/a/619725/568884
         return substr_compare($endsWith, $email, -strlen($email), strlen($email)) === 0;
     }
}

application/language/english/form_validation_lang.php:

Hinzufügen: $lang['belongstowork'] = "Sorry, the email must belong to work.";


17
2017-10-14 03:46



Brauchen Sie in einer Codeigniter-Callback-Funktion etwas Ähnliches?

$this->form_validation->set_rules('email', 'email', 'trim|required|max_length[254]|valid_email|xss_clean|callback_spare_email[' . $this->input->post('email') . ']');

if ($this->form_validation->run() == FALSE)
{
    // failed
    echo 'FAIL';
}
else
{ 
    // success
    echo 'GOOD';
}

function spare_email($str)
{

    // if first_item and second_item are equal
    if(stristr($str, '@mywork.com') !== FALSE)
    {
    // success
    return $str;
    }
    else
    {
    // set error message
    $this->form_validation->set_message('spare_email', 'No match');

    // return fail
    return FALSE;
    }
}  

0
2017-10-14 03:22



Eine Korrektur zu Jordans Antwort sollte die Sprachdatei sein, die Sie bearbeiten müssen

System / Sprache / Englisch / form_validation_lang.php

keine Anwendung /.../ form_validation_lang.php. Wenn Sie die neue Datei unter dem Anwendungspfad mit demselben Namen erstellen, wird das Original im Systempfad überschrieben. Dadurch verlieren Sie die gesamte Verwendung der ursprünglichen Filter.


0
2018-06-02 20:58