Bien le coucou,

Bon, je me suis dit "Tiens puisque le Charset est résolu, pourquoi ne pas revenir avec un autre problème ?" Et me voilà !
Ma problématique : Envoyer des emails à des utilisateurs depuis le site internet > Genre les emails qu'on reçoit pour gagner des places qu'on aura jamais à Center Park.

J'avais un formulaire de contact, je me suis dit "tiens je reprends un petit bout que je modifie et zou one again a bis to love ça va marcher", bah...ou pas.

J'ai compris que le black-holed venait du components Security, et qu'en gros il aimait pas qu'on change la valeur d'un champ hidden, sauf que du coup...J'ai pas de champ hidden et je modifie quedal et en plus mon formulaire de contact fonctionne alors que dans l'absolu il devrait bugguer aussi -_- Bref trève de parlotte...

Controller :

function share($id){
        if($this->request->is('post')){
            // Récupération des valeurs des champs du formulaire
            $this->Share->send($this->request->data('Share'));
            if(!empty($this->request->data'Share']'website'])){
                $this->Session->setFlash("Votre email a bien été envoyé","ok");
                $this->request->data = array();
            }else{
                if($this->Share->send($this->request->data'Share'])){
                    $this->Session->setFlash("Votre email a bien été envoyé","ok");
                    $this->request->data = array();
                }else{
                    $this->Session->setFlash("Merci de corriger vos erreurs","ko");
                } 
            } 
        }
    }

En haut du controller :

<?php
class StoryController extends AppController {
    public $components = array('Session','Security');

Vue du formulaire :

<?php echo $this->Form->create('Share',array('class'=>'form-inline'));?>
    <?php echo $this->Form->input('firstNameFriend',array('type'=>'text','label'=>' ','placeholder'=>'Prénom de votre ami(e)','class'=>'input-small'));?>
    <?php echo $this->Form->input('emailFriend',array('type'=>'text','label'=>' ','placeholder'=>'Email de votre ami(e)','class'=>'input-small'));?>
    <?php echo $this->Form->input('firstNameSender',array('type'=>'text','label'=>' ','placeholder'=>'Votre prénom','class'=>'input-small'));?>
    <?php echo $this->Form->input('website',array('type'=>'text','label'=>' ','placeholder'=>'Votre prénom','class'=>'hidden'));?>
<?php echo $this->Form->end('Envoyer');?>

Model (FakeModel) :

<?php 
class Share extends AppModel{

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

    );
    public function send($data){
        $this->set($data);
        if($this->validates()){
            App::uses('CakeEmail','Network/Email');
            $mail = new CakeEmail();
            $mail->to($emailFriend)
                ->from('no-reply@ ****.com')
                ->subject(' *******'.$firstnameSender)
                ->emailFormat('html')
                ->template('sharing_story')->viewVars($data);
            return $mail->send();
        }else{
            return false;
        }   
    }
}

Et du coup le message d'erreur :

The request has been black-holed
Error: The requested address '/ ************ /story/share/8' was not found on this server.
Stack Trace

I'm a little bit lost...Please...Help (Référence cinématographique de fifou)

6 réponses


Salut,

Tu as pas activé le cache de cake par hazard ? Je peux voir la sortie html de ton formulaire?

Txh

Heu non, enfin jt'avouerai que j'ai jamais rien fait du côté du cache ^^

Pour la sortie la voici (on voit bien les champs hidden)

<form action="/ ******* /story/share/5" class="form-inline" id="ShareShareForm" method="post" accept-charset="utf-8">
    <div style="display:none;"><input type="hidden" name="_method" value="POST"/>
    <input type="hidden" name="data[_Token][key]" value="4d829cec2fb36f4326a9a32f7316b3442bad0800" id="Token1560957828"/></div> 
    <div class="input text required">
        <label for="ShareFirstNameFriend"> </label>
        <input name="data[Share][firstNameFriend]" placeholder="Prénom de votre ami(e)" class="input-small" type="text" id="ShareFirstNameFriend" required="required"/></div>   
        <div class="input text required">
        <label for="ShareEmailFriend"> </label><input name="data[Share][emailFriend]" placeholder="Email de votre ami(e)" class="input-small" type="text" id="ShareEmailFriend" required="required"/></div> 
        <div class="input text required">
        <label for="ShareFirstNameSender"></label>
        <input name="data[Share][firstNameSender]" placeholder="Votre prénom" class="input-small" type="text" id="ShareFirstNameSender" required="required"/></div>
        <div class="input text"><label for="ShareWebsite">
        </label><input name="data[Share][website]" placeholder="Votre prénom" class="hidden" type="text" id="ShareWebsite"/></div><div class="submit"><input type="submit" value="Envoyer"/></div>
        <div style="display:none;">
        <input type="hidden" name="data[_Token][fields]" value="e3654f00a1b6b9b514aa0c561bf4c1d1306348b6%3A" id="TokenFields563803080"/><input type="hidden" name="data[_Token][unlocked]" value="" id="TokenUnlocked1693069823"/>
    </div>
</form>

Petit avancement, visiblement c'est donc la fonction "send" qui déconne. Il me sort une première erreur "Error: Call to a member function send() on a non-object" et quand je fais une modif et que j'essaie de re-soumettre le dit formulaire là il me la black-holed donc du coup ça doit être "logique".

Ci-dessous un debug de

$this->request->data('Share')

array(
    'firstNameFriend' => 'Christophe',
    'emailFriend' => 'c.lablancherie@live.fr',
    'firstNameSender' => 'Jeanclaudedus',
    'website' => ''
)

ça me sort un petit array, mais cela étant dit si je fais un debug de ma page de contact, ça me sort aussi un Array, et pas un objet

\app\Controller\ContactController.php (line 6)
array(
    'name' => 'dezzdqzdq',
    'email' => 'qdzdqzd@lol.fr',
    'message' => 'dqzdqdqzdqzd'
)

Dans ta fonction send, tu passes au composant Mail des variables non déclarées ($emailFriend, $firstnameSender) donc c'est logique qu'il te sorte une erreur. Remplace ces deux variables par celles contenu dans ton tableau $data :

App::uses('CakeEmail','Network/Email');
    $mail = new CakeEmail();
    $mail->to($data'Share']'emailFriend'])
         ->from('no-reply@ ****.com')
         ->subject(' *******' . $data'Share']'firstNameSender'])
         ->emailFormat('html')
         ->template('sharing_story', 'default')
         ->viewVars($data);
    return $mail->send();

Chalut !
Merci Guizmo tu m'as orienté, mais en fait j'ai rajouté quelque chose :

$this->loadModel('Share');

Là il ne me sort plus le problème de la fonction send() qui n'est pas un objet blablabla MAIS il me dit

Error: Call to a member function from() on a non-object

Heu WTF ? C'est le from de l'envoi d'email, -_-, il veut un format de ce type aussi ? :

->to($data'Share']'from'])

Un petit retour du

debug($this->set($data));
        die();

Résultat :

array(
    'Share' => array(
        'firstNameFriend' => 'Christophe',
        'emailFriend' => 'c.lablancherie@live.fr',
        'firstNameSender' => 'Jeanclaudedus',
        'website' => '',
        'from' => 'no-reply@ ********.com'
    )
)

J'ai fait le test avec :

->from($data'Share']'from'])

Et miracle ça ne marche pas -_- I'm completely lost

public function send($data){
        if($this->validates($data)){
            App::uses('CakeEmail','Network/Email');
            $mail = new CakeEmail();
            $mail->domain(FULL_BASE_URL);
            $mail->to($data'Share']'emailFriend'])
                 ->from($data'Share']'from'])
                 ->subject(' *******' . $data'Share']'firstNameSender'])
                 ->emailFormat('html')
                 ->template('sharing_story')
                 ->viewVars($data);
            return $mail->send();
        }else{
            return false;
        }  
    }