IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

CodeIgniter PHP Discussion :

Modèle non chargé dans une callback de validation


Sujet :

CodeIgniter PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 31
    Points : 13
    Points
    13
    Par défaut Modèle non chargé dans une callback de validation
    Bonjour à tous !

    Je suis actuellement en train de développer un site web pour lequel j'ai un formulaire de souscription à une newsletter, le plus simple qui soit :

    Code XHTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <form action="http://www.festivaletudiant.com/index.php/newsletter/suscribe" method="post" id="newsletter">
     
                        <p>
                            <label for="newsletter_mail">Newsletter : </label>
                            <input type="text" name="mail" id="newsletter_mail" />
                            <input type="submit" name="submit" id="newsletter_submit" value="S'incrire" />
                        </p>
     
    </form>

    Ensuite, j'ai mis en place une validation du formulaire par AJAX, via Jquery :

    Code javascript/jQuery : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $(document).ready(function(){
       $("#footer form").submit(function(){
           var email = $('#newsletter_mail').val();
            $.post("/index.php/newsletter/suscribe/", {'mail': email}, function(data) {
                $("#footer .error,#footer .success").fadeOut();
                $("#newsletter").append(data);
     
            });
            return false;
         });
     
       });

    Je vous donne ensuite le contrôleur (newsletter.php), dans lequel il y a la mise en place de la validation du formulaire, avec envoi d'email de confirmation et la callback available() qui se charge de regarder dans la base de données si l'email soumis n'est pas déjà abonné à la newsletter.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
     
    class Newsletter extends Controller{
     
        function newsletter(){
            parent::Controller();
        }
        function suscribe(){
     
            //On verifie que le mail entré est bien un email valide
     
            $this->form_validation->set_rules('mail', 'Email', 'required|valid_email|trim|callback_available');
            $this->form_validation->set_message('valid_email', 'L\'adresse email que tu as entrée ne semble pas valide. Ré-essaie');
            $this->form_validation->set_message('required', 'Entre ton adresse email pour souscrire à notre newsletter');
     
            if ($this->form_validation->run() == FALSE)
            {
                $error = form_error();
                $this->load->view('ajax/newsletter_failure',array($error));
            }
            else
            { // la validation s'est passée sans problèmes
                $mail=$this->input->post('mail');
                $this->load->model('newsletter_model');
                $id = $this->newsletter_model->register($mail);
                if($id)
                {
                    $subject  = "Souscription à notre newsletter";
                    $message  = "Bravo ! Tu as souscris à la newsletter !"
                        // Envoi du mail
                    $this->load->library('email');
                    $this->email->from('test@test.com', 'Beta');
                    $this->email->to($mail);
                    $this->email->subject($subject);
                    $this->email->message($message);
     
     
                    if($this->email->send())
                    {
                        // Chargement du message de succès
                        $this->load->view('ajax/newsletter_success');
                    }
                    else
                    {
                        $error = "L'envoi de l'email de confirmation a &eacute;chou&eacute;, mais tu as bien souscrit &agrave; notre newsletter.";
                        $this->load->view('ajax/newsletter_failure',array('error'=>$error));
                    }
     
                }
                else
                {
                    $error = "Une erreur SQL s'est produite. Retente plus tard.";
                    $this->load->view('ajax/newsletter_failure',array('error'=>$error));
                }
            }
        }
        function available($mail){
     
            $this->load->model('newsletter_model');
            $nb_rows = $this->newsletter_model->check($mail);
            if( $nb_rows == 0)
            {
                return TRUE;
            }
            else
            {  
                $this->form_validation->set_message('available', 'Ton email est déjà présent dans notre base de données');
                return FALSE;
            }
        }
     
    }

    Pour finir, je vous mets le code du modèle correspondant, newsletter_model.php, dans lequel est implémentée la fonction check() :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    class Newsletter_model extends Model
    {
     
        function Newletter_model()
        {
            parent::Model();
        }
     
        function check($mail)
        { // Fonction qui checke si l'email est dispo
            $query = $this->db->get_where('newsletter',array('mail'=>$mail));
            return $query->num_rows();
     
        }
     
        function register($email)
        {
     
           //Préparation des données à insérer
     
            $data = array(
                'mail'      => $email,
                'timestamp' => time()
            );
            //Insertion des données
            $this->db->insert('newsletter',$data);
     
            //On retourne l'ID de l'email, pour permettre une suppression par la suite
            $query = $this->db->get_where('newsletter',array('mail'=>$email));
            if($query->num_rows() == 1)
            { // Si il y a bien 1 ligne et 1 seule qui correspond à cet email
                $row = $query->row();
                return $row->id;
     
            }
            else
            {
                return FALSE;
            }
     
        }
    }

    Quant aux vues, elles sont extrêmement basiques : c'est pratiquement des echo purs des messages d'erreur générés par le controlleur.

    Maintenant que je les codes sources sont là, petite explication du problème.
    Lorsque je soumets un email valide, le message d'erreur suivant apparaît :

    Code erreur : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Call to a member function on a non-object in /application/controllers/newsletter.php on line 71

    La ligne correspondante est celle-ci :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $nb_rows = $this->newsletter_model->check($mail);

    J'y suis depuis 3h de l'après-midi, et ce message ne veut pas disparaître...je ne sais plus trop quoi essayer.
    Une chose utile à savoir : le problème se situe dans la callback "available()" ou dans le modèle qui est chargé (qui n'est pas chargé en l'occurrence), puisque le reste marche si je retire la règle de validation callback_check

    Merci de votre aide,



    Arnaud.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    J'ai enfin trouvé une solution pour que ça fonctionne !
    En regardant le phpinfo() de mon serveur j'ai vu que la version de Php utilisée était la 4...
    J'ai donc placé un .htaccess à la racine du dossier où est installé CI (je suis sur un mutualisé chez phpnux), avec ces lignes là :
    Code htaccess : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AddHandler x-httpd-php5 .php
    AddType application/x-httpd-php5 .php

    Les lignes à insérer peuvent différer d'un hébergeur à l'autre : voici une liste des hébergeurs et de leur configuration, pour ceux qui voudraient passer au Php 5 sur leur mutualisé.

    Par contre, impossible de comprendre pourquoi ça a résolu le problème, ni pourquoi le reste marchait, et pas cette ligne spécifique avec php 4 : MYSTERE !

    Je ne mets donc pas le tag [résolu]...si jamais quelqu'un trouve, je serai curieux de savoir la solution, après quelques heures passées à retourner le problème dans tous les sens !

    Arnaud.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Erreur trouvé
    Et bien c'est un vieux post mais il semble que l'erreur est simplement une erreur de frappe.

    Dans ton model, le nom de la méthode de construction n'est pas identique au nom de class.
    Tu es en php5, pour éviter tout problème, nomme plutôt ta méthode de construction ainsi :
    Voilà, je crois que tu pourras mieux dormir maintenant :p

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/09/2009, 12h03
  2. Variable générale non trouvée dans une fonction
    Par mickael.be dans le forum Langage
    Réponses: 10
    Dernier message: 21/02/2006, 19h18
  3. [PHP-JS] Formulaire non trouvé dans une fonction
    Par philippe30 dans le forum Langage
    Réponses: 4
    Dernier message: 11/12/2005, 21h53
  4. Numero non present dans une autre table
    Par AlphonseBrown dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/02/2005, 12h37
  5. Réponses: 4
    Dernier message: 14/02/2005, 19h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo