PageRenderTime 63ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/_plugins_/fabrique/formulaires/fabriquer_plugin_actions.php

https://bitbucket.org/pombredanne/spip-zone-treemap
PHP | 380 lines | 218 code | 60 blank | 102 comment | 17 complexity | a710377e9268dd16826a1234a2c672ed MD5 | raw file
  1. <?php
  2. /**
  3. * Gestion des différentes actions du formulaire de construction de
  4. * plugin de la fabrique
  5. *
  6. * @package SPIP\Fabrique\Formulaires
  7. */
  8. if (!defined("_ECRIRE_INC_VERSION")) return;
  9. /**
  10. * Éffectue l'action demandée sur le formulaire de construction de plugin
  11. *
  12. * @param string $f_action
  13. * Nom de l'action dans le constructeur de plugin de la fabrique,
  14. * tel que 'ajouter_objet', 'supprimer_champ', ...
  15. * @param array $data
  16. * Données de construction du plugin
  17. * @return
  18. * Tableau de retour de traitement du formulaire
  19. **/
  20. function fabrique_action_modification_formulaire($f_action, $data) {
  21. // name="f_action[type]" ou "f_action[type][id]"
  22. $type_action = current(array_keys($f_action));
  23. $valeur_action = $f_action[$type_action];
  24. $message = '';
  25. switch ($type_action) {
  26. // Deplacement d'un objet (avec ui.tabs + ui.sortable)
  27. case "taborder":
  28. // la tab paquet, on s'en fiche
  29. $order = array_diff($a = explode(',', $valeur_action), array('paquet'));
  30. $order = array_values($order); // renumeroter
  31. $images = session_get(FABRIQUE_ID_IMAGES);
  32. $new_objets = array();
  33. $new_images = array();
  34. foreach ($order as $nom) {
  35. $j = substr($nom, 5); // enlever 'objet' de 'objet2'
  36. $new_objets[] = $data ['objets'][$j];
  37. $new_images[] = $images['objets'][$j];
  38. }
  39. $data ['objets'] = $new_objets;
  40. $images['objets'] = $new_images;
  41. session_set(FABRIQUE_ID, $data);
  42. session_set(FABRIQUE_ID_IMAGES, $images);
  43. $message = _T('fabrique:objet_deplace');
  44. break;
  45. // Deplacement d'un champ (avec ui.accordion + ui.sortable)
  46. case "champorder":
  47. $i = current(array_keys($valeur_action)); // numero d'objet
  48. $order = explode(',', $valeur_action[$i]);
  49. $order = array_values($order); // renumeroter
  50. $new_champs = array();
  51. foreach ($order as $nom) {
  52. $noms = explode('-', $nom);
  53. $j = substr(array_pop($noms), 5); // enlever 'objetX-champ' de 'objet1-champ2'
  54. $new_champs[] = $data['objets'][$i]['champs'][$j];
  55. }
  56. $data['objets'][$i]['champs'] = $new_champs;
  57. session_set(FABRIQUE_ID, $data);
  58. $message = _T('fabrique:champ_deplace');
  59. break;
  60. // Ajout d'un objet
  61. case "ajouter_objet":
  62. // on ajoute un element a l'objet et a l'image.
  63. $images = session_get(FABRIQUE_ID_IMAGES);
  64. $data ['objets'][] = array();
  65. $images['objets'][] = array();
  66. session_set(FABRIQUE_ID, $data);
  67. session_set(FABRIQUE_ID_IMAGES, $images);
  68. // on ouvre sur la nouvelle tab
  69. set_request('open_tab', count($data['objets']));
  70. $message = _T('fabrique:objet_ajoute');
  71. break;
  72. // Suppression d'un objet
  73. case "supprimer_objet":
  74. // l'objet a supprimer est dans [supprimer_objet][i]
  75. $i = current(array_keys($valeur_action));
  76. // on supprime l'element i de l'objet et des images.
  77. $images = session_get(FABRIQUE_ID_IMAGES);
  78. unset($data ['objets'][$i]);
  79. unset($images['objets'][$i]);
  80. array_values($data ['objets']);
  81. array_values($images['objets']);
  82. session_set(FABRIQUE_ID, $data);
  83. session_set(FABRIQUE_ID_IMAGES, $images);
  84. // on supprime l'accordion ouvert (sinon il se reouvre sur l'onglet suppression).
  85. $accordion = _request('open_accordion');
  86. unset($accordion[$i+1]);
  87. set_request('open_accordion', $accordion);
  88. $message = _T('fabrique:objet_supprime');
  89. break;
  90. // Renseigner un objet depuis une table SQL
  91. case "renseigner_objet":
  92. // l'objet a renseigner est dans [renseigner_objet][i]
  93. $i = current(array_keys($valeur_action));
  94. $data['objets'][$i] = fabrique_renseigner_objet($data['objets'][$i]);
  95. session_set(FABRIQUE_ID, $data);
  96. // on ouvre du coup le 2e accordion par defaut.
  97. $accordion = _request('open_accordion');
  98. $accordion[$i+1] = 1;
  99. set_request('open_accordion', $accordion);
  100. $message = _T('fabrique:objet_renseigne');
  101. break;
  102. // Supprimer un logo
  103. case "supprimer_logo":
  104. // i = paquet/logo | objet/n/logo_32
  105. $i = current(array_keys($valeur_action));
  106. $i = explode('/', $i);
  107. $type = array_shift($i);
  108. $images = session_get(FABRIQUE_ID_IMAGES);
  109. if (isset($images[$type])) {
  110. if (count($i) == 2) {
  111. unset ($images[$type][ $i[0] ][ $i[1] ]); // paquet/logo/0
  112. } elseif (count($i) == 3) {
  113. unset ($images[$type][ $i[0] ][ $i[1] ][ $i[2] ]); // obje/x/logo/0
  114. }
  115. }
  116. session_set(FABRIQUE_ID_IMAGES, $images);
  117. $message = _T('fabrique:image_supprimee');
  118. break;
  119. // Effacer les chaines de langue d'un objet
  120. case "reinitialiser_chaines":
  121. $i = current(array_keys($valeur_action));
  122. $data['objets'][$i]['chaines'] = array();
  123. session_set(FABRIQUE_ID, $data);
  124. $message = _T('fabrique:objet_chaines_reinitialisees');
  125. break;
  126. // Effacer les autorisations d'un objet
  127. case "reinitialiser_autorisations":
  128. $i = current(array_keys($valeur_action));
  129. $data['objets'][$i]['autorisations'] = array();
  130. session_set(FABRIQUE_ID, $data);
  131. $message = _T('fabrique:objet_autorisations_reinitialisees');
  132. break;
  133. // Ajouter un champ dans un objet
  134. case "ajouter_champ":
  135. $i = current(array_keys($valeur_action));
  136. $data['objets'][$i]['champs'][] = array();
  137. session_set(FABRIQUE_ID, $data);
  138. $message = _T('fabrique:champ_ajoute');
  139. break;
  140. // Ajouter un champ dans un objet
  141. case "supprimer_champ":
  142. $o = current(array_keys($valeur_action));
  143. $c = current(array_keys($valeur_action[$o]));
  144. unset($data['objets'][$o]['champs'][$c]);
  145. array_values($data['objets'][$o]['champs']);
  146. session_set(FABRIQUE_ID, $data);
  147. $message = _T('fabrique:champ_supprime');
  148. break;
  149. // par defaut, c'est qu'on s'est mal compris !
  150. default:
  151. $message = _T('fabrique:action_incomprise', array('f_action'=>$f_action));
  152. break;
  153. }
  154. // on ne prend pas les champs postes
  155. // pour que le charger() ajoute bien toutes les infos
  156. // supplementaires a nos tableaux (images, raccourcis...)
  157. set_request('objets', null);
  158. set_request('paquet', null);
  159. return array(
  160. 'editable'=>'oui',
  161. 'message_ok' => $message,
  162. );
  163. }
  164. /**
  165. * Récupère les images uploadés et les stocke dans la session
  166. *
  167. * @param array $data
  168. * Données de construction du plugin
  169. * @return void
  170. **/
  171. function fabrique_recuperer_et_stocker_les_images($data) {
  172. // on stocke l'image dans local/ pour les traitements d'image
  173. sous_repertoire(_DIR_VAR, FABRIQUE_VAR_SOURCE);
  174. // logo du plugin
  175. // _FILES[paquet][name][logo][taille]
  176. // _FILES[objets][name][n][logo][taille] n : numero de l'objet
  177. foreach (array('paquet', 'objets') as $type) {
  178. // aucun objet declarer, pas la peine de chercher le reste.
  179. if (!isset($_FILES[$type])) continue;
  180. // on cherche s'il y a une numero d'objet intercale dans le tableau.
  181. $prof = !isset($_FILES[$type]['name']['logo']); // paquet : 0 / objet : 1
  182. $names = $prof ? $_FILES[$type]['name'] : array($_FILES[$type]['name']);
  183. if (is_array($names)) { // au premier objet, c'est pas forcement la
  184. foreach ($names as $c => $name) {
  185. foreach ($name['logo'] as $taille => $fichier) {
  186. // un fichier est envoye ?
  187. if ($fichier) {
  188. $erreur = $_FILES[$type]['error'];
  189. $erreur = $prof ? $erreur[$c]['logo'][$taille] : $erreur['logo'][$taille];
  190. if (!$erreur) {
  191. $ext = explode('.', $fichier);
  192. $ext = array_pop($ext);
  193. $tmp_name = $_FILES[$type]['tmp_name'];
  194. $tmp_name = $prof ? $tmp_name[$c]['logo'][$taille] : $tmp_name['logo'][$taille];
  195. $contenu = spip_file_get_contents($tmp_name);
  196. $images = session_get(FABRIQUE_ID_IMAGES);
  197. $desc = array(
  198. 'extension' => $ext,
  199. 'contenu' => base64_encode($contenu)
  200. );
  201. if ($prof) { // on est dans l'objet
  202. $obj = table_objet($data['objets'][$c]['table']);
  203. $dest = _DIR_VAR . FABRIQUE_VAR_SOURCE . $data['paquet']['prefixe'] . '_' . $obj . '_' . $taille . '.' . $ext;
  204. ecrire_fichier($dest, $contenu);
  205. $desc['fichier'] = $dest;
  206. $images[$type][$c]['logo'][$taille] = $desc;
  207. } else {
  208. $dest = _DIR_VAR . FABRIQUE_VAR_SOURCE . $data['paquet']['prefixe'] . '_' . $taille . '.' . $ext;
  209. ecrire_fichier($dest, $contenu);
  210. $desc['fichier'] = $dest;
  211. $images[$type]['logo'][$taille] = $desc;
  212. }
  213. session_set(FABRIQUE_ID_IMAGES, $images);
  214. }
  215. }
  216. }
  217. }
  218. }
  219. }
  220. }
  221. /**
  222. * Sauvegarder 10 exports de chaque plugins (en se basant sur le prefixe)
  223. * ce qui permet de restaurer de vieilles versions.
  224. *
  225. * @note
  226. * Attention, cela ne sauve que le fichier d'export / import pour la Fabrique.
  227. *
  228. * @param string $fichier
  229. * Fichier source à sauver
  230. * @param string $destination
  231. * Répertoire de backup
  232. * @return void
  233. **/
  234. function fabrique_sauvegarde_tournante_export($fichier, $destination) {
  235. $destination .= 'exports';
  236. sous_repertoire_complet($destination);
  237. // pas de deux points dans les systemes de fichiers Windows
  238. $date = date("Y-m-d H-i-s");
  239. $base = basename($fichier, '.php');
  240. $copie = $base . ' ' . $date . '.php';
  241. $fichiers =
  242. new RegexIterator(
  243. new DirectoryIterator($destination), '/fabrique_' . substr($base, 9) . '.*\.php$/');
  244. // trier par date les fichiers
  245. $tri = array();
  246. foreach ($fichiers as $f) {
  247. $tri[$f->getMTime()] = $f->getPathname();
  248. }
  249. // enlever les vieux
  250. krsort($tri);
  251. $tri = array_slice($tri, 9);
  252. foreach ($tri as $f) {
  253. supprimer_fichier($f);
  254. }
  255. copy($fichier, $destination . '/' . $copie);
  256. }
  257. /**
  258. * Générer un diff entre la précédente génération
  259. * du plugin et cette nouvelle création
  260. *
  261. * Ce diff est affiché ensuite au retour du formulaire de création
  262. * et également stocké dans le plugin crée, dans le fichier 'fabrique_diff.diff'
  263. *
  264. * @param string $ancien
  265. * Chemin du répertoire de l'ancienne création de plugin
  266. * @param string $nouveau
  267. * Chemin du répertoire de la nouvelle création
  268. * @param string $prefixe
  269. * Préfixe du plugin construit
  270. * @return void
  271. **/
  272. function fabrique_generer_diff($ancien, $nouveau, $prefixe) {
  273. if (is_dir($ancien)) {
  274. include_spip('inc/fdiff');
  275. $fdiff = new Fdiff($ancien, $nouveau);
  276. $fdiff->add_ignorer(array("fabrique_diff.diff", "fabrique_".$prefixe.".php"));
  277. $tab = $fdiff->get_diff();
  278. $diff = $tab["diff"];
  279. $diff_humain = $tab["affiche"];
  280. $suppressions = $tab["suppressions"];
  281. ecrire_fichier($nouveau . 'fabrique_diff.diff', $diff);
  282. // coloration si le plugin 'coloration_code' est la
  283. $diff = propre("<cadre class='diff'>\n$diff_humain\n</cadre>");
  284. set_request('message_diff', $diff);
  285. if ($suppressions) {
  286. set_request('message_diff_suppressions', $suppressions);
  287. }
  288. }
  289. }
  290. /**
  291. * Exécute (uniquement si webmestre) des scripts saisis dans le formulaire
  292. * de création de plugin.
  293. *
  294. * @param string $quoi
  295. * Nom du type de script
  296. * @param array $data
  297. * Données de construction du plugin
  298. * @param array $contexte
  299. * Variables disponibles pour les scripts (nom => valeur)
  300. * @return null|void
  301. * Null si le type de script n'est pas trouvé ou pas d'autorisation
  302. * Void sinon.
  303. **/
  304. function fabrique_executer_script($quoi, $data, $contexte = array()) {
  305. if (!isset($data['paquet']['scripts'][$quoi])
  306. OR !$script = trim($data['paquet']['scripts'][$quoi])) {
  307. return;
  308. }
  309. // juste les webmestres pour executer des scripts, sinon ce ne serait pas tres securise
  310. static $autoriser = null;
  311. if (is_null($autoriser)) {
  312. $autoriser = autoriser('webmestre');
  313. }
  314. if (!$autoriser) {
  315. return;
  316. }
  317. extract($contexte);
  318. eval($script);
  319. }
  320. ?>