PageRenderTime 58ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/_plugins_/forms/forms_et_tables_3_0/core/action/forms_editer_donnee.php

https://bitbucket.org/pombredanne/spip-zone-treemap
PHP | 327 lines | 230 code | 20 blank | 77 comment | 49 complexity | 67bb1de00664e46d6cabf92c2258b57a MD5 | raw file
  1. <?php
  2. /*
  3. * forms
  4. * Gestion de formulaires editables dynamiques
  5. *
  6. * Auteurs :
  7. * Antoine Pitrou
  8. * Cedric Morin
  9. * Renato
  10. * (c) 2005-2009 - Distribue sous licence GNU/GPL
  11. *
  12. */
  13. include_spip('base/abstract_sql');
  14. include_spip('inc/forms');
  15. /**
  16. * Lister les insertions en base pour un champ de la donnee
  17. *
  18. * @param int $id_form
  19. * @param int $id_donnee
  20. * @param string $champ
  21. * @param string $type
  22. * @param unknown_type $val
  23. * @param string $erreur
  24. * @param bool $ok
  25. * @return array
  26. */
  27. function forms_donnee_inserer_un_champ($id_form,$id_donnee,$champ,$type,$val,&$inserts,&$erreur,&$ok){
  28. if ($type == 'fichier') {
  29. if (($val = $_FILES[$champ]) AND ($val['tmp_name'])) {
  30. // Fichier telecharge : deplacer dans IMG, stocker le chemin dans la base
  31. $dir = sous_repertoire(_DIR_IMG, "protege");
  32. $dir = sous_repertoire($dir, "form".$id_form);
  33. $source = $val['tmp_name'];
  34. $dest = $dir.forms_nommer_fichier_form($val['name'], $dir);
  35. if (!forms_deplacer_fichier_form($source, $dest)) {
  36. $erreur[$champ] = _T("forms:probleme_technique_upload");
  37. $ok = false;
  38. }
  39. else {
  40. $inserts[] = array("id_donnee"=>$id_donnee, "champ"=>$champ, "valeur"=>$dest);
  41. }
  42. }
  43. // Cas de la mise a jour pour laquelle on dispose deja d'un fichier uploade !
  44. elseif ( ($val=forms_valeurs($id_donnee,$id_form,$champ)) != NULL ) {
  45. $inserts[] = array("id_donnee"=>$id_donnee, "champ"=>$champ, "valeur"=>$val[$champ]);
  46. }
  47. }
  48. else if (is_array($val) OR strlen($val)) {
  49. // Choix multiples : enregistrer chaque valeur separement
  50. if (is_array($val))
  51. foreach ($val as $v){
  52. if (strlen($v))
  53. $inserts[] = array("id_donnee"=>$id_donnee, "champ"=>$champ, "valeur"=>$v);
  54. }
  55. elseif (strlen($val))
  56. $inserts[] = array("id_donnee"=>$id_donnee, "champ"=>$champ, "valeur"=>$val);
  57. }
  58. return $inserts;
  59. }
  60. /**
  61. * Modifier une donnee. Renvoie le nombre de valeurs inserees pour la donnee
  62. *
  63. * @param int $id_form
  64. * @param int $id_donnee
  65. * @param array $erreur
  66. * @param array $c
  67. * @param array $structure
  68. * @return int
  69. */
  70. function forms_donnee_modifier($id_form,$id_donnee,&$erreur, $c = NULL, $structure = NULL){
  71. if (!$structure)
  72. $structure = forms_structure($id_form);
  73. $inserts = array();
  74. $champs_mod = array();
  75. $valeurs = array();
  76. $champs = array();
  77. foreach($structure as $champ=>$infos){
  78. if (!$c){
  79. if ($infos['type'] == 'fichier' AND isset($_FILES[$champ]['tmp_name']))
  80. $val = $_FILES[$champ];
  81. else
  82. $val = _request($champ);
  83. }
  84. else
  85. $val = isset($c[$champ])?$c[$champ]:NULL;
  86. if ($val!==NULL
  87. AND (($infos['type']!=='password') OR strlen($val))){
  88. if (isset($GLOBALS['forms_table_des_filtres_edition'][$infos['type']])){
  89. $filtre = reset($GLOBALS['forms_table_des_filtres_edition'][$infos['type']]);
  90. $filtre = str_replace("%s",'$val',$filtre);
  91. eval("\$val = $filtre;");
  92. }
  93. $valeurs[$champ] = $val;
  94. $champs[$champ] = $infos;
  95. }
  96. }
  97. // Envoyer aux plugins
  98. $valeurs = pipeline('forms_pre_edition_donnee',
  99. array(
  100. 'args' => array(
  101. 'id_form' => $id_form,
  102. 'id_donnee' => $id_donnee,
  103. 'champs' => $champs
  104. ),
  105. 'data' => $valeurs
  106. )
  107. );
  108. foreach($valeurs as $champ=>$val){
  109. $champs_mod[] = $champ;
  110. // un plugin a pu ajouter un 'champ factice' a enregistrer, non defini dans la structure
  111. $type = isset($champs[$champ]['type'])?$champs[$champ]['type']:"";
  112. forms_donnee_inserer_un_champ($id_form,$id_donnee,$champ,$type,$val,$inserts,$erreur,$ok);
  113. }
  114. if (!count($erreur)){
  115. if (count($champs_mod))
  116. sql_delete("spip_forms_donnees_champs",sql_in("champ",$champs_mod)." AND id_donnee=".intval($id_donnee));
  117. if (count($inserts))
  118. sql_insertq_multi("spip_forms_donnees_champs",$inserts);
  119. // Envoyer aux plugins apres enregistrement
  120. $valeurs = pipeline('forms_post_edition_donnee',
  121. array(
  122. 'args' => array(
  123. 'id_form' => $id_form,
  124. 'id_donnee' => $id_donnee,
  125. 'champs' => $champs
  126. ),
  127. 'data' => $valeurs
  128. )
  129. );
  130. }
  131. return count($inserts);
  132. }
  133. /**
  134. * Revision d'une donnee
  135. *
  136. * @param int $id_donnee
  137. * @param array $c
  138. * @return array
  139. */
  140. function forms_revision_donnee($id_donnee, $c = NULL) {
  141. include_spip('base/abstract_sql');
  142. $inserts = array();
  143. if (!$row = sql_fetsel("id_form","spip_forms_donnees","id_donnee=".intval($id_donnee))
  144. OR !$id_form = $row['id_form']
  145. OR !$structure = forms_structure($id_form)
  146. )
  147. return array('message_erreur' => _T("forms:probleme_technique"));
  148. include_spip("inc/forms_type_champs");
  149. $erreur = forms_valide_conformite_champs_reponse_post($id_form, $id_donnee, $c, $structure);
  150. if (!$erreur)
  151. forms_donnee_modifier($id_form,$id_donnee,$erreur, $c, $structure);
  152. if (count($erreur))
  153. spip_log("erreur: ".serialize($erreur));
  154. return $erreur;
  155. }
  156. /**
  157. * Determinier le rang de la prochaine donnee
  158. *
  159. * @param unknown_type $id_form
  160. * @return unknown
  161. */
  162. function forms_donnee_prochain_rang($id_form){
  163. $rang = 1;
  164. if ($row = sql_fetsel("max(rang) AS rang_max","spip_forms_donnees","id_form=".intval($id_form)))
  165. $rang = $row['rang_max']+1;
  166. return $rang;
  167. }
  168. /**
  169. * Enregistrer la saisie d'un formulaire
  170. *
  171. * @param int $id_form
  172. * @param int $id_donnee
  173. * @param array $erreur
  174. * @param string $reponse
  175. * @param string $script_validation
  176. * @param string $script_args
  177. * @param array $c
  178. * @param int $rang
  179. * @return string
  180. */
  181. function forms_enregistrer_reponse_formulaire($id_form, &$id_donnee, &$erreur, &$reponse, $script_validation = 'valide_form', $script_args='', $c=NULL, $rang=NULL) {
  182. $r = '';
  183. if (!is_array($erreur)) $erreur = array();
  184. include_spip('inc/autoriser');
  185. if (!$row = sql_fetsel("*","spip_forms","id_form=".intval($id_form))) {
  186. $erreur['message_erreur'] = _T("forms:probleme_technique");
  187. }
  188. $moderation = $row['moderation'];
  189. // Extraction des donnees pour l'envoi des mails eventuels
  190. // accuse de reception et forward webmaster
  191. $email = unserialize($row['email']);
  192. $champconfirm = $row['champconfirm'];
  193. $mailconfirm = '';
  194. include_spip("inc/forms_type_champs");
  195. $erreur = array_merge($erreur,
  196. forms_valide_champs_reponse_post($id_form, $id_donnee, $c));
  197. // Si tout est bon, enregistrer la reponse
  198. if (!count($erreur)) {
  199. $id_auteur = isset($GLOBALS['visiteur_session']['id_auteur']) ? intval($GLOBALS['visiteur_session']['id_auteur']) : 0;
  200. $url = (_DIR_RESTREINT==_DIR_RESTREINT_ABS)?parametre_url(self(),'id_form',''):_DIR_RESTREINT_ABS;
  201. if ($id_donnee<0) $url = parametre_url($url,'id_donnee','');
  202. $ok = true;
  203. $confirme = false;
  204. $id = _request("deja_enregistre_$id_form", $c);
  205. if ($id = intval($id)){
  206. $id_donnee = $id;
  207. $ok = false;
  208. $confirme = true;
  209. }
  210. $nom_cookie = forms_nom_cookie_form($id_form);
  211. if (isset($_COOKIE[$nom_cookie]))
  212. $cookie = $_COOKIE[$nom_cookie];
  213. else {
  214. include_spip("inc/acces");
  215. $cookie = creer_uniqid();
  216. }
  217. if ($row['type_form']=='sondage')
  218. $confirmation = 'attente';
  219. else
  220. $confirmation = 'valide';
  221. if ($moderation == 'posteriori')
  222. $statut='publie';
  223. else {
  224. $statut = 'prop';
  225. foreach(array('prepa','prop','publie','refuse') as $s)
  226. if (autoriser(
  227. 'instituer',
  228. (in_array($row['type_form'],array('','sondage'))?'form':$row['type_form']).'_donnee',
  229. 0,NULL,array('id_form'=>$id_form,'statut'=>'prepa','nouveau_statut'=>$s))){
  230. $statut = $s;
  231. break;
  232. }
  233. }
  234. // D'abord creer la reponse dans la base de donnees
  235. if ($ok) {
  236. if ($id_donnee>0 AND autoriser('modifier', 'donnee', $id_donnee, NULL, array('id_form'=>$id_form))){
  237. sql_updateq("spip_forms_donnees",
  238. array("ip"=>$GLOBALS['ip'],"url"=>$url,"confirmation"=>$confirmation,"cookie"=>$cookie),
  239. "id_donnee=".intval($id_donnee));
  240. } elseif (autoriser('creer', 'donnee', 0, NULL, array('id_form'=>$id_form))){
  241. if ($rang==NULL) $rang = array('rang'=>forms_donnee_prochain_rang($id_form));
  242. elseif(!is_array($rang)) $rang=array('rang'=>$rang);
  243. $id_donnee = sql_insertq("spip_forms_donnees",
  244. array_merge(
  245. array(
  246. "id_form"=>$id_form,
  247. "id_auteur"=>$id_auteur,
  248. "date"=>"NOW()",
  249. "ip"=>$GLOBALS['ip'],
  250. "url"=>$url,
  251. "confirmation"=>$confirmation,
  252. "statut"=>$statut,
  253. "cookie"=>$cookie),
  254. $rang)
  255. );
  256. # cf. GROS HACK inc/forms_tables_affichage
  257. # rattrapper les documents associes a cette nouvelle donnee
  258. # ils ont un id = 0-id_auteur
  259. sql_updateq("spip_documents_donnees",array("id_donnee"=>$id_donnee),"id_donnee = ".(0-intval($GLOBALS['auteur_session']['id_auteur'])));
  260. # cf. GROS HACK 2 balise/forms
  261. # rattrapper les donnees associes a cette nouvelle donnee
  262. # ils ont un id = 0-id_auteur
  263. sql_updateq("spip_forms_donnees_donnees",array("id_donnee"=>$id_donnee),"id_donnee = ".(0-intval($GLOBALS['auteur_session']['id_auteur'])));
  264. }
  265. if (!($id_donnee>0)) {
  266. $erreur['message_erreur'] = _T("forms:probleme_technique");
  267. $ok = false;
  268. }
  269. else {
  270. $_GET["deja_enregistre_$id_form"] = $id_donnee;
  271. }
  272. }
  273. // Puis enregistrer les differents champs
  274. if ($ok) {
  275. if (!forms_donnee_modifier($id_form,$id_donnee,$erreur, $c)) {
  276. // Reponse vide => annuler
  277. $erreur['message_erreur'] = _T("forms:remplir_un_champ");
  278. if(!sql_countsel("spip_forms_donnees_champs","id_donnee=".intval($id_donnee)))
  279. sql_delete("spip_forms_donnees","id_donnee=".intval($id_donnee));
  280. $ok = false;
  281. }
  282. }
  283. if ($ok || $confirme) {
  284. if ($champconfirm
  285. AND $row=sql_fetsel("valeur","spip_forms_donnees_champs","id_donnee=".intval($id_donnee)." AND champ=".sql_quote($champconfirm)))
  286. $mailconfirm = $row['valeur'];
  287. if (
  288. (is_array($email) AND strlen(reset($email)))
  289. OR ($mailconfirm)
  290. ) {
  291. include_spip("inc/session");
  292. $hash = md5("forms confirme reponse $id_donnee $cookie ".hash_env());
  293. $url = generer_url_public($script_validation,"mel_confirm=oui&id_donnee=$id_donnee&hash=$hash".($script_args?"&$script_args":""));
  294. $r = $url;
  295. if ($mailconfirm) $reponse = $mailconfirm;
  296. }
  297. if ($row['type_form']=='sondage') {
  298. include_spip("inc/session");
  299. $hash = md5("forms valide reponse sondage $id_donnee $cookie ".hash_env());
  300. $url = generer_url_public($script_validation,"verif_cookie=oui&id_donnee=$id_donnee&hash=$hash".($script_args?"&$script_args":""));
  301. $r = $url;
  302. }
  303. }
  304. }
  305. return $r;
  306. }
  307. ?>