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 échoué, mais tu as bien souscrit à 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.
Partager