Bonjour,
Bonne année à tout le monde !
Je débute sous cakephp 3.x et je souhaite mettre en place un formulaire de contact (avec envoi d'email) et affichage d'un message flash suivant la réussite ou non de l'opération) avec une validation en ajax. J'ai fait le tour de pas mal de forum, il me semble qu'il faut passer par l'objet ResquestHandler, mais j'avoue ne pas du tout s'avoir comment l'utiliser.
Actuellement ma partie javascript récupère bien les données de mon formulaire et la requète est bien envoyée côté serveur.
-> Mon principal problème est donc de récupérer ses données (envoyées en json) dans mon controller pour les traiter ensuite.
C'est la première fois que je poste sur ce forum, veuillez m'excuser si je ne connais pas tout à fait les bonnes pratiques.

La partie serveur

//définition du formulaire
class ContactForm extends Form{

    protected function _buildSchema(Schema $schema){
        return $schema->addField('name','string')
            ->addField('email',['type'=>'string'])
            ->addField('body',['type'=>'text']);
    }

    protected function _buildValidator(Validator $validator){
        return $validator->add('name', 'length', [
            'rule' => ['minLength', 5],
            'message' => 'Un nom est requis'
        ])->add('email', 'format', [
            'rule' => 'email',
            'message' => 'Une adresse email valide est requise',
        ]);
    }

    protected function _execute(array $contact){
        $email = new Email();
        $email->from($contact['email']);
        $email->to('bob@bob.fr');
        $email->send($contact['body']);
    }

    public function setErrors($errors){
        $this->_errors = $errors;
    }
}

//méthode du controller test
 public function initialize()
    {
        parent::initialize();
        $this->loadComponent('RequestHandler');
    }
     public function aja()
    {
        if($this->request->is('post')){
            $contact = new ContactForm();
            if($contact->execute($this->request->data)){
                $this->Flash->success('Nous nous répondrons dès que possible.');
            }else{
                $this->Flash->error('Il y a eu un problème lors de la validation de votre formulaire.');
            }
        }
    }

Le formulaire dans ma vue

<div class="row">
            <div class="small-12 columns">
                <?php
                echo $this->Form->create(h($contact));
                echo $this->Form->input('name');
                echo $this->Form->input('email');
                echo $this->Form->input('body');
                echo $this->Form->button('Envoyer',array("id"=>"send"));
                echo $this->Form->end();
                ;?>
            </div>
        </div>

        <script>
    $("#send").click(function(e){
        e.preventDefault();
        var formData = {};
        $('form').find("input[name]").each(function (index, node) {
            formData[node.name] = node.value;
        });

        $.ajax({
            url: '<?= $this->Url->build(['controller' => 'test', 'action' => 'aja']) ?>',
            type : 'POST',
            dataType : 'json',
            data : formData,
            success : function(response, statut) {
                if (response.error === false) {
                    console.log(response)
                }
            }
        });
    });
</script>

2 réponses


Lartak
Réponse acceptée

Bonsoir et bonne année également.
Je te recommande de regarder l'application suivante, tu y trouveras de multiples exemples sur les fonctionnalités de CakePHP 3, notamment concernant le javascript sous différentes formes, ainsi que des outils/librairies pratiques et dédiés au Framework.
CakePHP Sandbox APP.

chris57
Auteur

merci beaucoup pour ta réponse ! Je regarde ça =)