4 if (!defined('_ECRIRE_INC_VERSION')) {
9 * Répondre à un formulaire Formidable en Collection+JSON
11 * Il faut avoir un id_formulaire et pouvoir y répondre.
13 * @param Request $requete
14 * @param Response $reponse
17 function http_collectionjson_formulaires_reponses_post_collection_dist($requete, $reponse){
18 include_spip('inc/session');
19 include_spip('inc/autoriser');
20 $fonction_erreur = charger_fonction('erreur', "http/collectionjson/");
22 // On teste si on a bien du contenu au bon format
24 $contenu = $requete->getContent()
25 and $json = json_decode($contenu, true)
27 and isset($json['collection']['items'][0]['data'])
28 and $data = $json['collection']['items'][0]['data']
31 // Pour chaque champ envoyé, ça dépend ce que c'est
32 foreach ($data as $champ) {
35 and isset($champ['value'])
37 // Si c'est id_formulaire, on le garde de côté pour l'autorisation et pour le traitement
38 if ($champ['name'] == 'id_formulaire') {
39 $id_formulaire = intval($champ['value']);
41 // Sinon on le met dans le post pour verifier/traiter
42 set_request($champ['name'], $champ['value']);
46 // On teste l'autorisation
47 if ($id_formulaire > 0 and autoriser('repondre', 'formulaire', $id_formulaire)) {
48 // On vérifie maintenant les erreurs
49 $formidable_verifier = charger_fonction('verifier', 'formulaires/formidable');
50 $erreurs = $formidable_verifier($id_formulaire);
52 // On passe les erreurs dans le pipeline "verifier" (par exemple pour Saisies)
53 $erreurs = pipeline('formulaire_verifier', array(
55 'form' => 'formidable',
56 'args' => array($id_formulaire),
61 // S'il y a des erreurs, on va générer un JSON les listant
63 $reponse->setStatusCode(400);
64 $reponse->headers
->set('Content-Type', 'application/json');
65 $reponse->setCharset('utf-8');
67 $json_reponse = array(
68 'collection' => array(
70 'href' => url_absolue(self('&')),
72 'title' => _T('erreur'),
79 foreach ($erreurs as $nom => $erreur) {
80 $json_reponse['collection']['errors'][$nom] = array(
85 $reponse->setContent(json_encode($json_reponse));
87 // Sinon on continue le traitement
89 // On lance le traitement de la réponse
90 $formidable_traiter = charger_fonction('traiter', 'formulaires/formidable', true);
91 $retours_formidable = $formidable_traiter($id_formulaire);
93 // On passe dans le pipeline "traiter" (par exemple pour les quizz)
94 $retours_formidable = pipeline('formulaire_traiter', array(
96 'form' => 'formidable',
97 'args' => array($id_formulaire),
99 'data' => $retours_formidable,
102 // Si à la fin on a bien un identifiant de réponse
103 if ($id_formulaires_reponse = $retours_formidable['id_formulaires_reponse']) {
104 // On va cherche la fonction qui génère la vue d'une ressource
105 if ($fonction_ressource = charger_fonction('get_ressource', 'http/collectionjson/', true)) {
106 // On ajoute à la requête, l'identifiant de la nouvelle ressource
107 $requete->attributes
->set('ressource', $id_formulaires_reponse);
108 $reponse = $fonction_ressource($requete, $reponse);
110 // C'est une création, on renvoie 201
111 $reponse->setStatusCode(201);
114 // Sinon l'enregistrement n'a pas fonctionné donc erreur
115 // (TODO : il faudrait les chaînes pour les 5XX dans le plugin HTTP)
117 $reponse = $fonction_erreur(500, $requete, $reponse);
121 // Sinon pas le droit
123 $reponse = $fonction_erreur(403, $requete, $reponse);
126 // Sinon on ne comprend pas ce qui se passe
128 $reponse = $fonction_erreur(415, $requete, $reponse);