6 votes

Ajout d'une fonction de rappel personnalisée à Codeigniter Form Validation

Je veux limiter mon enregistrement aux emails avec @mywork.com J'ai fait ce qui suit dans My_Form_validation.

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;
        }
    }

Je l'utilise comme suit. J'utilise les règles CI pour le nom d'utilisateur et le mot de passe et cela fonctionne, pour l'email il accepte n'importe quelle adresse email. J'apprécie toute aide.

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);

18voto

Jordan Arseno Points 3979

Le problème de la création d'une callback directement dans le contrôleur est qu'elle est maintenant accessible dans l'url en appelant http://localhost/yourapp/yourcontroller/yourcallback ce qui n'est pas souhaitable. Il existe une approche plus modulaire qui range vos règles de validation dans des fichiers de configuration. Je la recommande :

Votre contrôleur :

<?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 :

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

0voto

Marin Sagovac Points 1689

Avez-vous besoin d'une validation comme celle-ci dans une fonction de rappel de Codeigniter ?

$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;
    }
}

0voto

reddy Points 84

Pour corriger la réponse de Jordan, le fichier de langue que vous devez modifier doit se trouver dans le dossier suivant

system/language/english/form_validation_lang.php

et non pas application/.../form_validation_lang.php. Si vous créez le nouveau fichier sous le chemin de l'application avec le même nom, il écrasera l'original dans le chemin du système. Ainsi, vous perdrez toute l'utilisation des filtres originaux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X