Bonjour
J'ai un soucis apres l'envoi d'un formulaire de contact, je ne sais pas pourquoi ce message d'erreur. car a aucun moment je ne lui preciser comment revenir cette page.

L'adresse '/contact' n'a pas pu être trouvée sur ce serveur

Hors si je mets manuellement dans le browser /contact/
ca fonctionne.

De quoi le tester :
http://goo.gl/TT1wDE

j'ai utilisé le code du tuto formulaire de contact pratiquement

class ContactController extends AppController{

    //public $components = array('Session','Security'); 

    function index(){
        if($this->request->is('post')){
            // if(!empty($this->request->data['Contact']['website'])){
            //  $this->Session->setFlash("Votre mail nous est bien parvenu","ok");
            //  $this->request->data = array(); 
            // }else{
                if($this->Contact->send($this->request->data['Contact'])){
                    $this->Session->setFlash("Votre mail nous est bien parvenu","ok");
                    $this->request->data = array(); 
                    return $this->redirect(['controller'=>'contact','action'=>'index']);

                }else{
                    $this->Session->setFlash("Merci de corriger vos champs","ko");
                    return $this->redirect(['controller'=>'contact']);
                }
            // }
        }
    }

10 réponses


Lartak
Réponse acceptée

Il est pourtant bien fonctionnel puisque qu'il génère un input avec un token dans ton formulaire.

<input type="hidden" name="data[_Token][key]" value="184b3b6659ec39d5f6dc862cd5e6525af5567cbe" id="Token636591527">

Et puis, comment pourrais tu envoyer un tableau de données avec l'index Contact :

$this->request->data['Contact']

alors que tes inputs n'ont que le nom du champ ?
À mon avis le tableau ci-dessus doit être vide et ne doit donc même pas pouvoir passer la validation.
Ce n'est pas parce que tu ne le définis pas dans ton ContactController, qu'il n'y est pas actif, si par exemple tu le charge dans ton AppController, il sera effectif également dans tous les autres controller, à moins par exemple que dans ton ContactController, tu le désactive.

sylvain
Auteur

rien a changé


                }else{
                    $this->Session->setFlash("Merci de corriger vos champs","ko");
                    return $this->redirect(['controller'=>'contact','action'=>'index']);
                }

j'ai commenté les routes et c'est pareil.

Bonjour.

je ne sais pas pourquoi ce message d'erreur. car a aucun moment je ne lui preciser comment revenir cette page.

Bien sûr que si, puisque tu fais un redirect.
C'est le composant Security qui retourne à cette erreur :

The request has been black-holed

Pour commencer, tu devrais faire ta validation avant de tenter d'envoyer l'email.
Vu que tu ne nous montre pas le code qui correspond au traitement des données ni à l'envoi de l'email, je ne peux pas trop t'aider ni être plus précis.

Hors si je mets manuellement dans le browser /contact/ ca fonctionne.

Non, pas vraiment, car j'ai faussé l'adresse de l'action du formulaire en mettant /contact/ au lieu de /contact/ et ça ne change rien.
Un peu plus de précisions serait bien.

En fait, j'ai la forte impression, que tu utilises le composant Security, mais que tu n'utilises pas le FormHelper pour les inputs du formulaire, ce qui est incompatible.

sylvain
Auteur

la vue que j'ai

    <?php echo $this->Form->create('Contact'); ?>
      <!--  <form id="contact" action="contact.html" method="post"> -->
      <div class="form_settings">
        <p><span>Nom</span><input class="contact" type="text" name="your_name" value="" /></p>
        <p><span>Votre courriel</span><input class="contact" type="text" name="your_email" value="" /></p>
        <p><span>Message</span><textarea class="contact textarea" rows="5" cols="50" name="your_message"></textarea></p>

        <p style="padding-top: 15px"><span>&nbsp;</span><input class="submit" type="submit" name="contact_submitted" value="envoyer" /></p>
      </div>
    </form> 

et le model

<?php
class Contact extends AppModel{

    public $useTable = false; 
    public $validate = array(
        'name' => array(
            'rule' => 'notEmpty',
            'required' => true,
            'message' => 'Vous devez entrer votre nom'
        ),
        'email' => array(
            'rule' => 'email',
            'required' => true,
            'message' => 'Vous devez entrer un email valide'
        ),
        'message' => array(
            'rule' => 'notEmpty',
            'required' => true,
            'message' => 'Vous devez entrer votre message'
        )
    );

    public function send($d){
        $this->set($d); 
        if($this->validates()){
            App::uses('CakeEmail','Network/Email');
            $mail = new CakeEmail(); 
            $mail->to('ssylvain@gmail.com')
                ->from($d['email'])
                ->subject('Contact :: le vallon des roses')
                ->emailFormat('html')
                ->template('contact')->viewVars($d);
            return $mail->send();
        }else{
            return false; 
        }

    }

}

C'est bien ce que je disais, tu utilises le composant Security mais tu n'utilises pas le Helper Form pour les inputs, ce qui est totalement incompatible.

sylvain
Auteur

je comprends pas tres bien, il est commenté le composant ...

sylvain
Auteur

Merci c'est bien ca, il etait également dans AppController. Et je n'avais pas fait attention car ce n'etais pas le code pour le formulaire.

De rien. :)

sylvain
Auteur

J'ai quand meme un soucis du coup, car dans l'appController

j'ai

public $components = array(
        'Session',
        'Auth',
        'RequestHandler'
        ,
        'Security' => array(
            'csrfUseOnce' => false
            )
        );

Qui est utilisé par autre chose dans le system.
Si je retire le formulaire fonctionne, mais le blog ne fonctionne plus

sylvain
Auteur

j'ai rien dit. c'est bon. tout m'es revenu