[PLUGINS] ~maj globale
[lhc/web/www.git] / www / plugins / formidable / http / collectionjson / formulaires_reponses.php
1 <?php
2
3 // Sécurité
4 if (!defined('_ECRIRE_INC_VERSION')) {
5 return;
6 }
7
8 /**
9 * Répondre à un formulaire Formidable en Collection+JSON
10 *
11 * Il faut avoir un id_formulaire et pouvoir y répondre.
12 *
13 * @param Request $requete
14 * @param Response $reponse
15 * @return void
16 */
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/");
21
22 // On teste si on a bien du contenu au bon format
23 if (
24 $contenu = $requete->getContent()
25 and $json = json_decode($contenu, true)
26 and is_array($json)
27 and isset($json['collection']['items'][0]['data'])
28 and $data = $json['collection']['items'][0]['data']
29 and is_array($data)
30 ) {
31 // Pour chaque champ envoyé, ça dépend ce que c'est
32 foreach ($data as $champ) {
33 if (
34 isset($champ['name'])
35 and isset($champ['value'])
36 ) {
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']);
40 }
41 // Sinon on le met dans le post pour verifier/traiter
42 set_request($champ['name'], $champ['value']);
43 }
44 }
45
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);
51
52 // On passe les erreurs dans le pipeline "verifier" (par exemple pour Saisies)
53 $erreurs = pipeline('formulaire_verifier', array(
54 'args' => array(
55 'form' => 'formidable',
56 'args' => array($id_formulaire),
57 ),
58 'data' => $erreurs,
59 ));
60
61 // S'il y a des erreurs, on va générer un JSON les listant
62 if ($erreurs) {
63 $reponse->setStatusCode(400);
64 $reponse->headers->set('Content-Type', 'application/json');
65 $reponse->setCharset('utf-8');
66
67 $json_reponse = array(
68 'collection' => array(
69 'version' => '1.0',
70 'href' => url_absolue(self('&')),
71 'error' => array(
72 'title' => _T('erreur'),
73 'code' => 400,
74 ),
75 'errors' => array(),
76 ),
77 );
78
79 foreach ($erreurs as $nom => $erreur) {
80 $json_reponse['collection']['errors'][$nom] = array(
81 'title' => $erreur,
82 'code' => 400,
83 );
84 }
85 $reponse->setContent(json_encode($json_reponse));
86 }
87 // Sinon on continue le traitement
88 else {
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);
92
93 // On passe dans le pipeline "traiter" (par exemple pour les quizz)
94 $retours_formidable = pipeline('formulaire_traiter', array(
95 'args' => array(
96 'form' => 'formidable',
97 'args' => array($id_formulaire),
98 ),
99 'data' => $retours_formidable,
100 ));
101
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);
109
110 // C'est une création, on renvoie 201
111 $reponse->setStatusCode(201);
112 }
113 }
114 // Sinon l'enregistrement n'a pas fonctionné donc erreur
115 // (TODO : il faudrait les chaînes pour les 5XX dans le plugin HTTP)
116 else {
117 $reponse = $fonction_erreur(500, $requete, $reponse);
118 }
119 }
120 }
121 // Sinon pas le droit
122 else {
123 $reponse = $fonction_erreur(403, $requete, $reponse);
124 }
125 }
126 // Sinon on ne comprend pas ce qui se passe
127 else {
128 $reponse = $fonction_erreur(415, $requete, $reponse);
129 }
130
131 return $reponse;
132 }