Gestion complète de l'import de sauvegarde de formulaires locaux.

This commit is contained in:
xdrm-brackets 2016-05-03 12:08:24 +02:00
parent 97e7d5425b
commit dc511fba1f
3 changed files with 110 additions and 58 deletions

View File

@ -10,29 +10,18 @@
class upload{ class upload{
/* EFFECTUE UN UPLOAD D'UN fichier
/* RENVOIE LE CHEMIN D'UN fichier
* *
* @prefix<String> Préfixe (dossier parent) du fichier * @prefix<String> Préfixe (dossier parent) du fichier
* @extension<String> Extension du fichier * @extension<String> Extension du fichier
* @file<FILE> Pointeur vers $_FILES['']
* @tester<Function> Fonction qui renvoie TRUE si le format est correct (en prenant le contenu du fichier en paramètre)
* *
* @return error<ManagerError> Retourne l'erreur attestant de l'état de l'upload * @return response<Array> Renvoie le chemin du fichier, ainsi qu'une erreur de 'ManagerError'
* *
*/ */
private static function simpleFile($prefix, $extension, $file, $tester){ private static function getPath($prefix, $extension){
// Si on est pas connecté, on retourne une erreur -> impossible via token // Si on est pas connecté, on retourne une erreur -> impossible via token
if( !connected() ) return ManagerError::PermissionError; if( !connected() ) return array( 'error' => ManagerError::PermissionError );
/* [0] On formatte les entrées
=========================================================*/
$prefix = htmlspecialchars($prefix);
// Si $prefix n'est pas au bon format
if( !preg_match('/^[a-z0-9_-]+$/', $prefix) )
return ManagerError::UploadError;
/* [1] Chargement du fichier de config /* [1] Chargement du fichier de config
=========================================================*/ =========================================================*/
@ -41,36 +30,23 @@
/* (2) Si une erreur pour le fichier de conf */ /* (2) Si une erreur pour le fichier de conf */
if( $uploadAuth === false ) if( $uploadAuth === false )
return ManagerError::UnreachableResource; return array( 'error' => ManagerError::UnreachableResource );
/* (3) On récupère la config sous forme de tableau */ /* (3) On récupère la config sous forme de tableau */
$uploadAuth = json_decode( $uploadAuth, true ); $uploadAuth = json_decode( $uploadAuth, true );
/* (4) Si erreur de PARSAGE */ /* (4) Si erreur de PARSAGE */
if( !is_array($uploadAuth) ) if( !is_array($uploadAuth) )
return ManagerError::ParsingFailed; return array( 'error' => ManagerError::ParsingFailed );
/* [2] Vérification du préfixe /* [2] Vérification du préfixe
=========================================================*/ =========================================================*/
// Si le préfixe n'est pas dans la config -> erreur // Si le préfixe n'est pas dans la config -> erreur
if( !in_array($prefix, $uploadAuth['directories']) ) if( !in_array($prefix, $uploadAuth['directories']) )
returnManagerError::UploadError; return array( 'error' => ManagerError::UploadError );
/* [3] Construction du chemin
/* [3] Vérification du format (via la fonction $tester)
=========================================================*/
/* (1) Si la fonction n'est pas une fonction, on considère que le format est bon */
if( !is_callable($tester) ) return ManagerError::Success;
/* (2) Sinon, on vérifie le format */
$file_content = file_get_contents($file['tmp_name']);
/* (3) On retourne 'FormatError' si erreur de format */
if( !$tester($file_content) ) return ManagerError::FormatError;
/* [4] Construction du chemin
=========================================================*/ =========================================================*/
/* (1) On construit le chemin */ /* (1) On construit le chemin */
$path = __ROOT__.$uploadAuth['root'].'/'.$prefix.'/'; $path = __ROOT__.$uploadAuth['root'].'/'.$prefix.'/';
@ -85,12 +61,58 @@
chdir( $path ); chdir( $path );
/* [5] Création du fichier (temporaire->permanent) /* [4] Gestion du retour
=========================================================*/
return array(
'error' => ManagerError::Success,
'path' => $path.$fileName
);
}
/* EFFECTUE UN UPLOAD D'UN fichier
*
* @prefix<String> Préfixe (dossier parent) du fichier
* @extension<String> Extension du fichier
* @file<FILE> Pointeur vers $_FILES['']
* @tester<Function> Fonction qui renvoie TRUE si le format est correct (en prenant le contenu du fichier en paramètre)
*
* @return error<ManagerError> Retourne l'erreur attestant de l'état de l'upload
*
*/
private static function simpleFile($prefix, $extension, $file, $tester){
/* [1] On récupère le chemin du fichier à créer et vérifie le dossier
=========================================================*/
$pathResponse = self::getPath($prefix, $extension);
// Si une erreur est intervenue, on la retourne
if( $pathResponse['error'] != ManagerError::Success )
return $pathResponse['error'];
/* [2] Vérification du format (via la fonction $tester)
=========================================================*/
/* (1) Si $tester est une fonction, on effectue le test */
if( is_callable($tester) ){
/* (2) Sinon, on vérifie le format */
$file_content = file_get_contents($file['tmp_name']);
/* (3) On retourne 'FormatError' si erreur de format */
if( !$tester($file_content) ) return ManagerError::FormatError;
}
/* [3] Création du fichier (temporaire->permanent)
=========================================================*/ =========================================================*/
/* (1) On déplace le fichier avec le nom formel */ /* (1) On déplace le fichier avec le nom formel */
if( move_uploaded_file($file['tmp_name'], $path.$fileName) ){ if( move_uploaded_file($file['tmp_name'], $pathResponse['path']) ){
// on modifie les droits du fichier // on modifie les droits du fichier
chmod($path.$fileName, 0774); chmod($pathResponse['path'], 0774);
return ManagerError::Success; return ManagerError::Success;
/* (2) Si une erreur occure -> 'UploadError' */ /* (2) Si une erreur occure -> 'UploadError' */
@ -292,8 +314,27 @@
/* [2] Renvoi du contenu du fichier /* [2] Renvoi du contenu du fichier
=========================================================*/ =========================================================*/
return array( /* (1) Si erreur d'upload, on la renvoie */
if( $uploadError != ManagerError::Success )
return array( 'ModuleError' => $uploadError );
/* (2) On récupère le fichier */
$responsePath = self::getPath('local_data', 'json');
// Si erreur, on la renvoie
if( $responsePath['error'] != ManagerError::Success )
return array( 'ModuleError' => $responsePath['error'] );
// On lit le fichier
$json = json_decode( file_get_contents($responsePath['path']), true );
// Si erreur de parsage, on le retourne
if( $json === false )
return ManagerError::ParsingFailed;
/* (3) On renvoie le contenu du fichier */
return array(
'ModuleError' => ManagerError::Success,
'local_data' => $json
); );
} }

View File

@ -6,4 +6,5 @@ include("/js/includes/input-phone-subject.js",function(){include("/js/includes/i
subjectManager.attach();contactManager=new inputPhoneContact($("article.contact-panel"),$("#nav-contact"));contactManager.attach(dynamicUpdate);miniManager=new inputPhoneMini($("article.mini-relation-panel"),$("#nav-mini"));miniManager.attach(dynamicUpdate);ficheManager=new inputPhoneFiche($("article.relation-panel"),$("#nav-fiche"));ficheManager.attach(dynamicUpdate);importCallLog.addEventListener("change",function(a){a={path:"upload/call_log",phone_number:$("#subject_phone_number").value,file:importCallLog.files[0]}; subjectManager.attach();contactManager=new inputPhoneContact($("article.contact-panel"),$("#nav-contact"));contactManager.attach(dynamicUpdate);miniManager=new inputPhoneMini($("article.mini-relation-panel"),$("#nav-mini"));miniManager.attach(dynamicUpdate);ficheManager=new inputPhoneFiche($("article.relation-panel"),$("#nav-fiche"));ficheManager.attach(dynamicUpdate);importCallLog.addEventListener("change",function(a){a={path:"upload/call_log",phone_number:$("#subject_phone_number").value,file:importCallLog.files[0]};
api.send(a,function(a){console.log(a);if(0==a.ModuleError){for(var b=0;b<a.directory.length;b++){var d=(null===a.directory[b].name?"":a.directory[b].name).split(" ");lsi.set("contacts",b,{uid:b,number:a.directory[b].number,username:1==d.length?d[0]:"",firstname:1<d.length?d[0]:"",lastname:1<d.length?d.splice(1).join(" "):""})}contactManager.storageToFields();dynamicUpdate(!0)}})},!1);clearAllButton.addEventListener("click",function(a){localStorage.clear();reload()},!1);$("#export-all").addEventListener("click", api.send(a,function(a){console.log(a);if(0==a.ModuleError){for(var b=0;b<a.directory.length;b++){var d=(null===a.directory[b].name?"":a.directory[b].name).split(" ");lsi.set("contacts",b,{uid:b,number:a.directory[b].number,username:1==d.length?d[0]:"",firstname:1<d.length?d[0]:"",lastname:1<d.length?d.splice(1).join(" "):""})}contactManager.storageToFields();dynamicUpdate(!0)}})},!1);clearAllButton.addEventListener("click",function(a){localStorage.clear();reload()},!1);$("#export-all").addEventListener("click",
function(a){a={subject:lsi["export"]("subject")[0],contacts:lsi["export"]("contacts"),mini:lsi["export"]("mini-fiches"),fiches:lsi["export"]("fiches")};var c=$("#download-target");c.download="local-data.json";c.href="data:application/octet-stream,"+encodeURIComponent(JSON.stringify(a));c.click()},!1);$("#import-all").addEventListener("click",function(a){$("#local-upload").click()},!1);$("#local-upload").addEventListener("change",function(a){a={path:"upload/local_data",file:$("#local-upload").files[0]}; function(a){a={subject:lsi["export"]("subject")[0],contacts:lsi["export"]("contacts"),mini:lsi["export"]("mini-fiches"),fiches:lsi["export"]("fiches")};var c=$("#download-target");c.download="local-data.json";c.href="data:application/octet-stream,"+encodeURIComponent(JSON.stringify(a));c.click()},!1);$("#import-all").addEventListener("click",function(a){$("#local-upload").click()},!1);$("#local-upload").addEventListener("change",function(a){a={path:"upload/local_data",file:$("#local-upload").files[0]};
api.send(a,function(a){console.log(a)})},!1);submitAllButton.addEventListener("click",function(a){console.log("> GATHERING ALL DATA");subjectManager.fieldsToStorage();contactManager.fieldsToStorage();miniManager.fieldsToStorage();ficheManager.fieldsToStorage();a={path:"input/phone",subject:lsi["export"]("subject")[0],contacts:lsi["export"]("contacts"),mini:lsi["export"]("mini-fiches"),fiches:lsi["export"]("fiches")};api.send(a,function(a){console.log(a)},!1)},!1)})})})}); api.send(a,function(a){console.log(a);if(0!=a.ModuleError)return!1;lsi["import"]("subject",a.local_data.subject);lsi["import"]("contacts",a.local_data.contacts);lsi["import"]("mini-fiches",a.local_data.mini);lsi["import"]("fiches",a.local_data.fiches);contactManager.storageToFields();dynamicUpdate(!0)})},!1);submitAllButton.addEventListener("click",function(a){console.log("> GATHERING ALL DATA");subjectManager.fieldsToStorage();contactManager.fieldsToStorage();miniManager.fieldsToStorage();ficheManager.fieldsToStorage();
a={path:"input/phone",subject:lsi["export"]("subject")[0],contacts:lsi["export"]("contacts"),mini:lsi["export"]("mini-fiches"),fiches:lsi["export"]("fiches")};api.send(a,function(a){console.log(a)},!1)},!1)})})})});

View File

@ -254,6 +254,7 @@ include('/js/includes/input-phone-fiche.js', function(){
}, false); }, false);
/* (6) Gestion de l'effacement des données locales /* (6) Gestion de l'effacement des données locales
---------------------------------------------------------*/ ---------------------------------------------------------*/
clearAllButton.addEventListener('click', function(e){ clearAllButton.addEventListener('click', function(e){
@ -262,6 +263,7 @@ include('/js/includes/input-phone-fiche.js', function(){
}, false); }, false);
/* (7) Gestion de l'export des données locales /* (7) Gestion de l'export des données locales
---------------------------------------------------------*/ ---------------------------------------------------------*/
$('#export-all').addEventListener('click', function(e){ $('#export-all').addEventListener('click', function(e){
@ -282,6 +284,8 @@ include('/js/includes/input-phone-fiche.js', function(){
}, false); }, false);
/* (8) Gestion de l'import des données locales /* (8) Gestion de l'import des données locales
---------------------------------------------------------*/ ---------------------------------------------------------*/
// Le bouton lance l'<input> file // Le bouton lance l'<input> file
@ -293,30 +297,36 @@ include('/js/includes/input-phone-fiche.js', function(){
// Gestion de l'upload d'une sauvegarde de formulaire local // Gestion de l'upload d'une sauvegarde de formulaire local
$('#local-upload').addEventListener('change', function(e){ $('#local-upload').addEventListener('change', function(e){
/* (1) Rédaction de la requête d'upload */ /* (1) Rédaction de la requête d'upload */
var uploadRequest = { var request = {
path: 'upload/local_data', path: 'upload/local_data',
file: $('#local-upload').files[0] file: $('#local-upload').files[0]
}; };
/* (2) Upload et réponse */ /* (2) Upload et réponse */
api.send(uploadRequest, function(uploadResponse){ api.send(request, function(response){
console.log(uploadResponse); console.log(response);
// Si erreur, on quitte
if( response.ModuleError != 0 )
return false;
/* (3) On enregistre les données dans le 'localStorage' */
lsi.import('subject', response.local_data.subject);
lsi.import('contacts', response.local_data.contacts);
lsi.import('mini-fiches', response.local_data.mini);
lsi.import('fiches', response.local_data.fiches);
/* (3) On met à jour l'affichage */
contactManager.storageToFields();
dynamicUpdate(true);
}); });
// /* (2) On les met en forme */
// var data = JSON.parse(json);
//
// /* (3) On met les données dans le 'localStorage' et on recharge la page */
// console.log(data);
// lsi.import('subject', data.subject);
// lsi.import('contacts', data.contacts);
// lsi.import('mini-fiches', data.mini);
// lsi.import('fiches', data.fiches);
}, false); }, false);
/* (9) Gestion de la validation et de l'envoi des données /* (9) Gestion de la validation et de l'envoi des données
---------------------------------------------------------*/ ---------------------------------------------------------*/
submitAllButton.addEventListener('click', function(e){ submitAllButton.addEventListener('click', function(e){