Bonjour, j'ai suivi le tutoriel d'uplaod de fichiers en drag & drop.
J'ai donc une fonction uploadAjax dans mon controller MediasController, que j'appelle avec un objet xhr pour uploader mes images.
Voici ma fonction
function admin_uploadAjax() {
$this->RequestHandler->setContent('file', 'application/json');
$file_name = $this->request->header('x-file-name');
$file_type = $this->request->header('x-file-type');
$o = new stdClass();
$source = file_get_contents('php://input');
$directory = $this->Media->getDirectory('originals');
$types = array('image/png', 'image/gif', 'image/jpeg', 'image/jpg');
if (!in_array($file_type, $types)) {
$o->error = 'Format non supporté';
}else {
if (file_put_contents($directory.$file_name, $source)) {
$o->name = $file_name;
$o->content = '<div class="col-xs-6 col-md-3"><a href="#" class="thumbnail"><img src="'.FULL_BASE_URL.'/CAKE/Cake_Location/'.$directory.$file_name.'" class="img-responsive" alt=""></a></div>';
// et on sauvegarde une nouvelle image en base
}
}
echo json_encode($o);
return $this->response;
}
Moi je souhaiterais utiliser les vues JSON pour écrire mon json en utilisant les helper. Pour générer mon image par exemple.
Si vous avez une solution à mon problème et quelques explications ou liens à me fournir sur les types de requêtes navigateurs, vous êtes tout simplement mon héro !
Tu es sur la bonne voie ! Il existe une class de vue JSON depuis Cake 2 : http://book.cakephp.org/2.0/fr/views/json-and-xml-views.html
Il n'y a pas grand chose à dire de plus : en utilisant ce principe, tu n'auras plus besoin de vérifier toi même le Content-Type, et tu pourras passer facilement tes données à tes vues JSON.
Rien d'autre à signaler pour optimiser.
Je t'avoue que sur de vieux projets, qui avaient été démarrés avant Cake2, je n'ai toujours pas mis en place ces JSON views, et ça continue de bien fonctionner avec des conditions sur is('Ajax') et sur le Content-Type : J'ai une vue dans Layouts nommée json.ctp, qui est complètement vide, et du coup j'ai simplement $this->layout = 'json'; pour que ça fonctionne de la même façon que les JSONviews de Cake2.
Le seul défaut c'est qu'on doit le faire pour chaque action de chaque controller qui doit fournir un retour JSON, alors qu'avec les JSON views, c'est automatiquement géré par Cake.
Voila :)
Avec le code de ma fonction getDirectory en bonus
public function getDirectory($dir) {
return IMAGES_URL.'medias'.DS.$dir.DS;
}