action.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. <?php
  2. global $_,$conf;
  3. switch($_['action']){
  4. /** TEMPLATE **/
  5. //Récuperation d'une liste de exportmodel
  6. case 'export_exportmodel_search':
  7. Action::write(function(&$response){
  8. global $myUser,$_;
  9. if(!$myUser->can('export','read')) throw new Exception("Permissions insuffisantes",403);
  10. require_once(__DIR__.SLASH.'ExportModel.class.php');
  11. if(isset($_['params']) && !empty($_['params'])){
  12. //Récupération export modèle avec paramètres
  13. //du plugin et jeu de données depuis le composant
  14. //d'export modèle
  15. $params = $_['params'];
  16. if(not_set_empty($params['plugin'])) throw new Exception("Il faut préciser le plugin ciblé");
  17. if(not_set_empty($params['dataset'])) throw new Exception("Il faut préciser le jeu de données à récupérer");
  18. $query = 'SELECT * FROM '.ExportModel::tableName().' WHERE plugin = ? AND dataset = ? AND (privacy = "'.ExportModel::PRIVACY_PUBLIC.'" OR (privacy = "'.ExportModel::PRIVACY_PRIVATE.'" AND creator = "'.$myUser->login.'"))';
  19. $data = array($params['plugin'], $params['dataset']);
  20. foreach(ExportModel::staticQuery($query, $data,true) as $exportmodel)
  21. $response['rows'][] = $exportmodel;
  22. } else {
  23. //Suppression de tous les exports modèles non conformes
  24. foreach(ExportModel::staticQuery('SELECT * FROM '.ExportModel::tableName().' WHERE dataset IS NULL', array(), true) as $exMdl) {
  25. ExportModel::deleteById($exMdl->id);
  26. foreach ($exMdl->documents() as $doc) {
  27. $path = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? utf8_decode($doc['path']) : $doc['path'];
  28. unlink(File::dir().$path);
  29. }
  30. }
  31. //Récupération des exports modèles pour
  32. //vue liste des exports modèle dans les
  33. //paramètres.
  34. //Récupération liste des plugins
  35. foreach (Plugin::getAll() as $plugin)
  36. $allPlug[$plugin->folder] = $plugin;
  37. //Récupération jeux de données
  38. $datasets = array();
  39. Plugin::callHook('export_model_data', array(&$datasets, array('description'=>true)));
  40. $query = 'SELECT * FROM '.ExportModel::tableName().' WHERE 1 AND (privacy = "'.ExportModel::PRIVACY_PUBLIC.'" OR (privacy = "'.ExportModel::PRIVACY_PRIVATE.'" AND creator = "'.$myUser->login.'")) ';
  41. $data = array();
  42. //Recherche simple
  43. if(!empty($_['filters']['keyword'])){
  44. $query .= ' AND (';
  45. foreach (array('filename', 'label', 'description') as $column) {
  46. $query .= $column.' LIKE ? OR ';
  47. $data[] = '%'.$_['filters']['keyword'].'%';
  48. }
  49. $query = rtrim($query, 'OR ');
  50. $query .= ')';
  51. }
  52. //Recherche avancée
  53. if(isset($_['filters']['advanced'])) filter_secure_query($_['filters']['advanced'],array('label','description','filename','plugin','privacy'),$query,$data);
  54. //Tri des colonnes
  55. if(isset($_['sort']))
  56. sort_secure_query($_['sort'],array('label','description','filename','plugin'),$query,$data);
  57. else
  58. $query .= ' ORDER BY plugin ASC, created DESC';
  59. //Pagination
  60. $response['pagination'] = ExportModel::paginate(10,(!empty($_['page'])?$_['page']:0),$query,$data);
  61. //Mise en forme des résultats
  62. foreach(ExportModel::staticQuery($query,$data,true) as $exportmodel){
  63. $row = $exportmodel->toArray(true);
  64. $row['pluginName'] = $allPlug[$exportmodel->plugin]->name;
  65. $row['datasetName'] = $datasets[$exportmodel->dataset]['label'];
  66. $row['class'] = $exportmodel->privacy==ExportModel::PRIVACY_PRIVATE ? 'private' : 'public';
  67. $row['privacy'] = $exportmodel->privacy();
  68. $response['rows'][] = $row;
  69. }
  70. }
  71. });
  72. break;
  73. //Ajout ou modification d'élément exportmodel
  74. case 'export_exportmodel_save':
  75. Action::write(function(&$response){
  76. global $myUser,$_;
  77. if(!$myUser->can('export','edit')) throw new Exception("Permissions insuffisantes",403);
  78. require_once(__DIR__.SLASH.'ExportModel.class.php');
  79. if(not_set_empty($_['label'])) throw new Exception('Champ "Libellé" obligatoire');
  80. // if(not_set_empty($_['description'])) throw new Exception('Champ "Description" obligatoire');
  81. if(not_set_empty($_['plugin'])) throw new Exception('Champ "Plugin" obligatoire');
  82. if(not_set_empty($_['dataset'])) throw new Exception('Champ "Jeu de données" obligatoire');
  83. $item = ExportModel::provide();
  84. $newItem = isset($item->id) && !empty($item->id) ? false : true;
  85. $docs = $item->documents();
  86. //Ajout des fichiers joints
  87. if(not_set_empty($_['document_temporary']) && empty($docs)) throw new Exception("Un fichier de modèle est requis");
  88. $item->label = $_['label'];
  89. $item->description = $_['description'];
  90. $item->plugin = $_['plugin'];
  91. $item->dataset = $_['dataset'];
  92. $item->privacy = $_['privacy']==1 ? ExportModel::PRIVACY_PRIVATE : ExportModel::PRIVACY_PUBLIC;
  93. $item->save();
  94. if(!empty($_['document_temporary'])){
  95. $files = json_decode($_['document_temporary'],true);
  96. if(count($files)>1) {
  97. if($newItem) ExportModel::deleteById($item->id);
  98. throw new Exception("1 seul fichier est nécessaire par export modèle");
  99. }
  100. if(count($docs)==1) {
  101. if($newItem) ExportModel::deleteById($item->id);
  102. throw new Exception("Un fichier est déjà présent pour ce modèle d'export");
  103. }
  104. foreach($files as $file){
  105. $item->filename = $file['name'];
  106. $from = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? File::temp().utf8_decode($file['path']) : File::temp().$file['path'];
  107. $to = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? utf8_decode($file['name']) : $file['name'];
  108. $fileReturn = File::move($from, 'export'.SLASH.'documents'.SLASH.$item->plugin.SLASH.$item->id.SLASH.$to);
  109. $response['relativePath'] = $fileReturn['relative'];
  110. $response['filePath'] = 'action.php?action=export_exportmodel_download_document&path='.rawurlencode($item->plugin.SLASH.$item->id.SLASH.$to);
  111. }
  112. }
  113. if(count($docs)==1) {
  114. if(empty($item->export_format)) {
  115. $ext = getExt($docs[0]['path']);
  116. $item->export_format = $ext;
  117. }
  118. $item->filename = $docs[0]['name'];
  119. }
  120. $item->export_format = !isset($_['export_format']) || empty($_['export_format']) || $_['export_format']=='none' ? $item->export_format : $_['export_format'];
  121. $item->save();
  122. $response['id'] = $item->id;
  123. Log::put("Création/Mofdification d'export modèle ".$item->toText(), "Export Modèle");
  124. });
  125. break;
  126. //Récuperation ou edition d'élément exportmodel
  127. case 'export_exportmodel_edit':
  128. Action::write(function(&$response){
  129. global $myUser,$_;
  130. if(!$myUser->can('export','edit')) throw new Exception("Permissions insuffisantes",403);
  131. require_once(__DIR__.SLASH.'ExportModel.class.php');
  132. $response = ExportModel::getById($_['id']);
  133. });
  134. break;
  135. //Suppression d'élement exportmodel
  136. case 'export_exportmodel_delete':
  137. Action::write(function(&$response){
  138. global $myUser,$_;
  139. if(!$myUser->can('export','delete')) throw new Exception("Permissions insuffisantes",403);
  140. require_once(__DIR__.SLASH.'ExportModel.class.php');
  141. $item = ExportModel::getById($_['id']);
  142. ExportModel::deleteById($item->id);
  143. $docsProps = $item->documents();
  144. foreach ($docsProps as $doc) {
  145. $path = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? utf8_decode($doc['path']) : $doc['path'];
  146. unlink(File::dir().$path);
  147. }
  148. // Décommenter pour une supression logique
  149. // $item = ExportModel::getById($_['id']);
  150. // $item->state = ExportModel::INACTIVE;
  151. // $item->save();
  152. Log::put("Suppression d'export modèle ".$item->toText(), "Export Modèle");
  153. });
  154. break;
  155. //Ajout document automatique à l'upload
  156. case 'export_exportmodel_add_document':
  157. Action::write(function(&$response){
  158. global $myUser,$_;
  159. if(!$myUser->can('export','edit')) throw new Exception("Permissions insuffisantes",403);
  160. require_once(__DIR__.SLASH.'ExportModel.class.php');
  161. $exportmodel = ExportModel::provide();
  162. if((!isset($_['plugin']) || empty($_['plugin'])) && (!isset($exportmodel->plugin) || empty($exportmodel->plugin))) throw new Exception("Vous devez d'abord définir un plugin pour importer un fichier modèle");
  163. $newItem = isset($exportmodel->id) && !empty($exportmodel->id) ? false : true;
  164. $exportmodel->plugin = $_['plugin'];
  165. $exportmodel->save();
  166. if(count($_['files'])>1) {
  167. if($newItem) ExportModel::deleteById($exportmodel->id);
  168. throw new Exception("1 seul fichier est nécessaire par export modèle");
  169. }
  170. if(count($exportmodel->documents())==1) {
  171. if($newItem) ExportModel::deleteById($exportmodel->id);
  172. throw new Exception("Un fichier est déjà présent pour ce modèle d'export");
  173. }
  174. foreach ($_['files'] as $file) {
  175. $ext = getExt($file['name']);
  176. $exportmodel->export_format = $ext;
  177. $name = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? utf8_decode($file['name']) : $file['name'];
  178. $exportmodel->filename = $file['name'];
  179. $row = File::move(File::temp().$file['path'],'export'.SLASH.'documents'.SLASH.$exportmodel->plugin.SLASH.$exportmodel->id.SLASH.$name);
  180. $row['url'] = 'action.php?action=export_exportmodel_download_document&path='.SLASH.$exportmodel->plugin.SLASH.$exportmodel->id.SLASH.rawurlencode($file['name']);
  181. $row['oldPath'] = $file['path'];
  182. $response['files'][] = $row;
  183. }
  184. $exportmodel->save();
  185. $response['ext'] = $ext;
  186. $response['id'] = $exportmodel->id;
  187. });
  188. break;
  189. //Suppression document
  190. case 'export_exportmodel_delete_document':
  191. Action::write(function(&$response){
  192. global $myUser,$_;
  193. if(!$myUser->can('export','delete')) throw new Exception("Permissions insuffisantes",403);
  194. require_once(__DIR__.SLASH.'ExportModel.class.php');
  195. if(!isset($_['path']) ) throw new Exception("Chemin non spécifié ou non numerique");
  196. $path = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? utf8_decode($_['path']) : $_['path'];
  197. //Le premier argument est un namespace de sécurité
  198. //et assure que le fichier sera toujours cloisoné dans un contexte file/export/documents
  199. File::delete('export'.SLASH.'documents',$path);
  200. $regex = "@\\".SLASH."(\d+)\\".SLASH."@i";
  201. preg_match($regex, $path, $matches);
  202. if(isset($matches[1])) ExportModel::change(array('export_format'=>NULL, 'filename'=>NULL), array('id'=>$matches[1]));
  203. Log::put("Suppression de fichier modèle : ".$_['path'], "Export Modèle");
  204. });
  205. break;
  206. //Téléchargement des documents
  207. case 'export_exportmodel_download_document':
  208. global $myUser,$_;
  209. if(!$myUser->can('export','read')) throw new Exception("Permissions insuffisantes",403);
  210. $path = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? utf8_decode($_['path']) : $_['path'];
  211. File::downloadFile(File::dir().'export'.SLASH.'documents'.SLASH.$path);
  212. Log::put("Téléchargement du fichier modèle : ".$path, "Export Modèle");
  213. break;
  214. //Téléchargement des templates d'exemple
  215. case 'export_exportmodel_download_template':
  216. global $myUser,$_;
  217. if(!$myUser->can('export','read')) throw new Exception("Permissions insuffisantes",403);
  218. if(!isset($_['extension']) || empty($_['extension'])) throw new Exception("Extension non précisée");
  219. $template = ExportModel::templates($_['extension']);
  220. $dataset = ExportModel::dataset($_['plugin'],$_['dataset']);
  221. $className = $template['handler'];
  222. $stream = $className::sample($dataset['values']);
  223. File::downloadStream($stream, $_['filename'].'.'.$template['extension'],$template['mime']);
  224. Log::put("Téléchargement d'un fichier modèle d'exemple : ".$_['filename'].'.'.$template['extension'], "Export Modèle");
  225. break;
  226. //Récupération des jeux de données en fct de params
  227. case 'export_exportmodel_list_dataset':
  228. Action::write(function(&$response){
  229. global $myUser,$_;
  230. if(!$myUser->can('export','read')) throw new Exception("Permissions insuffisantes",403);
  231. require_once(__DIR__.SLASH.'ExportModel.class.php');
  232. $params = isset($_['params']) ? $_['params'] : array();
  233. $datasets = array();
  234. Plugin::callHook('export_model_data', array(&$datasets, $params));
  235. $response['rows'] = $datasets;
  236. });
  237. break;
  238. //Récupération du détail d'un jeu de donnée
  239. case 'export_exportmodel_get_dataset':
  240. Action::write(function(&$response){
  241. global $myUser,$_;
  242. if(!$myUser->can('export','read')) throw new Exception("Permissions insuffisantes",403);
  243. require_once(__DIR__.SLASH.'ExportModel.class.php');
  244. $params = isset($_['params']) ? $_['params'] : array();
  245. if(empty($params)) throw new Exception("Aucun paramètre spécifié pour récupérer le informations du jeu de données");
  246. $plugin = $_['params']['plugin'];
  247. $dataset = $_['params']['dataset'];
  248. $params['description'] = true;
  249. $set = ExportModel::dataset($plugin, $dataset, $params);
  250. $response['dataset'] = $set['values'];
  251. foreach(ExportModel::templates() as $extension => $template){
  252. $response['files'][] = array(
  253. 'path'=>'action.php?action=export_exportmodel_download_template&plugin='.rawurlencode($plugin).'&dataset='.rawurlencode($dataset).'&extension='.$template['extension'].'&filename='.$set['label'],
  254. 'icon'=>getExtIcon($template['extension']),
  255. 'ext'=>$template['extension'],
  256. 'label'=> $set['label'].'.'.$template['extension']
  257. );
  258. }
  259. });
  260. break;
  261. //Choix du exportmodel pour export modèle
  262. case 'export_exportmodel_export':
  263. try{
  264. ob_start();
  265. global $myUser,$_;
  266. if(!$myUser->can('export','read')) throw new Exception("Permissions insuffisantes",403);
  267. require_once(__DIR__.SLASH.'ExportModel.class.php');
  268. if(!isset($_['exportmodel']) || empty($_['exportmodel']) || base64_decode($_['exportmodel']) == 'none') throw new Exception("Il faut choisir un modèle d'export");
  269. $params = isset($_['params']) ? json_decode(base64_decode($_['params']), true) : array();
  270. $params['description'] = false;
  271. $return = isset($params['destination']) && !empty($params['destination']) ? $params['destination'] : 'stream';
  272. if($exportmodel = ExportModel::getById(base64_decode($_['exportmodel']))){
  273. $plugin = $exportmodel->plugin;
  274. $dataset = $exportmodel->dataset;
  275. } else {
  276. throw new Exception("Impossible de récupérer le modèle d'export");
  277. }
  278. //Tableau de jeu de données
  279. $datasets = array();
  280. //On alimente notre tableau de jeu de données en
  281. //appelant un hook qui sera défini pour remplir le tableau
  282. Plugin::callHook('export_model_data', array(&$datasets, $params));
  283. //On a notre tableau de jeu de données rempli et on
  284. //récupère la partie de notre jeu de donnée qui nous
  285. //intéresse et on execute la fonction associée
  286. if(!isset($datasets[$dataset])) throw new Exception("Jeu de données spécifié inexistant");
  287. $currentDataset = $datasets[$dataset];
  288. $plgLines = $currentDataset['function']($params);
  289. $stdLines = ExportModel::get_standard_dataset($params);
  290. $lines = array_merge($stdLines, $plgLines);
  291. //On génère le fichier à exporter en utilisant le jeu de données
  292. //+ le fichier associé à l'exportmodel (le fichier mis en dropzone)
  293. $docsProps = $exportmodel->documents();
  294. if(empty($docsProps)) throw new Exception("Aucun fichier modèle pour le modèle d'export : ".$exportmodel->label);
  295. foreach ($docsProps as $document) {
  296. $docInfos['document'] = $document;
  297. $docInfos['format'] = $exportmodel->export_format;
  298. $ext = getExt($document['name']);
  299. $tplType = ExportModel::templates($docInfos['format']);
  300. $filename = basename($document['name'], $ext).$docInfos['format'];
  301. $fileReturn = ExportModel::merge_data_template($filename, $docInfos, $lines,$return);
  302. if($return == 'stream') {
  303. File::downloadStream($fileReturn, $filename, $tplType['mime']);
  304. } else {
  305. $filename = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? utf8_decode($filename) : $filename;
  306. $filename = autoincrement_filename($docInfos['format'], $return, $filename);
  307. $fileInfo = File::move($fileReturn, $return.$filename);
  308. $previousUrl = base64_decode($_['url']);
  309. header('location: '.$previousUrl.'&success=Export modèle correctement généré');
  310. }
  311. }
  312. Log::put("Exportation de modèle, plugin : ".$plugin.", jeu de données : ".$dataset.".", "Export Modèle");
  313. } catch(Exception $e){
  314. $previousUrl = base64_decode($_['url']);
  315. header('location: '.$previousUrl.'&error='.$e->getMessage());
  316. exit();
  317. }
  318. break;
  319. }
  320. ?>