Salut à tous,

Voilà j'ai adapté le tutoriel Système de membres avec CakePHP dans mon site fait avec les tutoriaux Développer un site avec CakePHP mais j'ai un petit (gros) problème, quand je créer un nouveau membre et que je clique sur S'enregistrer j'ai le message suivant qui s'affiche

Bonjour Test
Pour activer ce compte suivez le lien :

Fatal error: Call to a member function link() on a non-object in D:\xampp\htdocs\sitew\app\View\Emails\html\signup.ctp on line 6

Normalement c'est le message qu'on reçois par mail, mais moi il me l'affiche dans le navigateur, je ne comprend pas

Merci de votre aide

Warranty

28 réponses


tu es en local?

Nalius
Auteur

En local ou en ligne cela fait la même erreur.

Peux-tu nous montrer le contenu (ou au moyen la ligne 6) de ta vue signup.ctp ?

Nalius
Auteur

Voici la ligne 6 de mon fichier signup.php

<p><?php echo $this->Html->link('Activer mon compte',$this->Html->url($link,true)); ?></p>
Nalius
Auteur

Personne à une petite idée de ou cela peu venir ?

Peux-tu nous montrer ta variable $link ;)

Nalius
Auteur

Voilà, enfin j’espère que je me troupe pas :)

->viewVars(array('username'=>$d'User']'username'],'link'=>$link))

Non pas ça ;), ta variable $link, la déclaration de la variable $link = array(....)

Nalius
Auteur

Oups désolé :)

Voilà

$link = array('controller'=>'users','action'=>'activate',$this->User->id.'-'.md5($d'User']'password']));

:)

A mon avis il n'aime pas le md5.

Nalius
Auteur

Le truc que je comprend pas c'est qu'il m'affiche "Pour activer ce compte suivez le lien :..." dans le navigateur hors normalement je doit le recevoir par mail.

dsl je ne peux pas beaucoup t'aider je n'ai jamais utilisé l'envoi de mail comme ceci, mais j'ai vu un tutoriel pour envoyer des mails avec cakephp2.0 récemment tu devrait peut être le voir : creation d'un formulaire de contact sous cakephp 2.0

Le mieux c'est de nous montrer ton action signup ;)

Nalius
Auteur

Voilà :)

function signup(){
        if($this->request->is('post')){
            $d = $this->request->data; 
            $d'User']'id'] = null;
            $d'User']'lastlogin'] = '2009-08-08 12:17:00'; 
            if(!empty($d'User']'password'])){
                $d'User']'password'] = Security::hash($d'User']'password'],null,true);
            }
            if($this->User->save($d,true,array('username','password','mail'))){
                $link = array('controller'=>'users','action'=>'activate',$this->User->id.'-'.md5($d'User']'password']));
                App::uses('CakeEmail','Network/Email'); 
                $mail = new CakeEmail(); 
                $mail->from('noreply@localhost.com')
                    ->to($d'User']'mail'])
                    ->subject('Test :: Inscription')
                    ->emailFormat('html')
                    ->template('signup')
                    ->viewVars(array('username'=>$d'User']'username'],'link'=>$link))
                    ->send();
                $this->Session->setFlash("Votre compte a bien été créé","notif");
                $this->request->data = array(); 
            }else{
                $this->Session->setFlash("Merci de corriger vos erreurs","notif",array('type'=>'error'));
            }
        }
    }

tu as bien chargé cakemail? Tu as bien un template signup en html?

Nalius
Auteur

Oui Cakemail est bien charger j'ai revérifier et j'ai bien le fichier signup.ctp dans /app/View/Emails/html

Nalius
Auteur

Bon je vais laisser de coté l'espace membre pour le moment car cela me prend un peu la tête je recommencerai depuis le début plupart

Merci quand même pour votre aide :)

J'ai trouvé la solution : au lieu d'écrire cela,

$link = array('controller'=>'users','action'=>'activate',$this->User->id.'-'.md5($d'User']'password']));

essaye d'écrire cela :

$link = array('controller'=>'users','action'=>'activate','identifiant'=>$this->User->id.'-'.md5($d'User']'password']));

A mon avis cela réglera ton problème, j'ai toujours préféré écrire mes paramètres avec un identifiant, cela fait plus propre et on peut faire de la réécriture d'URL avec cela dans le fichier routes.php même si le lien est dans un email !

Nalius
Auteur

Salut !

Je viens d'essayer ta solution mais le problème persiste, il m'affiche toujours le mail dans le navigateur et non pas par mail.

Au sin tu as essayé d'envoyer ton lien sans les paramètres, si il n'y a plus le problème ceci veut dire que le problème viens de tes paramètres, dans ce cas essaye d'écrire une variable avec le user et le mdp concaténé et met le la variable dans ton paramètre.

Nalius
Auteur

Elle et pas bête ta solution je viens de faire un test, j'ai supprimer tous les paramètres de CakeMail dans signup et j'ai aucune erreur, certes je ne reçois pas de mail d'activation logique (de toute façon de n'ai jamais réussi à en recevoir) donc le problème vient des paramètres de Cakemail.

Salut désolé pour l'attente, je n'ai pas pu me connecter ce weekend, mais cela fonctionne comme ceci, rajoute des paramètres au fur et à mesure et test, si tu vois une erreur, cela veut dire que l'erreur viens de la dernière instruction que tu as écris cela ciblera mieux le problème.

Il y a des solutions pour ce problème car moi j'ai exactement le même et je panique depuis 3 jours

Salut désolé je viens de voir ton passage, mais je crois que Warranty a du trouver mais n'as pas expliquer sa solution. Sans lui on ne peux pas faire grand chose.

Nalius
Auteur

Désolé de cette attente, mais malheureusement je n'ai pas réussi à réglé se problème.

Cordialement, Warranty

Bonjour ! Même Problème !

Pas de message d'erreur mais je suis renvoyer vers le message que l'on reçoit par email !

  • je ne reçoit pas l’émail
  • l'utilisateur et bien enregistrer dans la bdd

Salut Il faut plutot que tu ajoutes dans la librairie de CAkeEmail ceci protected

$_helpers = array('Html');

le chemin a suivre : lib/Cake/Network/Email/CakeEmail.php

$_helpers = array('Html');

chez moi il est a la ligne 119 dans ma librairie

Suis-je le seul à trouver bizarre que le link() à un url() ?
T'as essayer de passer de

<p><?php echo $this->Html->link('Activer mon compte',$this->Html->url($link,true)); ?></p>

à

<p><?php echo $this->Html->link('Activer mon compte',$link); ?></p>

en déclarant un 'full_base' dans $link :

$link = array('controller'=>'users', 'action'=>'activate', $this->User->id.'-'.md5($d'User']'password'], 'full_base' => true));

Le full_base permet de donner l'url absolue (comme avec le true en second paramètre à url())

Après, je ne suis pas sûr que c'est la solution à ton problème, mais ça vaut le coup d'essayer.