action.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. <?php
  2. global $_,$conf;
  3. switch($_['action']){
  4. /** TEMPLATE **/
  5. //Récuperation d'une liste de exportmodel
  6. case 'export_model_search':
  7. Action::write(function(&$response){
  8. global $myUser,$_;
  9. User::check_access('export','read');
  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(!isset($params['plugin']) || empty($params['plugin'])) throw new Exception("Il faut préciser le plugin ciblé");
  17. if(!isset($params['dataset']) || empty($params['dataset'])) throw new Exception("Il faut préciser le jeu de données à récupérer");
  18. $query = "SELECT * FROM {{table}} WHERE plugin = ? AND dataset = ? AND (privacy = ? OR (privacy = ? AND creator = ?)) ORDER BY label ASC";
  19. $data = array($params['plugin'], $params['dataset'], ExportModel::PRIVACY_PUBLIC, ExportModel::PRIVACY_PRIVATE,$myUser->login);
  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 {{table}} WHERE dataset IS NULL', array(), true) as $exMdl) {
  25. ExportModel::deleteById($exMdl->id);
  26. foreach ($exMdl->documents() as $doc) {
  27. $path = (get_OS() === '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 *
  41. FROM {{table}}
  42. WHERE (privacy = ? OR (privacy = ? AND creator = ?)) ';
  43. $data = array(ExportModel::PRIVACY_PUBLIC,ExportModel::PRIVACY_PRIVATE,$myUser->login);
  44. //Recherche simple
  45. if(!empty($_['filters']['keyword'])){
  46. $query .= ' AND (';
  47. foreach (array('filename', 'label', 'description') as $column) {
  48. $query .= $column.' LIKE ? OR ';
  49. $data[] = '%'.$_['filters']['keyword'].'%';
  50. }
  51. $query = rtrim($query, 'OR ');
  52. $query .= ')';
  53. }
  54. //Recherche avancée
  55. if(isset($_['filters']['advanced'])) filter_secure_query($_['filters']['advanced'],array('label','description','slug','filename','plugin','privacy'),$query,$data);
  56. //Tri des colonnes
  57. if(isset($_['sort']))
  58. sort_secure_query($_['sort'],array('label','description','slug','filename','plugin'),$query,$data);
  59. else
  60. $query .= ' ORDER BY plugin ASC, created DESC';
  61. //Pagination
  62. $response['pagination'] = ExportModel::paginate(20,(!empty($_['page'])?$_['page']:0),$query,$data);
  63. //Mise en forme des résultats
  64. foreach(ExportModel::staticQuery($query,$data,true) as $exportmodel){
  65. $row = $exportmodel->toArray(true);
  66. $row['pluginName'] = $allPlug[$exportmodel->plugin]->name;
  67. $row['datasetName'] = isset($datasets[$exportmodel->dataset]) ? $datasets[$exportmodel->dataset]['label'] : $exportmodel->dataset;
  68. $row['class'] = $exportmodel->privacy==ExportModel::PRIVACY_PRIVATE ? 'private' : 'public';
  69. $row['privacy'] = $exportmodel->privacy();
  70. $row['icon'] = !empty($exportmodel->export_format) ? getExtIcon($exportmodel->export_format) : getExtIcon(getExt($exportmodel->filename));
  71. $response['rows'][] = $row;
  72. }
  73. }
  74. });
  75. break;
  76. case 'export_model_format_refresh':
  77. Action::write(function(&$response){
  78. global $myUser,$_;
  79. User::check_access('export','edit');
  80. require_once(__DIR__.SLASH.'ExportModel.class.php');
  81. $response['rows'] = array();
  82. switch($_['ext']){
  83. case 'html':
  84. $response['rows'][] = array('uid' => 'html', 'label' => 'HTML');
  85. $response['rows'][] = array('uid' => 'pdf', 'label' => 'PDF');
  86. break;
  87. default:
  88. break;
  89. }
  90. });
  91. break;
  92. //Ajout ou modification d'élément exportmodel
  93. case 'export_model_save':
  94. Action::write(function(&$response){
  95. global $myUser,$_;
  96. User::check_access('export','edit');
  97. require_once(__DIR__.SLASH.'ExportModel.class.php');
  98. if(!isset($_['label']) || empty($_['label'])) throw new Exception('Champ "Libellé" obligatoire');
  99. if(!isset($_['plugin']) || empty($_['plugin'])) throw new Exception('Champ "Plugin" obligatoire');
  100. if(!isset($_['dataset']) || empty($_['dataset'])) throw new Exception('Champ "Jeu de données" obligatoire');
  101. $item = ExportModel::provide();
  102. $_['slug'] = !empty($_['slug']) ? slugify($_['slug']) : (!empty($item->slug) ? $item->slug : slugify($_['label']));
  103. if(!empty($_['slug']) && ExportModel::load(array('slug'=>$_['slug'], 'id:!='=>$item->id))) throw new Exception("Le slug (".$_['slug'].") est déjà utilisé pour un autre export modèle");
  104. $newItem = isset($item->id) && !empty($item->id) ? false : true;
  105. $docs = $item->documents();
  106. //Ajout des fichiers joints
  107. if((!isset($_['document_temporary']) || empty($_['document_temporary'])) && empty($docs)) throw new Exception("Un fichier de modèle est requis");
  108. $item->label = $_['label'];
  109. $item->description = $_['description'];
  110. $item->plugin = $_['plugin'];
  111. $item->dataset = $_['dataset'];
  112. $item->slug = $_['slug'];
  113. $item->privacy = $_['privacy']==1 ? ExportModel::PRIVACY_PRIVATE : ExportModel::PRIVACY_PUBLIC;
  114. $item->save();
  115. if(!empty($_['document_temporary'])){
  116. $files = json_decode($_['document_temporary'],true);
  117. if(count($files)>1) {
  118. if($newItem) ExportModel::deleteById($item->id);
  119. throw new Exception("1 seul fichier est nécessaire par export modèle");
  120. }
  121. if(count($docs)==1) {
  122. if($newItem) ExportModel::deleteById($item->id);
  123. throw new Exception("Un fichier est déjà présent pour ce modèle d'export");
  124. }
  125. foreach($files as $file){
  126. $item->filename = $file['name'];
  127. $from = (get_OS() === 'WIN') ? File::temp().utf8_decode($file['path']) : File::temp().$file['path'];
  128. $to = (get_OS() === 'WIN') ? utf8_decode($file['name']) : $file['name'];
  129. $fileReturn = File::move($from, 'export'.SLASH.'documents'.SLASH.$item->plugin.SLASH.$item->id.SLASH.$to);
  130. $response['relativePath'] = $fileReturn['relative'];
  131. $response['filePath'] = 'action.php?action=export_model_download_document&path='.rawurlencode($item->plugin.SLASH.$item->id.SLASH.$to);
  132. }
  133. }
  134. if(count($docs)==1) {
  135. if(empty($item->export_format)) {
  136. $ext = getExt($docs[0]['path']);
  137. $item->export_format = $ext;
  138. }
  139. $item->filename = $docs[0]['name'];
  140. }
  141. $item->export_format = !isset($_['export_format']) || empty($_['export_format']) || $_['export_format']=='none' ? $item->export_format : $_['export_format'];
  142. $item->save();
  143. $response['id'] = $item->id;
  144. Log::put("Création/Modification d'export modèle ".$item->toText(), "Export Modèle");
  145. });
  146. break;
  147. //Récuperation ou edition d'élément exportmodel
  148. case 'export_model_edit':
  149. Action::write(function(&$response){
  150. global $myUser,$_;
  151. User::check_access('export','edit');
  152. require_once(__DIR__.SLASH.'ExportModel.class.php');
  153. $response = ExportModel::getById($_['id']);
  154. });
  155. break;
  156. //Suppression d'élement exportmodel
  157. case 'export_model_delete':
  158. Action::write(function(&$response){
  159. global $myUser,$_;
  160. User::check_access('export','delete');
  161. require_once(__DIR__.SLASH.'ExportModel.class.php');
  162. $item = ExportModel::getById($_['id']);
  163. ExportModel::deleteById($item->id);
  164. $docsProps = $item->documents();
  165. foreach ($docsProps as $doc) {
  166. $path = (get_OS() === 'WIN') ? utf8_decode($doc['path']) : $doc['path'];
  167. unlink(File::dir().$path);
  168. }
  169. // Décommenter pour une supression logique
  170. // $item = ExportModel::getById($_['id']);
  171. // $item->state = ExportModel::INACTIVE;
  172. // $item->save();
  173. Log::put("Suppression d'export modèle ".$item->toText(), "Export Modèle");
  174. });
  175. break;
  176. //Ajout document automatique à l'upload
  177. case 'export_model_add_document':
  178. Action::write(function(&$response){
  179. global $myUser,$_;
  180. User::check_access('export','edit');
  181. require_once(__DIR__.SLASH.'ExportModel.class.php');
  182. $exportmodel = ExportModel::provide();
  183. 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");
  184. $newItem = isset($exportmodel->id) && !empty($exportmodel->id) ? false : true;
  185. $exportmodel->plugin = $_['plugin'];
  186. $exportmodel->save();
  187. if(count($_['files'])>1) {
  188. if($newItem) ExportModel::deleteById($exportmodel->id);
  189. throw new Exception("1 seul fichier est nécessaire par export modèle");
  190. }
  191. if(count($exportmodel->documents())==1) {
  192. if($newItem) ExportModel::deleteById($exportmodel->id);
  193. throw new Exception("Un fichier est déjà présent pour ce modèle d'export");
  194. }
  195. foreach ($_['files'] as $file) {
  196. $ext = getExt($file['name']);
  197. $exportmodel->export_format = $ext;
  198. $name = (get_OS() === 'WIN') ? utf8_decode($file['name']) : $file['name'];
  199. $exportmodel->filename = $file['name'];
  200. $row = File::move(File::temp().$file['path'],'export'.SLASH.'documents'.SLASH.$exportmodel->plugin.SLASH.$exportmodel->id.SLASH.$name);
  201. $row['url'] = 'action.php?action=export_model_download_document&path='.SLASH.$exportmodel->plugin.SLASH.$exportmodel->id.SLASH.rawurlencode($file['name']);
  202. $row['oldPath'] = $file['path'];
  203. $row['ext'] = $file['ext'];
  204. $response['files'][] = $row;
  205. }
  206. $exportmodel->save();
  207. $response['ext'] = $ext;
  208. $response['id'] = $exportmodel->id;
  209. });
  210. break;
  211. //Suppression document
  212. case 'export_model_delete_document':
  213. Action::write(function(&$response){
  214. global $myUser,$_;
  215. User::check_access('export','delete');
  216. require_once(__DIR__.SLASH.'ExportModel.class.php');
  217. if(!isset($_['path']) ) throw new Exception("Chemin non spécifié ou non numerique");
  218. $path = (get_OS() === 'WIN') ? utf8_decode($_['path']) : $_['path'];
  219. //Le premier argument est un namespace de sécurité
  220. //et assure que le fichier sera toujours cloisoné dans un contexte file/export/documents
  221. File::delete('export'.SLASH.'documents',$path);
  222. $regex = "@\\".SLASH."(\d+)\\".SLASH."@i";
  223. preg_match($regex, $path, $matches);
  224. if(isset($matches[1])) ExportModel::change(array('export_format'=>NULL, 'filename'=>NULL), array('id'=>$matches[1]));
  225. Log::put("Suppression de fichier modèle : ".$_['path'], "Export Modèle");
  226. });
  227. break;
  228. //Téléchargement des documents
  229. case 'export_model_download_document':
  230. global $myUser,$_;
  231. User::check_access('export','read');
  232. $path = (get_OS() === 'WIN') ? utf8_decode($_['path']) : $_['path'];
  233. File::downloadFile(File::dir().'export'.SLASH.'documents'.SLASH.$path);
  234. Log::put("Téléchargement du fichier modèle : ".$path, "Export Modèle");
  235. break;
  236. //Téléchargement des templates d'exemple
  237. case 'export_model_download_template':
  238. global $myUser,$_;
  239. User::check_access('export','read');
  240. if(!isset($_['extension']) || empty($_['extension'])) throw new Exception("Extension non précisée");
  241. $template = ExportModel::templates($_['extension']);
  242. $dataset = ExportModel::dataset($_['plugin'],$_['dataset']);
  243. $className = $template['handler'];
  244. $instance = new $className();
  245. $stream = $instance->sample($dataset['values']);
  246. File::downloadStream($stream, $_['filename'].'.'.$template['extension'],$template['mime']);
  247. Log::put("Téléchargement d'un fichier modèle d'exemple : ".$_['filename'].'.'.$template['extension'], "Export Modèle");
  248. break;
  249. //Récupération du détail d'un jeu de donnée
  250. case 'export_model_get_dataset':
  251. Action::write(function(&$response){
  252. global $myUser,$_;
  253. User::check_access('export','read');
  254. require_once(__DIR__.SLASH.'ExportModel.class.php');
  255. $params = isset($_['params']) ? $_['params'] : array();
  256. if(empty($params)) throw new Exception("Aucun paramètre spécifié pour récupérer le informations du jeu de données");
  257. $plugin = $_['params']['plugin'];
  258. $dataset = $_['params']['dataset'];
  259. $params['description'] = true;
  260. $set = ExportModel::dataset($plugin, $dataset, $params);
  261. $response['dataset'] = $set['values'];
  262. foreach(ExportModel::templates() as $extension => $template){
  263. $response['files'][] = array(
  264. 'path'=>'action.php?action=export_model_download_template&plugin='.rawurlencode($plugin).'&dataset='.rawurlencode($dataset).'&extension='.$template['extension'].'&filename='.$set['label'],
  265. 'icon'=>getExtIcon($template['extension']),
  266. 'ext'=>$template['extension'],
  267. 'label'=> $set['label'].'.'.$template['extension']
  268. );
  269. }
  270. });
  271. break;
  272. //Choix du exportmodel pour export modèle
  273. case 'export_model_export':
  274. Action::write(function(&$response){
  275. global $myUser,$_;
  276. User::check_access('export','read');
  277. require_once(__DIR__.SLASH.'ExportModel.class.php');
  278. $parameters = isset($_['parameters']) ? $_['parameters'] : array();
  279. if(!isset($parameters['model']) || empty($parameters['model'])) throw new Exception("Il faut choisir un modèle d'export");
  280. $response['parameters'] = $parameters;
  281. $parameters['description'] = false;
  282. //Récuperation du fichier modèle sélectionné
  283. $model = ExportModel::getById($parameters['model']);
  284. if(!$model) throw new Exception("Impossible de récupérer le modèle d'export");
  285. //Récuperation des données brutes tout dataset confondus
  286. $datasets = array();
  287. Plugin::callHook('export_model_data', array(&$datasets, $parameters));
  288. //On récupère uniquement le dataset qui nous intéresse et on execute la fonction associée
  289. if(!isset($datasets[$model->dataset])) throw new Exception("Jeu de données spécifié inexistant");
  290. $dataset = $datasets[$model->dataset];
  291. //On ajoute les données standard (comptes connecté etc..) aux set de donnée à associer au template
  292. $dataset = array_merge_recursive(ExportModel::get_standard_dataset($parameters), $dataset['function']($parameters));
  293. //On génère le fichier à exporter en utilisant le jeu de données ($datas)
  294. //+ le fichier associé à l'exportmodel (le fichier mis en dropzone)
  295. $templates = $model->documents();
  296. if(empty($templates)) throw new Exception("Aucun fichier modèle pour le modèle d'export : ".$model->label);
  297. foreach ($templates as $document) {
  298. $ext = getExt($document['name']);
  299. //Type d'export (csv, excel, html, word ...)
  300. $type = ExportModel::templates($model->export_format);
  301. $filename = basename($document['name'], $ext).$model->export_format;
  302. $filePath = (get_OS() === 'WIN') ? utf8_decode($document['path']) : $document['path'];
  303. //Les types d'export prennent toujours de l'utf8 en entrée
  304. $stream = file_get_contents(File::dir().$filePath);
  305. if(mb_detect_encoding($stream, 'UTF-8', true) == false) $stream = utf8_encode($stream);
  306. $datas = ExportModel::rawData($dataset);
  307. //Gestion macros dans le titre
  308. $filename = ExportModel::export('TextExport', $filename, $datas, $parameters);
  309. //On exporte le jeux de donnée pour le flux modèle séelctionné
  310. $stream = ExportModel::export($type['handler'], $stream, $datas, $parameters);
  311. Log::put("Exportation de modèle, plugin : ".$model->plugin.", jeu de données : ".$model->dataset.".", "Export Modèle");
  312. if(empty($parameters['destination']) || $parameters['destination'] == 'stream') {
  313. $response['filename'] = $filename;
  314. $response['type'] = $type['mime'];
  315. File::downloadStream($stream, utf8_decode($filename), $type['mime']);
  316. exit();
  317. } else {
  318. //@TODO: Gérer le / et \ à replace avec SLASH pour compatibilité serveur en fct de l'OS
  319. $filename = preg_replace('#[\<\>\?\|\*\:\\\/\"\'\,]#i', '-', $filename);
  320. $filename = (get_OS() === 'WIN') ? utf8_decode($filename) : $filename;
  321. $filename = autoincrement_filename($model->export_format, $parameters['destination'], $filename);
  322. $response['filename'] = (get_OS() === 'WIN') ? utf8_encode($filename) : $filename;
  323. $finalPath = File::dir().$parameters['destination'];
  324. if(!file_exists($finalPath)) mkdir($finalPath,0755,true);
  325. $fileInfo = file_put_contents($finalPath.$filename, $stream);
  326. }
  327. }
  328. });
  329. break;
  330. }
  331. ?>