[PLUGINS] ~maj globale
[lhc/web/www.git] / www / plugins / formidable / http / collectionjson / formulaires_reponses.php
diff --git a/www/plugins/formidable/http/collectionjson/formulaires_reponses.php b/www/plugins/formidable/http/collectionjson/formulaires_reponses.php
new file mode 100644 (file)
index 0000000..0f54a5c
--- /dev/null
@@ -0,0 +1,132 @@
+<?php
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+       return;
+}
+
+/**
+ * Répondre à un formulaire Formidable en Collection+JSON
+ * 
+ * Il faut avoir un id_formulaire et pouvoir y répondre.
+ *
+ * @param Request $requete
+ * @param Response $reponse
+ * @return void
+ */
+function http_collectionjson_formulaires_reponses_post_collection_dist($requete, $reponse){
+       include_spip('inc/session');
+       include_spip('inc/autoriser');
+       $fonction_erreur = charger_fonction('erreur', "http/collectionjson/");
+       
+       // On teste si on a bien du contenu au bon format
+       if (
+               $contenu = $requete->getContent()
+               and $json = json_decode($contenu, true)
+               and is_array($json)
+               and isset($json['collection']['items'][0]['data'])
+               and $data = $json['collection']['items'][0]['data']
+               and is_array($data)
+       ) {
+               // Pour chaque champ envoyé, ça dépend ce que c'est
+               foreach ($data as $champ) {
+                       if (
+                               isset($champ['name'])
+                               and isset($champ['value'])
+                       ) {
+                               // Si c'est id_formulaire, on le garde de côté pour l'autorisation et pour le traitement
+                               if ($champ['name'] == 'id_formulaire') {
+                                       $id_formulaire = intval($champ['value']);
+                               }
+                               // Sinon on le met dans le post pour verifier/traiter
+                               set_request($champ['name'], $champ['value']);
+                       }
+               }
+               
+               // On teste l'autorisation
+               if ($id_formulaire > 0 and autoriser('repondre', 'formulaire', $id_formulaire)) {
+                       // On vérifie maintenant les erreurs
+                       $formidable_verifier = charger_fonction('verifier', 'formulaires/formidable');
+                       $erreurs = $formidable_verifier($id_formulaire);
+               
+                       // On passe les erreurs dans le pipeline "verifier" (par exemple pour Saisies)
+                       $erreurs = pipeline('formulaire_verifier', array(
+                               'args' => array(
+                                       'form' => 'formidable',
+                                       'args' => array($id_formulaire),
+                               ),
+                               'data' => $erreurs,
+                       ));
+                       
+                       // S'il y a des erreurs, on va générer un JSON les listant
+                       if ($erreurs) {
+                               $reponse->setStatusCode(400);
+                               $reponse->headers->set('Content-Type', 'application/json');
+                               $reponse->setCharset('utf-8');
+                               
+                               $json_reponse = array(
+                                       'collection' => array(
+                                               'version' => '1.0',
+                                               'href' => url_absolue(self('&')),
+                                               'error' => array(
+                                                       'title' => _T('erreur'),
+                                                       'code' => 400,
+                                               ),
+                                               'errors' => array(),
+                                       ),
+                               );
+                               
+                               foreach ($erreurs as $nom => $erreur) {
+                                       $json_reponse['collection']['errors'][$nom] = array(
+                                               'title' => $erreur,
+                                               'code' => 400,
+                                       );
+                               }
+                               $reponse->setContent(json_encode($json_reponse));
+                       }
+                       // Sinon on continue le traitement
+                       else {
+                               // On lance le traitement de la réponse
+                               $formidable_traiter = charger_fonction('traiter', 'formulaires/formidable', true);
+                               $retours_formidable = $formidable_traiter($id_formulaire);
+                               
+                               // On passe dans le pipeline "traiter" (par exemple pour les quizz)
+                               $retours_formidable = pipeline('formulaire_traiter', array(
+                                       'args' => array(
+                                               'form' => 'formidable',
+                                               'args' => array($id_formulaire),
+                                       ),
+                                       'data' => $retours_formidable,
+                               ));
+                               
+                               // Si à la fin on a bien un identifiant de réponse
+                               if ($id_formulaires_reponse = $retours_formidable['id_formulaires_reponse']) {
+                                       // On va cherche la fonction qui génère la vue d'une ressource
+                                       if ($fonction_ressource = charger_fonction('get_ressource', 'http/collectionjson/', true)) {
+                                               // On ajoute à la requête, l'identifiant de la nouvelle ressource
+                                               $requete->attributes->set('ressource', $id_formulaires_reponse);
+                                               $reponse = $fonction_ressource($requete, $reponse);
+                                               
+                                               // C'est une création, on renvoie 201
+                                               $reponse->setStatusCode(201);
+                                       }
+                               }
+                               // Sinon l'enregistrement n'a pas fonctionné donc erreur
+                               // (TODO : il faudrait les chaînes pour les 5XX dans le plugin HTTP)
+                               else {
+                                       $reponse = $fonction_erreur(500, $requete, $reponse);
+                               }
+                       }
+               }
+               // Sinon pas le droit
+               else {
+                       $reponse = $fonction_erreur(403, $requete, $reponse);
+               }
+       }
+       // Sinon on ne comprend pas ce qui se passe
+       else {
+               $reponse = $fonction_erreur(415, $requete, $reponse);
+       }
+       
+       return $reponse;
+}