Gestion ​_automatique_​ du download quand on ajoute l'option 'options : { download: true }' dans 'modules.json' (on peut utiliser dispatch(), il effectuera le download automatiquement si l'option 'download' vaut 'true')

This commit is contained in:
xdrm-brackets 2016-05-12 23:29:25 +02:00
parent 23c458d0b7
commit 6a8c024255
4 changed files with 132 additions and 10 deletions

View File

@ -86,7 +86,7 @@
// Lancement du téléchargement
$req = new ModuleRequest('download/phone', array('subjects'=>[1])); $req = new ModuleRequest('download/phone', array('subjects'=>[1]));
$res = $req->dispatch(); $res = $req->dispatch();

View File

@ -239,6 +239,7 @@
"phone": { "phone": {
"description": "Download des données relatives à une enquête téléphonique.", "description": "Download des données relatives à une enquête téléphonique.",
"permissions": ["admin"], "permissions": ["admin"],
"options": { "download": true },
"parameters": { "parameters": {
"subjects": { "description": "Identifiants des sujets à intégrer.", "type": "array<id>" } "subjects": { "description": "Identifiants des sujets à intégrer.", "type": "array<id>" }
} }

View File

@ -8,11 +8,15 @@
// Constantes // Constantes
public static $config_path = 'f/json/modules/conf'; public static $config_path = 'f/json/modules/conf';
public static $default_options = array(
'download' => false
);
// Attributs prives utiles (initialisation) // Attributs prives utiles (initialisation)
private $path; private $path;
private $params; private $params;
private $modules; private $modules;
private $options;
// Contiendra la reponse a la requete // Contiendra la reponse a la requete
public $answer; public $answer;
@ -85,7 +89,12 @@
return false; return false;
} }
/* [5] Construction de l'objet /* [5] Récupèration des options
=========================================================*/
$this->buildOptions();
/* [6] Construction de l'objet
=========================================================*/ =========================================================*/
$this->params = $params; $this->params = $params;
$this->error = ManagerError::Success; $this->error = ManagerError::Success;
@ -102,6 +111,11 @@
* *
*/ */
public function dispatch(){ public function dispatch(){
/* [0] Si c'est un download, on lance la methode `download()`
=========================================================*/
if( $this->options['download'] === true )
return $this->download();
/* [1] On verifie qu'aucune erreur n'a ete signalee /* [1] On verifie qu'aucune erreur n'a ete signalee
=========================================================*/ =========================================================*/
if( $this->error != ManagerError::Success ) // si il y a une erreur if( $this->error != ManagerError::Success ) // si il y a une erreur
@ -134,6 +148,67 @@
/* EXECUTE LE TRAITEMENT ASSOCIE ET RENVOIE UN FICHIER AVEC LE HEADER ET LE BODY SPECIFIE
*
*/
public function download(){
/* [1] On verifie qu'aucune erreur n'a ete signalee
=========================================================*/
if( $this->error != ManagerError::Success ) // si il y a une erreur
return new ModuleResponse($this->error); // on la passe a la reponse
/* [2] On verifie que la methode est amorcable
=========================================================*/
if( !is_callable($this->getFunctionCaller()) ){
$this->error = ManagerError::UncallableMethod;
return new ModuleResponse($this->error);
}
/* [3] On amorce la methode
=========================================================*/
$returned = call_user_func( $this->getFunctionCaller(), $this->params );
/* [4] Vérification des erreurs et paramètres
=========================================================*/
/* (1) Vérification de l'erreur retournée, si pas Success, on retourne l'erreur */
if( isset($returned['ModuleError']) && $returned['ModuleError'] != ManagerError::Success ){
$this->error = $returned['ModuleError'];
return new ModuleResponse($this->error);
}
/* (2) Vérification du contenu, si pas défini */
if( !isset($returned['body']) ){
$this->error = ManagerError::ParamError;
return new ModuleResponse($this->error);
}
/* (3) Si @headers n'est pas défini on met par défaut */
if( !isset($returned['headers']) || !is_array($returned['headers']) )
$returned['headers'] = array();
/* [5] Gestion du download
=========================================================*/
/* (1) On définit les headers */
foreach($returned['headers'] as $header=>$value)
header($header.': '.$value);
/* (2) On affiche le contenu */
echo $returned['body'];
return false;
}
/* DESERIALISATION ET CREATION D'UN OBJET /* DESERIALISATION ET CREATION D'UN OBJET
* *
* @jsonString<String> Json au format string contenant les donnees * @jsonString<String> Json au format string contenant les donnees
@ -388,6 +463,49 @@
/* AJOUT DES OPTIONS A PARTIR DE LA CONFIGURATION
*
*/
private function buildOptions(){
/* [0] On récupère les options de la méthode en cours
=========================================================*/
$method = $this->modules[$this->path['module']][$this->path['method']];
/* (1) Si 'option' n'est pas défini (ou incorrect), on met les valeurs par défaut */
if( !isset($method['options']) || !is_array($method['options']) )
return true;
/* (2) Par défaut on définit les options par défaut */
$this->options = self::$default_options;
/* (3) On récupère les options données */
$options = $method['options'];
/* [1] Gestion des différentes options
=========================================================*/
foreach($options as $option=>$value){
/* (1) On ne prend en compte l'option que si elle est dans les options par défaut */
if( !isset(self::$default_options[$option]) )
continue;
/* (2) Le type de la valeur doit être le même que celui de la valeur par défaut */
if( gettype($value) != gettype(self::$default_options[$option]) )
continue;
/* (3) Si tout est bon, on définit la valeur */
$this->options[$option] = $value;
}
return true;
}
/* RENVOI LE CHEMIN D'AMORCAGE DE LA METHODE /* RENVOI LE CHEMIN D'AMORCAGE DE LA METHODE
* *
* @return path<Array> Retourne le chemin d'amorcage de la requete * @return path<Array> Retourne le chemin d'amorcage de la requete

View File

@ -15,7 +15,6 @@
// TODO: Implémenter proprement en utilisant le système de retour + utilisant la liste de sujets dans les paramètres // TODO: Implémenter proprement en utilisant le système de retour + utilisant la liste de sujets dans les paramètres
$file_name = sessionManager::sha1($subjects[0]); $file_name = sessionManager::sha1($subjects[0]);
$phone_log = json_decode( file_get_contents(__ROOT__.'/src/upload/phone_storage/'.$file_name.'.json'), true ); $phone_log = json_decode( file_get_contents(__ROOT__.'/src/upload/phone_storage/'.$file_name.'.json'), true );
@ -102,15 +101,19 @@
$zip->close(); $zip->close();
/* [4] On lance le téléchargement /* [4] On lance le téléchargement
=========================================================*/ =========================================================*/
header("Content-type: application/zip"); return array(
header("Content-Disposition: attachment; filename=phone_data.zip"); 'ModuleError' => ManagerError::Success,
header("Pragma: no-cache"); 'headers' => array(
header("Expires: 0"); 'Content-Type' => 'application/zip',
'Content-Disposition' => 'attachment; filename=phone_data.zip',
readfile($fname); 'Pragma' => 'no-cache',
exit(); 'Expires' => '0'
),
'body' => file_get_contents($fname)
);
} }
} }