Bonjour,
J'essaie actuellement de développer une petit plateforme web couplé avec une application, le tout sous cakephp pour le site, et cordova+angularjs pour l'application.
J'utilise REST de cakephp pour faire passer les données entres les 2.
J'arrive parfaiement à récupere le json du site cakephp sur mon appli.
En revanche, je vois défiller plein d'exemples différents pour envoyer des données de l'appli vers le site.
J'utilise dans l'appli http.post (pas encore terminé).
Mais au niveau de cakephp, sur ma fonction d'ajout des données je ne comprends pas bien comment différencier les données arrivantes, de l'appli ou du site.
Pour le moment j'ai baragouiné qqch comme ça :

//Ajouter une quote
    public function addquote(){
        //debug($this->request->input('json_decode'));
        //debug(json_decode("[{name: 'lol'}]"));
        if($this->request->input('json_decode')!=null){
        //venant de l'appli en json
            $reponse = $this->request->input('json_decode');
            $this->Quote->create();

                if($this->Quote->save($this->request->data)){
                 return true;                   
                }

        }
        else
        { 
            // Venant du formulaire du site(cakephp)
            if($this->request->is('post')){
                $this->Quote->create();
                if($this->Quote->save($this->request->data)){

                    $this->Session->setFlash(__('La proposition à bien été prise en compte.'));
                    return $this->redirect(array("action"=>"index"));
                }
                $this->Session->setFlash(__('Il nous est malheureusement impossible de prendre en compte votre proposition.'));
            }
        }
    }

Mais je il semble que je n'arrive pas à le faire correctement, auriez vous des suggestions ?
Merci

10 réponses


connected
Réponse acceptée

Bonjour,

il faudrait que tu debug $this->request->data pour savoir les données en entrée qui viennent de ta requête ajax.

Bon courage.

Azorgh
Réponse acceptée

Tu fais simplement un

$this->set(array(
  'message'=>$this->request->data,
  '_serialize'=>array('message')
));

Et tu regardes la réponse dans la console de ton navigateur. (Onglet Network)

Frank Drebin
Auteur
Réponse acceptée

J'ai réussi, je vous remerci tous pour l'aide que vous m'avez apporter et pr votre soutien ^^
Le probleme principale venait de :

$this->set(array(
                    'Quote'=>$this->request->data,
                    '_serialize'=>array('Quote')
                    ));
              il fallait respecter les conventions de cakephp en faisant bien attentiona  bien nommé les variables/champs en fonction de la base de données
              merci

Bonsoir,

Je vois que tu utilise la condition

$this->request->is('post');

Et bah bien joué, tu as aussi

$this->request->is('ajax');

Ca te convient ? :D

Merci pr la réponse j'essaie ça apres manger.
Je comprends que pour tester la provenance de mes données ce que tu me proposes est pour le coup utile.
Mais à force de lire des pages d'exemples et de docs je me dis qu'il manque surement un morceau de code de ce type
à ma fonction addquote :

       $this->set(array(
            '_serialize' => array('message')
        ));

Et que du coup le fait de simplement envoyer les données de mon appli vers le site, avec cet ajout de code, me permet de ne passer par

$this->request->is('ajax');

pour tester la provenance des données et du coup les enregistrer avec un traitement différent.
???
Mais peut etre que je me trompe, je ne sais pas.

Bon il semblerai que du coté de l'appli au niveau du http.post, tout ce passe bien, en tout cas elle passe par la fonction .success(function(...){})
mais je n'ai rien qui s'ajoute dans la bdd du site :/ et je ne vois vraiment plus ou il pourrait y avoir un soucis, je poste le code de la fonction add du site au cas ou j'ai une erreur :

public function addquote(){
            if($this->request->is('post')){
                $this->Quote->create();
                if($this->Quote->save($this->request->data)){
                    $this->Session->setFlash(__('La proposition à bien été prise en compte.'));
                    return $this->redirect(array("action"=>"index"));
                }
                else
                {
                    $this->Session->setFlash(__('Il nous est malheureusement impossible de prendre en compte votre proposition.'));
                }
            }
            else
            {
                $this->Quote->create();
                if($this->Quote->save($this->request->data)){
                    $message = "Saved";
                }
                else
                {
                    $message = "Error";
                }
                $this->set(array(
                    'message'=>$message,
                    '_serialize'=>array('message')
                ));

            }   

    }

à noter que là, la fonction s'appel addquote(), mais quand j effectue les tests via l'appli angularjs/cordova he bien je la renome just add(), sinon il me retourne qu'il ne trouve pas la fonctione add() .
le code pr lancer le http.post au nivo de l'appli au cas ou :

$scope.sendquote = function(){
        var dataObj = {
            quote: $scope.laquote
        };
        var url = "http://localhost:8888/cakephp/sites_cake/cakephp2.6.2-tppt/quotes.json";
        var method = 'POST';
        $scope.codeStatus = "";

                    $http({
                      method: method,
                      url: url,
                      data: dataObj,
                      headers: {'Content-Type': 'application/x-www-form-urlencoded'}
                    }).
                    success(function(response) {
                        $scope.message = "SUCCESS";
                        $scope.codeStatus = response;
                    }).
                    error(function(response) {
                        $scope.message = "FAIL";
                        $scope.codeStatus = response || "Request failed";
                    });
                    return false;

    }

Et lorsque j'affiche le contenu du $scope.sodeStatus, en cas d'erreur il m'affiche bien l erreur avec son code, mais en cas de success, eh bien je ne pas, j'ai l impression qu'il affiche le contenu de la page vers laquelle pointe l'url.

Bon j'ai, je pense réussi à avancer un peut, c'est à dire que maintenant quand je fait un http.posdt de mon appli et qu'elle passe par .success,

il y a une nouvelle ligne dans la base de donnée.

Cependant, la nouvelle donnée que je veux ajouter reste vide.

Au niveau du controller de mon site en cakephp, faut-il que je sois plus précis sur le champs à renseigner avec la donée entrante ?

voici le code pour prendre l'ajout venant de cakephp :

if($this->request->is('ajax')){
                if($this->Quote->save($this->request->data)){
                    $message = "Saved";
                }
                else
                {
                    $message = "Error";
                }
                $this->set(array(
                    'message'=>$message,
                    '_serialize'=>array('message')
                ));

            }

Bonjour Frank,

Attention si la route que tu appelles côté Angular est bien ".../quotes.json", tu dois ajouter le parse de l'extension json avec Router::parseExtensions('json') dans ton fichier de routes et ne pas oublier de charger le composant RequestHandlerComponent à la liste des composants du contrôleur.

Voir : http://book.cakephp.org/2.0/fr/views/json-and-xml-views.html

Bonjour djosh, tout ça est normalment bien en place.
connected, j'ai essayer de debug $this->request->data, mais comme c'est une requete venant de l'appli je ne sais pas comment la debug une fois arrivé à la fonction addquote de cakephp :/

Alors PallMall, je viens de faire plusieurs tests, et il semble que en arrivant la requet, venant de l'appli passe dans ma premier condition et non celle censé prendre en compte les requetes venant de l'appli.
J'ai donc fais ceci (avec le morceau de code vers lequel tu m'orientes):

public function addquote(){
            if($this->request->is('post')){
                $data = $this->request->data;
                $this->set(array(
                    'appData'=>$data,
                    '_serialize'=>array('appData')
                ));
                /*$this->Quote->create();
                if($this->Quote->save($this->request->data)){

                    $this->Session->setFlash(__('La proposition à bien été prise en compte.'));
                    return $this->redirect(array("action"=>"index"));

                }

                    $this->Session->setFlash(__('Il nous est malheureusement impossible de prendre en compte votre proposition.'));*/
            }

            /*if($this->request->is('ajax')){
                $message = $this->request->data;
                if($this->Quote->save($this->request->data)){
                    $message = "Saved";
                }
                else
                {
                    $message = "Error";
                }
                $this->set(array(
                    'message'=>$message,
                    '_serialize'=>array('message')
                ));

            }*/

    }

Là j'ai bien un retour sur mon applicationqui m'affiche ceci:
{"appData":{"quote":"fghj"}}
mon soucis est maintenant de pouvoir le faire passer dans la bonne condition de traitement en second temps, et en premier temps, de savoir comment mettre dans une variable ce que me retourne le json en l'occurrence "fghj"