Bonjour,
Je suis entraine de développer mon site web. Pour mon lecteur j'ai fait un fichier json qui récupèrent tout mes tune. J'ai regarder la documentation sur les vue Json est j'ai pouratn suivi ce qu'ils disaient de faire. :
http://book.cakephp.org/2.0/fr/views/json-and-xml-views.html

La sortit de ce json est pas très optimisé pour facilement récupéré les donné en jquery.

Voici le résultat :

{
    "tracks": 
        {
            "Track": {
                "id": "1",
                "sc": "156372232",
                "name": "teste",
                "short_link": null,
                "online": "1"
            }
        },
        {
            "Track": {
                "id": "2",
                "sc": "154405502",
                "name": "No name",
                "short_link": null,
                "online": "1"
            }
        },
        {
            "Track": {
                "id": "3",
                "sc": "154552941",
                "name": "No name 3",
                "short_link": null,
                "online": "1"
            }
        }
    ]
}

Il y a l'index de mon model [Track] qui me cause des problèmes quand je récupère les donnée en javascript.

Moi je voudrais un fichier json comme ce ci :

{
    "tracks": 
        {
                "id": "1",
                "sc": "156372232",
                "name": "teste",
                "short_link": null,
                "online": "1"
        },
        {
                "id": "2",
                "sc": "154405502",
                "name": "No name",
                "short_link": null,
                "online": "1"
        },
        {
                "id": "3",
                "sc": "154552941",
                "name": "No name 3",
                "short_link": null,
                "online": "1"
        }
    ]
}

En jQuery je fait par exemple
data.tracks.name
et ça me sorte tout les noms des tunes.

Voici ma fonction alltrack();

public function alltrack(){
        $this->response->type('json');
        $tracks = $this->Track->find('all',array(
            'conditions' => array('Track.online'=>1),
            'fields' => array('Track.id','Track.sc','Track.name','Track.short_link','Track.online')
        ));
        $this->set(compact('tracks'));
        $this->set('_serialize',array('tracks'));
    }

dans ma vue :

<?php
foreach($tracks as $track) {
    unset($track'track']'generated_html']);
}
echo json_encode(compact('track'));

Merci de votre aide.

7 réponses


Hello,
Pourrais-tu faire un debug de la variable $tracks juste après la requête stp.

lakamark
Auteur

Voici le débug de ma variable $tracks :

array(
    (int) 0 => array(
        'Track' => array(
            'id' => '1',
            'sc' => '156372232',
            'name' => 'teste',
            'short_link' => null,
            'online' => '1'
        )
    ),
    (int) 1 => array(
        'Track' => array(
            'id' => '2',
            'sc' => '154405502',
            'name' => 'No name',
            'short_link' => null,
            'online' => '1'
        )
    ),
    (int) 2 => array(
        'Track' => array(
            'id' => '3',
            'sc' => '154552941',
            'name' => 'No name 3',
            'short_link' => null,
            'online' => '1'
        )
    )
)

Se que tu peut faire, c'est un foreach sur ce tableau et prendre uniquement l'array Track pour le remettre dans un nouveau tableau, et tu envoies ce nouveau tableau en json. Regarde du coter de array_push.

Bonjour
essaye ceci :

$tracks = Set::extract('/Track/.', $tracks);
lakamark
Auteur

Ok pour la sortit de mon tableau json c'est correcte :
dans ma fonction alltracks() après ma requête je fait ceci :

$results = Set::extract('/Track/.', $tracks);

Dans ma vue j'ai envoyer mon nouveau tableau :

<?php
echo json_encode(compact('results'));

{
    "tracks": 
        {
            "id": "1",
            "sc": "156372232",
            "name": "teste",
            "short_link": null,
            "online": "1"
        },
        {
            "id": "2",
            "sc": "154405502",
            "name": "No name",
            "short_link": null,
            "online": "1"
        },
        {
            "id": "3",
            "sc": "154552941",
            "name": "No name 3",
            "short_link": null,
            "online": "1"
        }
    ]
}

En javasrcipt comment je récupère mes donné :

$('#app').on('click','.ajax-page',function(event){
        event.preventDefault();
        $.ajax({
            url : 'http://local.dev/MusicalityMaker/tracks/alltrack.json',
            type: 'GET',
            dataType : 'json'
        }).done(function(data){
            var myobject = [data.results];
            console.log(myobject.name);
        });
    });

Quand je fait un console.log(myobject.name); par exemple. La console me retourne undefined. Normalement il devrais me retourner
le titre de la tune.

Oublie pas que c'est un tableau et pour récupérer des données dans un tableau faut utiliser un for/foreach/while ou alors préciser l'index du tableau.

for(var d in data) {
    console.log(d.name);
}

Et merci antho07, je connaissais pas cette classe Set, fort utile. ;)

Juste pour information, la classe Set est dépréciée depuis la version 2.2 de Cake. Il vaut mieux utiliser la classe Hash qui a un fonctionnement similaire: http://book.cakephp.org/2.0/fr/core-utility-libraries/hash.html !