/branches/v1.7-croissant/jrest/services/ImportXLS.php |
---|
38,6 → 38,10 |
//define('NB_LIRE_LIGNE_SIMUL', 30); |
define('NB_LIRE_LIGNE_SIMUL', 5); |
// en cas d'import d'un fichier CSV, utilise fgetcsv() plutôt |
// que PHPExcel ce qui se traduit par un gain de performances très substanciel |
define('QUICK_CSV_IMPORT', TRUE); |
// Numbers of days between January 1, 1900 and 1970 (including 19 leap years) |
// see traiterDateObs() |
// define("MIN_DATES_DIFF", 25569); |
152,6 → 156,8 |
// erreurs d'import |
public $bilan = Array(); |
// cache (pour traiterLocalisation() pour l'instant) |
static $cache = Array('geo' => array()); |
function ImportXLS($config) { |
parent::__construct($config); |
204,7 → 210,14 |
$objReader->setReadDataOnly(true); |
// TODO: is_a obsolete entre 5.0 et 5.3, retirer le @ à terme |
if(@is_a($objReader, 'PHPExcel_Reader_CSV')) { |
$IS_CSV = @is_a($objReader, 'PHPExcel_Reader_CSV') && QUICK_CSV_IMPORT; |
// en cas d'usage de fgetcsv, testons que nous pouvons compter les lignes |
if($IS_CSV) $nb_lignes = intval(exec("wc -l $fichier")); |
// et, le cas échéant, fallback sur PHPExcel à nouveau. La raison de ce test ici est |
// l'instabilité du serveur (safe_mode, safe_mode_exec_dir, symlink vers binaires pour exec(), ... multiples points-of-failure) |
if($IS_CSV && !$nb_lignes) $IS_CSV = FALSE; |
if($IS_CSV) { |
$objReader->setDelimiter(',') |
->setEnclosure('"') |
->setLineEnding("\n") |
218,11 → 231,22 |
$objPHPExcel = $objReader->load($fichier); |
$obj_infos = $objReader->listWorksheetInfo($fichier); |
if($IS_CSV) { |
// $nb_lignes est déjà défini ci-dessus |
$csvFileHandler = fopen($fichier, 'r'); |
// nous utilisons la valeur de retour dans un but informatif de l'utilisateur à la |
// fin de l'import, *mais aussi* dans un array_diff_key() ci-dessous car bien que dans le |
// fond le "parser" fgetcsv() n'ait pas d'intérêt à connaître les colonnes à ignorer, |
// il se trouve que celles-ci peuvent interférer sur des fonctions comme traiterEspece() |
// cf test "ref-nom-num.test.php" pour lequel l'élément C_NOM_SEL vaudrait 3 et $ligne serait array(3 => -42) |
$filtre->exclues = self::detectionEntete(fgetcsv($csvFileHandler), TRUE); |
} else { |
// XXX: indépendant du readFilter ? |
$nb_lignes = $obj_infos[0]['totalRows']; |
$donnees = $objPHPExcel->getActiveSheet()->toArray(NULL, FALSE, TRUE, TRUE); |
$filtre->exclues = self::detectionEntete($donnees[1]); |
} |
$obs_ajouts = 0; |
$obs_maj = 0; |
235,10 → 259,13 |
// on catch to les trigger_error(E_USER_NOTICE); |
set_error_handler(array($this, 'erreurs_stock'), E_USER_NOTICE); |
$this->taxon_info_webservice = new RechercheInfosTaxonBeta($this->config, NULL); |
// lecture par morceaux (chunks), NB_LIRE_LIGNE_SIMUL lignes à fois |
// pour aboutir des requêtes SQL d'insert groupés. |
for($ligne = 2; $ligne < $nb_lignes + NB_LIRE_LIGNE_SIMUL; $ligne += NB_LIRE_LIGNE_SIMUL) { |
if(!$IS_CSV) { |
$filtre->def_interval($ligne, NB_LIRE_LIGNE_SIMUL); |
$objReader->setReadFilter($filtre); |
256,12 → 283,23 |
$objPHPExcel->getStyle(C_ZONE_GEO . '2:' . C_ZONE_GEO . $objPHPExcel->getHighestRow())->getNumberFormat()->setFormatCode('00000'); |
$donnees = $objPHPExcel->toArray(NULL, FALSE, TRUE, TRUE); |
} |
else { |
$i = NB_LIRE_LIGNE_SIMUL; |
$donnees = array(); |
while($i--) { |
$tab = fgetcsv($csvFileHandler); |
if(!$tab) continue; |
$donnees[] = array_diff_key($tab, $filtre->exclues); |
} |
} |
// var_dump($donnees, get_defined_constants(true)['user']);die; |
// ici on appel la fonction qui fera effectivement l'insertion multiple |
// à partir des (au plus) NB_LIRE_LIGNE_SIMUL lignes |
// TODO: passer $this, ne sert que pour appeler des méthodes publiques qui pourraient être statiques |
// notamment dans RechercheInfosTaxonBeta.php |
list($enregistrements, $images, $mots_cle) = |
self::chargerLignes($this, $donnees, $this->colonnes_statiques, $dernier_ordre); |
if(! $enregistrements) break; |
284,7 → 322,7 |
$donnees = array(); |
foreach($enregistrements as $e) $donnees = array_merge($donnees, array_values($e)); |
/* debug ici: echo $sql_pattern . "\n"; var_dump($enregistrements, $donnees); die;*/ |
// echo $sql_pattern . "\n"; var_dump($enregistrements, $donnees); die; // debug ici |
$stmt->execute($donnees); |
320,7 → 358,18 |
die(); |
} |
static function detectionEntete($entete) { |
/* detectionEntete() sert deux rôles: |
1) détecter le type de colonne attendu à partir des textes de la ligne d'en-tête afin de define() |
2) permet d'identifier les colonnes non-supportées/inutiles afin d'alléger le processus de parsing de PHPExcel |
grace au ReadFilter (C'est le rôle de la valeur de retour) |
La raison de la présence du paramètre $numeric_keys est que pour réussir à identifier les colonnes à exclure nous |
devons traiter un tableau représentant la ligne d'en-tête aussi bien: |
- sous forme associative pour PHPExcel (les clefs sont les lettres de l'alphabet) |
- sous forme de clefs numériques (fgetcsv()) |
Le détecter après coup est difficile et pourtant cette distinction est importante car le comportement |
d'array_merge() (réordonnancement des clefs numérique) n'est pas souhaitable dans le second cas. */ |
static function detectionEntete($entete, $numeric_keys = FALSE) { |
$colonnes_reconnues = Array(); |
$cols = FormateurGroupeColonne::nomEnsembleVersListeColonnes('standard,avance'); |
foreach($entete as $k => $v) { |
363,6 → 412,9 |
// ==> Array ( S => Ordre, AA => Phénologie ) |
$colonnesID_a_exclure = array_intersect($entete, $colonnes_automatiques); |
if($numeric_keys) { |
return $colonnesID_non_reconnues + $colonnesID_a_exclure; |
} |
// TODO: pourquoi ne pas comparer avec les abbrevs aussi ? |
// merge ( Array( I => rien ) , Array ( S => Ordre, AA => Phénologie ) ) |
// ==> Array ( I => rien, AA => Phénologie ) |
379,6 → 431,9 |
$tous_mots_cle = Array(); |
foreach($lignes as $ligne) { |
// dans le cas de fgetcsv, on peut avoir des false additionnel (cf do/while l. 279) |
if($ligne === false) continue; |
//$ligne = array_filter($ligne, function($cell) { return !is_null($cell); }); |
//if(!$ligne) continue; |
// on a besoin des NULL pour éviter des notice d'index indéfini |
480,7 → 535,7 |
// $espece est rempli de plusieurs informations |
$espece = Array(C_NOM_SEL => NULL, C_NOM_SEL_NN => NULL, C_NOM_RET => NULL, |
C_NOM_RET_NN => NULL, C_NT => NULL, C_FAMILLE => NULL); |
self::traiterEspece($ligne, $espece, $referentiel, $cel); |
self::traiterEspece($ligne, $espece, $referentiel, $cel->taxon_info_webservice); |
if(!$espece[C_NOM_SEL]) $referentiel = Cel::$fallback_referentiel; |
if($espece[C_NOM_SEL] && !$espece[C_NOM_SEL_NN]) $referentiel = Cel::$fallback_referentiel; |
690,7 → 745,7 |
TODO: s'affranchir du webservice pour la détermination du nom scientifique en s'appuyant sur cel_references, |
pour des questions de performances |
*/ |
static function traiterEspece($ligne, Array &$espece, &$referentiel, $cel) { |
static function traiterEspece($ligne, Array &$espece, &$referentiel, $taxon_info_webservice) { |
if(empty($ligne[C_NOM_SEL])) { |
// TODO: nous ne déclarons pas "Numéro nomenclatural" comme colonne importable |
// Nous ne pouvons donc pas tenter d'être sympa sur la détermination par num_nom |
705,7 → 760,7 |
// XXX/attention, nous ne devrions pas accepter un référentiel absent ! |
if(!$referentiel) $referentiel = 'bdtfx'; |
$taxon_info_webservice = new RechercheInfosTaxonBeta($cel->config, $referentiel); |
$taxon_info_webservice->setReferentiel($referentiel); |
$ascii = iconv('UTF-8', 'ASCII//TRANSLIT', $ligne[C_NOM_SEL]); |
// TODO: si empty(C_NOM_SEL) et !empty(C_NOM_SEL_NN) : recherche info à partir de C_NOM_SEL_NN |
811,11 → 866,18 |
$identifiant_commune = trim($ligne[C_ZONE_GEO]); |
if(!$identifiant_commune) { |
$departement = trim($ligne[C_CE_ZONE_GEO]); |
if(strpos($departement, "INSEE-C:", 0) === 0) { |
$localisation[C_CE_ZONE_GEO] = trim($ligne[C_CE_ZONE_GEO]); |
if(array_key_exists($localisation[C_CE_ZONE_GEO], self::$cache['geo'])) { |
$localisation[C_ZONE_GEO] = self::$cache['geo'][$localisation[C_CE_ZONE_GEO]]; |
} |
else { |
$nom = Cel::db()->requeter(sprintf("SELECT nom FROM cel_zones_geo WHERE code = %s LIMIT 1", |
self::quoteNonNull(substr($localisation[C_CE_ZONE_GEO], strlen("INSEE-C:"))))); |
if($nom) $localisation[C_ZONE_GEO] = $nom[0]['nom']; |
self::$cache['geo'][$localisation[C_CE_ZONE_GEO]] = @$nom[0]['nom']; |
} |
return; |
} |
824,10 → 886,21 |
return; |
} |
if( ($resultat_commune = Cel::db()->requeter(sprintf("SELECT DISTINCT nom, CONCAT('INSEE-C:', code) AS code FROM cel_zones_geo WHERE code = %s LIMIT 1", |
$cache_attempted = FALSE; |
if(array_key_exists($departement, self::$cache['geo'])) { |
$cache_attempted = TRUE; |
if(self::$cache['geo'][$departement][0] && self::$cache['geo'][$departement][1]) { |
$localisation[C_ZONE_GEO] = self::$cache['geo'][$departement][0]; |
$localisation[C_CE_ZONE_GEO] = self::$cache['geo'][$departement][1]; |
return; |
} |
} |
if(! $cache_attempted && ($resultat_commune = Cel::db()->requeter(sprintf("SELECT DISTINCT nom, CONCAT('INSEE-C:', code) AS code FROM cel_zones_geo WHERE code = %s LIMIT 1", |
self::quoteNonNull($departement)))) ) { |
$localisation[C_ZONE_GEO] = $resultat_commune[0]['nom']; |
$localisation[C_CE_ZONE_GEO] = $resultat_commune[0]['code']; |
self::$cache['geo'][$departement] = array($resultat_commune[0]['nom'], $resultat_commune[0]['code']); |
return; |
} |
; |
871,7 → 944,14 |
$requete = sprintf("%s WHERE nom LIKE %s", $select, self::quoteNonNull($nom_commune.'%')); |
} |
if(array_key_exists($identifiant_commune, self::$cache['geo'])) { |
$resultat_commune = self::$cache['geo'][$identifiant_commune]; |
} |
else { |
$resultat_commune = Cel::db()->requeter($requete); |
self::$cache['geo'][$identifiant_commune] = $resultat_commune; |
} |
// TODO: levenstein sort ? |
// TODO: count résultat ! |
/branches/v1.7-croissant/jrest/services/InventoryObservationList.php |
---|
78,7 → 78,7 |
return; |
} |
$obs = array_filter(array_map('intval', explode(',', $uid[1]))); |
$obs = array_filter(explode(',', $uid[1]), 'is_numeric'); |
if(count($obs) == 0) { |
return; |
} |
/branches/v1.7-croissant/jrest/php.ini |
---|
New file |
0,0 → 1,3 |
;; import CSV: 55000 observations en 3 minutes 40. |
;; réglons donc ceci à 5 minutes |
max_execution_time = 300 |
/branches/v1.7-croissant/jrest/lib/GestionObservation.php |
---|
293,11 → 293,8 |
if ($resultat_suppression_observations === false) { |
$this->logger("CEL_bugs","Erreur de suppression d'une liste d'observations : ".$resultat_suppression_observations); |
} |
else |
{ |
$requete_supression_lien_obs_images = 'DELETE FROM cel_obs_images WHERE '. |
'id_utilisateur = '.Cel::db()->proteger($utilisateur).' '. |
'AND id_observation IN ('.$chaine_ids_obs.')'; |
else { |
$requete_supression_lien_obs_images = 'DELETE FROM cel_obs_images WHERE id_observation IN ('.$chaine_ids_obs.')'; |
$resultat_suppression_liens = Cel::db()->executerRequeteSimple($requete_supression_lien_obs_images); |
304,8 → 301,7 |
if ($resultat_suppression_liens === false) { |
$this->logger("CEL_bugs","Erreur de suppression d'une liste de liaison entre observations et images : ".$requete_supression_lien_obs_images); |
} |
else |
{ |
else { |
$retour = true; |
} |
316,8 → 312,7 |
if ($resultat_suppression_mots_cles === false) { |
$this->logger("CEL_bugs","Erreur de suppression d'une liste de mots clés d'observation(s) : ".$resultat_suppression_mots_cles); |
} |
else |
{ |
else { |
$retour = true; |
} |
} |
/branches/v1.7-croissant/jrest/lib/RechercheInfosTaxonBeta.php |
---|
19,6 → 19,8 |
*/ |
class RechercheInfosTaxonBeta extends Cel { |
const DEBUG = FALSE; |
private $url_service_nom = null; |
private $url_service_taxon = null; |
private $url_service_chorologie = null; |
30,10 → 32,18 |
// si l'espèce passée a le motif <ref>:(nt|nn):<num>, eg: isfan:nt:1591 |
public $is_notation_spe = FALSE; |
// un cache utilisé pour les requêtes effectuées sur /service:eflore:0.1/bdtfx/noms?masque= |
// qui sont lourdes, et parfois identiques (cf cas de l'import XLS) |
static $cache = array(); |
public function RechercheInfosTaxonBeta($config, $code_referentiel = 'bdtfx') { |
parent::__construct($config); |
$this->setReferentiel($code_referentiel); |
} |
public function setReferentiel($code_referentiel = 'bdtfx') { |
$this->code_referentiel = $code_referentiel; |
$this->formaterUrlsServices($config); |
$this->formaterUrlsServices($this->config); |
} |
private function formaterUrlsServices($config) { |
48,6 → 58,7 |
$liste_genre_espece = array(); |
$this->masque_recherche = trim(trim($genre).' '.trim($espece,' *')); |
$masque = urlencode($this->masque_recherche); |
if(self::DEBUG) error_log("CEL fetch: " . $this->url_service_nom.'?masque='.$masque.'&recherche=etendue&retour.format=min&navigation.limite=50&ns.structure=au'); |
$requete = @file_get_contents($this->url_service_nom.'?masque='.$masque.'&recherche=etendue&retour.format=min&navigation.limite=50&ns.structure=au'); |
if($requete != '') { |
$requete = json_decode($requete); |
105,11 → 116,20 |
} |
private function effectuerRequeteUrlRecherche($nom_saisi, $mode = 'stricte') { |
$res = @json_decode(file_get_contents(sprintf('%1$s?masque=%2$s&recherche=%3$s&ns.format=txt&retour.champs=%4$s&navigation.limite=1', |
$url = sprintf( |
'%1$s?masque=%2$s&recherche=%3$s&ns.format=txt&retour.champs=%4$s&navigation.limite=1', |
$this->url_service_nom, |
urlencode($nom_saisi), |
$mode, |
implode(',', array("id","nom_sci","auteur","nom_retenu.id","famille","num_taxonomique","nom_retenu_complet"))))); |
implode(',', array("id","nom_sci","auteur","nom_retenu.id","famille","num_taxonomique","nom_retenu_complet"))); |
if(! array_key_exists($url, self::$cache)) { |
if(self::DEBUG) error_log("CEL fetch: " . $url); |
$res = @json_decode(file_get_contents($url)); |
self::$cache[$url] = $res; |
} else { |
$res = self::$cache[$url]; |
} |
if(!$res) return NULL; |
$resultat = (array)$res->resultat; |
return array_pop($resultat); |
119,8 → 139,8 |
// TODO: gérer les hybrides |
if(self::estUnHybride($nom_saisi) || self::estUneFormuleHybridite($nom_saisi)) { |
$nom_decoupe = explode(' ', $nom_saisi); |
$derniere_position_hybride = end(array_keys($nom_decoupe, 'x')); |
$nom_saisi_sans_auteur = implode(' ',array_slice($nom_decoupe, 0, $derniere_position_hybride + 2)); |
$derniere_position_hybride = array_keys($nom_decoupe, 'x'); |
$nom_saisi_sans_auteur = implode(' ',array_slice($nom_decoupe, 0, end($derniere_position_hybride) + 2)); |
} else { |
/* Attention le parseur de nom n'est pas fiable à 100% |
mais ça marche dans la plupart des cas |
143,6 → 163,7 |
public function effectuerRequeteInfosComplementairesSurNumNom($num_nom, $ref = NULL) { |
if($ref && isset($this->config['eflore']['api_host'])) { |
if(self::DEBUG) error_log("CEL fetch: " .$this->config['eflore']['api_host'] . '/'); |
return @json_decode(file_get_contents($this->config['eflore']['api_host'] . '/' . |
$ref . '/' . |
'noms' . '/' . |
155,6 → 176,7 |
'famille')))); |
} |
// XXX: compat |
if(self::DEBUG) error_log("CEL fetch: " . $this->url_service_nom.'/'.$num_nom.'?retour.champs=nom_sci,auteur,id,nom_retenu_complet,nom_retenu.id,num_taxonomique,famille'); |
return @json_decode(file_get_contents($this->url_service_nom.'/'.$num_nom.'?retour.champs=nom_sci,auteur,id,nom_retenu_complet,nom_retenu.id,num_taxonomique,famille')); |
} |
165,6 → 187,7 |
public function rechercherNumTaxSurNumNom($num_nom) { |
$nt = null; |
$url = $this->url_service_nom."/".$num_nom.'?retour.champs=num_taxonomique'; |
if(self::DEBUG) error_log("CEL fetch: $url"); |
$resultat = @file_get_contents($url); |
if($resultat != '') { |
$infos = json_decode($resultat); |
177,6 → 200,7 |
public function taxonEstPresentDansDepartement($num_taxon,$code_departement) { |
$presence_taxon = false; |
$url = $this->url_service_chorologie_obs.'?masque.departement='.$code_departement.'&masque.determination.nt='.$num_taxon.'&navigation.limite=1'; |
if(self::DEBUG) error_log("CEL fetch: $url"); |
$resultat = @file_get_contents($url); |
if($resultat != '') { |
$resultat = json_decode($resultat); |
211,6 → 235,7 |
// Numero taxonomique |
else { |
//TODO: retourner moins de champs grâce au paramètre retour.champs |
if(self::DEBUG) error_log("CEL fetch: " . $this->url_service_taxon."/nt:".$num); |
$obj = @json_decode(file_get_contents($this->url_service_taxon."/nt:".$num)); |
} |
if($obj) $obj->ref = $ref; |
223,6 → 248,7 |
public function rechercherSynonymesSurNumNom($num_nom) { |
$retour = array(); |
if(self::DEBUG) error_log("CEL fetch: " . $this->url_service_nom.'/'.$num_nom.'/relations/synonymie/?retour.format=min'); |
$resultat = @file_get_contents($this->url_service_nom.'/'.$num_nom.'/relations/synonymie/?retour.format=min'); |
if($resultat != '') { |
$resultat = json_decode($resultat); |
233,4 → 259,3 |
return $retour; |
} |
} |
?> |
/branches/v1.7-croissant/jrest/JRest.php |
---|
132,7 → 132,7 |
// Ne pas effacer cette ligne ! Elle est indispensable pour les services du Carnet en ligne |
// qui n'utilisent que le tableau pairs dans les posts |
$pairs = array_merge($pairs, $_POST); |
$pairs = array_merge($_POST, $pairs); |
} |
// gestion du contenu du post |
/branches/v1.7-croissant/jrest/tests/api.php |
---|
40,19 → 40,21 |
'observateur' => 'Observateur', |
); |
define('URLPREFIX', 'service:cel:'); |
function cel_get_obs() { |
$URL = DOMAIN . '/jrest/InventoryObservationList/' . USER; |
return json_decode(file_get_contents($URL . '/?limite=100000&numero_page=0')); |
$URL = DOMAIN . '/' . URLPREFIX . 'InventoryObservationList/' . USER; |
// 5000 (memory_limit) |
return json_decode(file_get_contents($URL . '/?limite=5000&numero_page=0')); |
} |
function cel_get_images() { |
$URL = DOMAIN . '/jrest/InventoryImageList/' . USER; |
$URL = DOMAIN . '/' . URLPREFIX . 'InventoryImageList/' . USER; |
return json_decode(file_get_contents($URL . '/?limite=100000&numero_page=0')); |
} |
function cel_delete_obs($obs) { |
$URL = DOMAIN . '/jrest/InventoryObservationList/' . USER; |
$URL = DOMAIN . '/' . URLPREFIX . 'InventoryObservationList/' . USER; |
$ch = curl_init(); |
//set the url, number of POST vars, POST data |
59,6 → 61,8 |
curl_setopt($ch,CURLOPT_URL, $URL . '/' . implode(',', $obs)); |
curl_setopt($ch,CURLOPT_POSTFIELDS, array('action' => 'DELETE')); |
curl_setopt($ch,CURLOPT_RETURNTRANSFER, TRUE); |
if(DEBUG) @fwrite(STDERR, sprintf("curl -F action=DELETE '%s/%s'\n", $URL, implode(',', $obs))); |
//execute post |
$result = curl_exec($ch); |
curl_close($ch); |
66,7 → 70,7 |
} |
function cel_delete_image($img) { |
$URL = DOMAIN . '/jrest/InventoryImageList/' . USER; |
$URL = DOMAIN . '/' . URLPREFIX . 'InventoryImageList/' . USER; |
$ch = curl_init(); |
//set the url, number of POST vars, POST data |
81,10 → 85,14 |
function cel_delete_all_obs() { |
$obs = cel_get_obs(); |
while( ($obs = cel_get_obs()) ) { |
$ordres = array_map(function($item) { return $item->ordre; }, $obs); |
cel_delete_obs($ordres); |
// les chunks permettent d'éviter des REQUEST-URI too long (500 id * 4 digits + 500 (virgules)) < 4k |
while( $ordres_chunk = array_splice($ordres, 0, 500)) { |
cel_delete_obs($ordres_chunk); |
} |
} |
} |
function cel_delete_all_images() { |
95,7 → 103,7 |
function cel_upload_image($file) { |
if(! file_exists($file)) return NULL; |
$URL = DOMAIN . '/jrest/InventoryImage'; |
$URL = DOMAIN . '/' . URLPREFIX . 'InventoryImage'; |
$ch = curl_init(); |
116,7 → 124,7 |
} |
function cel_link_images($user, $id_image, $id_obs) { |
$URL = DOMAIN . '/jrest/inventoryImageLink/'; |
$URL = DOMAIN . '/' . URLPREFIX . 'inventoryImageLink/'; |
$ch = curl_init(); |
//set the url, number of POST vars, POST data |
139,7 → 147,7 |
// TODO: CURLOPT_NETRC + Cel API support |
if(!defined('EMAIL') || !defined('PASS') || ! EMAIL || ! PASS) return FALSE; |
if(defined('COOKIE') && COOKIE) return TRUE; |
$URL = DOMAIN . '/jrest/User/' . EMAIL . '/' . PASS; |
$URL = DOMAIN . '/' . URLPREFIX . 'User/' . EMAIL . '/' . PASS; |
$ch = curl_init(); |
184,7 → 192,7 |
} |
function import($d) { |
$URL = DOMAIN . '/jrest/ImportXLS'; |
$URL = DOMAIN . '/' . URLPREFIX . 'ImportXLS'; |
if(!is_file($d)) return FALSE; |
$ch = curl_init(); |
208,7 → 216,7 |
} |
function importXLS($d) { |
$URL = DOMAIN . '/jrest/ImportXLS'; |
$URL = DOMAIN . '/' . URLPREFIX . 'ImportXLS'; |
if(!is_file($d)) return FALSE; |
exec("csvtool -o /tmp/a.csv col 1- $d"); |
exec(__DIR__ . "/bin/csv2xls -v 0 -f -o /tmp/a /tmp/a.csv &>/dev/null"); |
242,7 → 250,7 |
function export($cols = "standard,avance") { |
if(!defined('COOKIE')) return FALSE; |
$URL = DOMAIN . '/jrest/CelWidgetExport/export?'; |
$URL = DOMAIN . '/' . URLPREFIX . 'CelWidgetExport/export?'; |
$URL .= http_build_query(array('colonnes' => $cols, |
'id_utilisateur' => USER, |
'format' => 'csv')); |
265,7 → 273,7 |
$file = "/tmp/b.xls"; |
$URL = DOMAIN . '/jrest/CelWidgetExport/export?'; |
$URL = DOMAIN . '/' . URLPREFIX . 'CelWidgetExport/export?'; |
$URL .= http_build_query(array('colonnes' => $cols, |
'id_utilisateur' => USER, |
'format' => 'xls')); |
321,6 → 329,7 |
function champsLongToShort($a) { |
if(! $a) return array(); |
$r = array(); |
$x = array_flip($GLOBALS['champs']); |
foreach($a as $k => $v) { |
/branches/v1.7-croissant/jrest/tests/cmd-test.php |
---|
8,7 → 8,9 |
if(isset($options['h']) || isset($options['help'])) die(__help()); |
define('USER', isset($options['u']) ? $options['u'] : (isset($options['user']) ? $options['user'] : DEFAULT_USER)); |
if(isset($options['u'])) define('USER', $options['u']); |
elseif(isset($options['user'])) define('USER', $options['user']); |
define('DOMAIN', isset($options['d']) ? $options['d'] : (isset($options['domain']) ? $options['domain'] : DEFAULT_DOMAIN)); |
define('EMAIL', isset($options['e']) ? $options['e'] : (isset($options['email']) ? $options['email'] : NULL)); |
define('PASS', isset($options['p']) ? $options['p'] : (isset($options['pass']) ? $options['pass'] : NULL)); |
20,6 → 22,10 |
// API::auth() define()'s COOKIE |
require_once('api.php'); |
if(!defined('USER')) auth(); |
if(!defined('USER')) define('USER', DEFAULT_USER); |
if(isset($options['o']) || isset($options['obs']) || isset($options['F']) || isset($options['flush'])) { |
cel_delete_all_obs(); |
} |
/branches/v1.7-croissant/jrest |
---|
Property changes: |
Added: svn:mergeinfo |
Merged /branches/topic-dbsingleton/jrest:r1720-1764 |
Merged /trunk/jrest:r1840-1935 |