From 5f4798a5a192a12703037ba43c29ff11e4ec01c8 Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Fri, 5 Feb 2021 11:42:55 +0100 Subject: [PATCH] Add export feature using existing LSioFormats --- debian/control | 2 +- doc/conf/LSobject/ioFormat.docbook | 41 ++++- .../LSobjects/config.LSobjects.LSpeople.php | 41 ++++- src/images/default/export.png | Bin 0 -> 581 bytes src/includes/class/class.LSattribute.php | 172 ++++++++++-------- src/includes/class/class.LSexport.php | 103 +++++++++++ src/includes/class/class.LSimport.php | 10 +- src/includes/class/class.LSioFormat.php | 74 ++++++-- src/includes/class/class.LSioFormatCSV.php | 162 +++++++++++++++-- src/includes/class/class.LSioFormatDriver.php | 29 ++- src/includes/routes.php | 44 +++++ src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo | Bin 65221 -> 65939 bytes src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po | 171 +++++++++-------- src/lang/ldapsaisie.pot | 165 ++++++++++------- src/templates/default/export.tpl | 19 ++ 15 files changed, 769 insertions(+), 264 deletions(-) create mode 100644 src/images/default/export.png create mode 100644 src/includes/class/class.LSexport.php create mode 100644 src/templates/default/export.tpl diff --git a/debian/control b/debian/control index dbe32ee4..cf2eb06a 100644 --- a/debian/control +++ b/debian/control @@ -6,7 +6,7 @@ Maintainer: Benjamin Renard Package: ldapsaisie Architecture: all -Depends: apache2 | httpd, php-ldap | php5-ldap, php-fpm | libapache2-mod-php5 | libapache2-mod-php | php5-cli | php-cli, smarty | smarty3, php-net-ldap2, php-net-ftp, php-mail, php-mail-mime, php-file-csv-datasource, php-console-table +Depends: apache2 | httpd, php-ldap | php5-ldap, php-fpm | libapache2-mod-php5 | libapache2-mod-php | php5-cli | php-cli, smarty | smarty3, php-net-ldap2, php-net-ftp, php-mail, php-mail-mime, php-console-table Recommends: php-mbstring, php-phpseclib Description: web based interface for managing LDAP servers content LdapSaisie is a Web application developed to manage LDAP directory. diff --git a/doc/conf/LSobject/ioFormat.docbook b/doc/conf/LSobject/ioFormat.docbook index f1d3cc82..1bc6129a 100644 --- a/doc/conf/LSobject/ioFormat.docbook +++ b/doc/conf/LSobject/ioFormat.docbook @@ -103,18 +103,23 @@ création du type d'&LSobject;. En conséquence : Pilote de fichiers CSV Ce pilote permet de gérer l'import/export de &LSobject; à partir d'un fichier - CSV. Ce pilote utilise la classe PEAR + CSV. Depuis la version 4 d'LdapSaisie, ce pilote utilise les + fonctions standards fgetcsv() et fputcsv + fournis par PHP. Avant cela, la classe PEAR File_CSV_DataSource - . Par défaut, les paramètres de lecture et d'écriture des - fichiers sont : la virgule sert de délimiteur, le caractère " peut - être utilisé pour encadrer les valeurs des champs et la longueur maximale d'une ligne - est 999999. Ces paramètres peuvent être modifiés en configurant les options du pilote. + était utilisée. Par défaut, les paramètres de lecture et + d'écriture des fichiers sont : la virgule sert de délimiteur, le caractère + " peut être utilisé pour encadrer les valeurs des champs et la + longueur maximale d'une ligne est infini. Ces paramètres peuvent être modifiés en + configurant les options du pilote. Structure '[délimiteur]', + 'enclosure' => '[caractère d'encadrement de texte]', 'length' => [longueur maximale d'une ligne], - 'escape' => '[caratère d'encadrement]' + 'escape' => '[caractère d'échappement]', + 'multiple_value_delimiter' => '[délimiteur]', );]]> @@ -132,20 +137,40 @@ création du type d'&LSobject;. En conséquence : length La longueur maximale d'une ligne du fichier. Si zéro est spécifié, la longueur d'une - ligne ne sera pas limité, mais la lecture du fichier sera ralenti. (Par défaut : 999999 + ligne ne sera pas limité, mais la lecture du fichier sera ralentie. (Par défaut : 0 ) - escape + enclosure Le caractère utilisé pour encadrer les valeurs des champs (Par défaut : "). + + escape + + Le caractère d'échappement utilisé si un des champs d'une ligne de fichier contient le + caractère utilisé pour encadrer les valeurs. (Par défaut : \). + Selon la RFC4180, l'echappement du caractère utilisé pour encadrer les valeurs des + champs doit se faire en le doublant. Le caractère défini ici est une alternative à ce comportement + par défaut. Pour désactiver ce caractère d'échappement alternatif, il est possible depuis de la + version 7.4.0 de PHP de mettre ici une chaine vide. + + + + + multiple_value_delimiter + + Le caractère utilisé pour délimiter au sein d'un champs, les valeurs valeurs multiples d'un + attribut (Par défaut : |). + + + diff --git a/src/conf/LSobjects/config.LSobjects.LSpeople.php b/src/conf/LSobjects/config.LSobjects.LSpeople.php index 1fdf9075..1ab2efb8 100644 --- a/src/conf/LSobjects/config.LSobjects.LSpeople.php +++ b/src/conf/LSobjects/config.LSobjects.LSpeople.php @@ -65,9 +65,7 @@ $GLOBALS['LSobjects']['LSpeople'] = array ( 'driver' => 'CSV', 'driver_options' => array ( 'delimiter' => ';', - 'escape' => '"', - 'eol' => ';', - 'length' => 2, + 'enclosure' => '"', ), 'fields' => array ( 'login' => 'uid', @@ -83,6 +81,43 @@ $GLOBALS['LSobjects']['LSpeople'] = array ( 'cn' => '%{personalTitle} %{givenName} %{sn}', ), ), + 'myfullcsv' => array ( + 'label' => 'Complete CSV', + 'driver' => 'CSV', + 'fields' => array ( + 'login' => 'uid', + 'civility' => 'personalTitle', + 'firstname' => 'givenName', + 'lastname' => 'sn', + 'fullname' => 'cn', + 'mail' => 'mail', + 'password' => 'userPassword', + 'description' => 'description', + 'accountables' => 'lsGodfatherDn', + 'posix_uidnumber' => 'uidNumber', + 'posix_gidnumber' => 'gidNumber', + 'posix_shell' => 'loginShell', + 'posix_home' => 'homeDirectory', + 'posix_gecos' => 'gecos', + 'password_expiration' => 'shadowExpire', + 'password_max_age' => 'shadowMax', + 'password_max_inactive' => 'shadowInactive', + 'password_last_change' => 'shadowLastChange', + 'samba_sid' => 'sambaSID', + 'samba_primary_group_sid' => 'sambaPrimaryGroupSID', + 'samba_account_flags' => 'sambaAcctFlags', + 'samba_home_drive' => 'sambaHomeDrive', + 'samba_home_path' => 'sambaHomePath', + 'samba_profile_paht' => 'sambaProfilePath', + 'samba_logon_script' => 'sambaLogonScript', + 'samba_last_login' => 'sambaLogonTime', + 'samba_last_logoff' => 'sambaLogoffTime', + 'samba_expiration' => 'sambaKickoffTime', + 'samba_password_last_change' => 'sambaPwdLastSet', + 'samba_password_must_change' => 'sambaPwdMustChange', + 'samba_password_cas_change' => 'sambaPwdCanChange', + ), + ), ), 'before_modify' => 'valid', diff --git a/src/images/default/export.png b/src/images/default/export.png new file mode 100644 index 0000000000000000000000000000000000000000..28e41ea2bb469397b2905fc8272b287101fd44bb GIT binary patch literal 581 zcmV-L0=oT)P)9TL{7iX$V@PAta(9$|8b7D6wp-IURZdO^p#W zhGj%3h}IwkopYY&+|PAgc}vbAem;r__Cgn?7OtN?KmKI17sC;NJK>JG5gvFrVTMN# zW|%vN_vh}?(%S8}PbcQ9@iXId`-X{dTVVoMbkJeoYg zZe4x6LQzFH#h^6;2oKD`3ETs7$J)T!z`_|=FnatD=0;HwL7^lRK_n3h@B_uHVGm~Ku92vAS`gf?5Br# z8{9Z~kHXz3lDn}(5=ayYND`_NGav5KA9U$9znOkFMd9ugsm+;f5|St+frNR>{r5M? zxnXQ%jM1ZG)Va%*SCi!2P^2)Y=l}vFAwaUKcgHXPW0kkyS9ex(J9 zLu@IU7soQkH& getConfig("form.$idForm")) { - if (!$this -> html) { - LSerror :: addErrorCode('LSattribute_09',array('type' => 'html','name' => $this -> name)); - return; - } - if($this -> myRights() == 'n') { - return true; - } - if (!is_null($value)) { - $data = $value; - } - else if(!is_empty($this -> data)) { - $data = $this -> getFormVal(); - } - else if (!is_empty($this -> getConfig('default_value'))) { - $data = $obj -> getFData($this -> getConfig('default_value')); - } - else { - $data = NULL; - } + $form_mode = $this -> getConfig("form.$idForm", false); + self :: log_debug("$this -> addToForm($idForm): mode = ".varDump($form_mode)); + if($form_mode === false) { + self :: log_debug("Attribute ".$this -> name." not in form $idForm."); + return True; + } - $element = $this -> html -> addToForm($form,$idForm,$data); - if(!$element) { - LSerror :: addErrorCode('LSform_06',$this -> name); - } + $element = $this -> _addToForm($form, $idForm, $obj, $value); + if(!$element) + return false; - if($this -> getConfig('required')) { - $form -> setRequired($this -> name); - } + if($this -> getConfig('required', false, 'bool')) + $form -> setRequired($this -> name); - if ( ($this -> getConfig("form.$idForm")==0) || ($this -> myRights() == 'r') ) { - self :: log_debug("Attribute ".$this -> name." is freeze in form $idForm."); - $element -> freeze(); - } - else { - $check_data = $this -> getConfig('check_data', array()); - if(is_array($check_data)) { - foreach ($check_data as $rule => $rule_infos) { - if((!$form -> isRuleRegistered($rule))&&($rule!='')) { - LSerror :: addErrorCode('LSattribute_03',array('attr' => $this->name,'rule' => $rule)); - return; - } - if(!isset($rule_infos['msg'])) { - $rule_infos['msg']=getFData(_('The value of field %{label} is invalid.'),$this -> getLabel()); - } - else { - $rule_infos['msg']=__($rule_infos['msg']); - } - if(!isset($rule_infos['params'])) - $rule_infos['params']=NULL; - $form -> addRule($this -> name,$rule,array('msg' => $rule_infos['msg'], 'params' => $rule_infos['params'])); - } - } - else { - LSerror :: addErrorCode('LSattribute_04',$this->name); - } - } + if ( ($form_mode == 0) || ($this -> myRights() == 'r') ) { + self :: log_debug("Attribute ".$this -> name." is freeze in form $idForm."); + $element -> freeze(); } else { - self :: log_debug("Attribute ".$this -> name." not in form $idForm."); + $check_data = $this -> getConfig('check_data', array()); + if(is_array($check_data)) { + foreach ($check_data as $rule => $rule_infos) { + if((!$form -> isRuleRegistered($rule))&&($rule!='')) { + LSerror :: addErrorCode('LSattribute_03',array('attr' => $this->name,'rule' => $rule)); + return; + } + if(!isset($rule_infos['msg'])) { + $rule_infos['msg']=getFData(_('The value of field %{label} is invalid.'),$this -> getLabel()); + } + else { + $rule_infos['msg']=__($rule_infos['msg']); + } + if(!isset($rule_infos['params'])) + $rule_infos['params']=NULL; + $form -> addRule($this -> name,$rule,array('msg' => $rule_infos['msg'], 'params' => $rule_infos['params'])); + } + } + else { + LSerror :: addErrorCode('LSattribute_04', $this->name); + } } return true; } @@ -319,37 +299,75 @@ class LSattribute extends LSlog_staticLoggerClass { } /** - * Ajoute l'attribut au formualaire de vue - * - * Cette méthode ajoute l'attribut au formulaire $form de vue si il doit l'être + * Add attribute to LSview * * @author Benjamin Renard * - * @param[in] object $form Le formulaire dans lequel doit être ajouté l'attribut + * @param[in] $form LSform The LSform object * - * @retval boolean true si l'ajout a fonctionner ou qu'il n'est pas nécessaire, false sinon + * @retval boolean True on succes, False otherwise */ public function addToView(&$form) { - if ($this -> getConfig('view', false, 'bool') && ($this -> myRights() != 'n') ) { - if (!$this -> html) { - LSerror :: addErrorCode('LSattribute_09',array('type' => 'html','name' => $this -> name)); - return; - } - if(!is_empty($this -> data)) { - $data = $this -> getFormVal(); - } - else { - $data=null; - } - $element = $this -> html -> addToForm($form,'view',$data); - if(!$element instanceof LSformElement) { - LSerror :: addErrorCode('LSform_06',$this -> name); - return; - } + if (!$this -> getConfig('view', false, 'bool') || ($this -> myRights() == 'n') ) + return true; + $element = $this -> _addToForm($form, 'view'); + if ($element) { $element -> freeze(); return true; } - return true; + return false; + } + + /** + * Add attribute to export + * + * @author Benjamin Renard + * + * @param[in] $form LSform The LSform object + * + * @retval boolean True on succes, False otherwise + */ + public function addToExport(&$form) { + if ($this -> myRights() == 'n') + return False; + $element = $this -> _addToForm($form, 'export'); + if ($element) { + $element -> freeze(); + return True; + } + return False; + } + + /** + * Add attribute to a LSform for export + * + * @author Benjamin Renard + * + * @param[in] object $form The LSform object + * + * @retval LSformElement|False LSformElement object on succes, False otherwise + */ + private function _addToForm(&$form, $idForm, &$obj=NULL, $data=NULL) { + if (!$this -> html) { + LSerror :: addErrorCode('LSattribute_09',array('type' => 'html','name' => $this -> name)); + return; + } + + if (is_null($data)) { + if(!is_empty($this -> data)) { + $data = $this -> getFormVal(); + } + else if ($obj && !is_empty($this -> getConfig('default_value'))) { + $data = $obj -> getFData($this -> getConfig('default_value')); + } + } + + $element = $this -> html -> addToForm($form, $idForm, $data); + if(!$element instanceof LSformElement) { + LSerror :: addErrorCode('LSform_06',$this -> name); + return; + } + return $element; } /** diff --git a/src/includes/class/class.LSexport.php b/src/includes/class/class.LSexport.php new file mode 100644 index 00000000..d284f48b --- /dev/null +++ b/src/includes/class/class.LSexport.php @@ -0,0 +1,103 @@ + + */ +class LSexport extends LSlog_staticLoggerClass { + + /** + * Export objects + * + * @param[in] $LSobject LSldapObject An instance of the object type + * @param[in] $ioFormat string The LSioFormat name + * + * @author Benjamin Renard + * + * @retval boolean True on success, False otherwise + */ + public static function export($object, $ioFormat) { + // Load LSobject + if (is_string($object)) { + if (!LSsession::loadLSobject($object, true)) { // Load with warning + return false; + } + $object = new $object(); + } + + // Validate ioFormat + if(!$object -> isValidIOformat($ioFormat)) { + LSerror :: addErrorCode('LSexport_01', $ioFormat); + return false; + } + + // Create LSioFormat object + $ioFormat = new LSioFormat($object -> type, $ioFormat); + if (!$ioFormat -> ready()) { + LSerror :: addErrorCode('LSexport_02'); + return false; + } + + // Load LSsearch class (with warning) + if (!LSsession :: loadLSclass('LSsearch', null, true)) { + return false; + } + + // Search objects + $search = new LSsearch($object -> type, 'LSexport'); + $search -> run(); + + // Retreive objets + $objects = $search -> listObjects(); + if (!is_array($objects)) { + LSerror :: addErrorCode('LSexport_03'); + return false; + } + self :: log_debug(count($objects)." object(s) found to export"); + + // Export objects using LSioFormat object + if (!$ioFormat -> exportObjects($objects)) { + LSerror :: addErrorCode('LSexport_04'); + return false; + } + self :: log_debug("export(): objects exported"); + return true; + } + +} +LSerror :: defineError('LSexport_01', +___("LSexport: input/output format %{format} invalid.") +); +LSerror :: defineError('LSexport_02', +___("LSexport: Fail to initialize input/output driver.") +); +LSerror :: defineError('LSexport_03', +___("LSexport: Fail to load objects's data to export from LDAP directory.") +); +LSerror :: defineError('LSexport_04', +___("LSexport: Fail to export objects's data.") +); diff --git a/src/includes/class/class.LSimport.php b/src/includes/class/class.LSimport.php index 719f75d8..9584b38b 100644 --- a/src/includes/class/class.LSimport.php +++ b/src/includes/class/class.LSimport.php @@ -324,17 +324,17 @@ LStemplate :: registerFunction('LSimport_implodeValues','LSimport_implodeValues' LSerror :: defineError('LSimport_01', -___("LSimport : Post data not found or not completed.") +___("LSimport: Post data not found or not completed.") ); LSerror :: defineError('LSimport_02', -___("LSimport : object type invalid.") +___("LSimport: object type invalid.") ); LSerror :: defineError('LSimport_03', -___("LSimport : input/output format %{format} invalid.") +___("LSimport: input/output format %{format} invalid.") ); LSerror :: defineError('LSimport_04', -___("LSimport : Fail to initialize input/output driver") +___("LSimport: Fail to initialize input/output driver.") ); LSerror :: defineError('LSimport_05', -___("LSimport : Fail to load objects's data from input file") +___("LSimport: Fail to load objects's data from input file.") ); diff --git a/src/includes/class/class.LSioFormat.php b/src/includes/class/class.LSioFormat.php index 1215b1b1..2cbdb0b0 100644 --- a/src/includes/class/class.LSioFormat.php +++ b/src/includes/class/class.LSioFormat.php @@ -20,15 +20,17 @@ ******************************************************************************/ +LSsession :: loadLSclass('LSlog_staticLoggerClass'); + /** * Manage IOformat of LSldapObject import/export * * @author Benjamin Renard */ -class LSioFormat { +class LSioFormat extends LSlog_staticLoggerClass { - var $config=False; - var $driver=False; + var $config = false; + var $driver = False; /** * Constructor @@ -39,17 +41,17 @@ class LSioFormat { * @retval void **/ public function __construct($LSobject, $ioFormat) { - $conf=LSconfig::get('LSobjects.'.$LSobject.".ioFormat.".$ioFormat); + $conf = LSconfig::get('LSobjects.'.$LSobject.".ioFormat.".$ioFormat); if(is_array($conf)) { - $this -> config=$conf; - if (isset($this -> config['driver']) && LSsession :: loadLSclass('LSioFormat'.$this -> config['driver'])) { - $driverClass='LSioFormat'.$this -> config['driver']; - $driverOptions=array(); - if (isset($this -> config['driver_options'])) $driverOptions = $this -> config['driver_options']; + $this -> config = $conf; + $driver = $this -> getConfig('driver'); + if ($driver && LSsession :: loadLSclass('LSioFormat'.$driver)) { + $driverClass = "LSioFormat".$driver; + $driverOptions = $this -> getConfig('driver_options', array(), 'array'); $this -> driver = new $driverClass($driverOptions); } else { - LSerror :: addErrorCode('LSioFormat_01',$this -> config['driver']); + LSerror :: addErrorCode('LSioFormat_01', $driver); } } } @@ -63,6 +65,19 @@ class LSioFormat { return (is_array($this -> config) && $this -> driver !== False); } + /** + * Return a configuration parameter (or default value) + * + * @param[] $param The configuration parameter + * @param[] $default The default value (default : null) + * @param[] $cast Cast resulting value in specific type (default : disabled) + * + * @retval mixed The configuration parameter value or default value if not set + **/ + public function getConfig($param, $default=null, $cast=null) { + return LSconfig :: get($param, $default, $cast, (is_array($this -> config)?$this -> config:array())); + } + /** * Load and valid file * @@ -83,7 +98,44 @@ class LSioFormat { * @retval array The objects contained by the loaded file **/ public function getAll() { - return $this -> driver -> getAllFormated($this -> config['fields'],$this -> config['generated_fields']); + return $this -> driver -> getAllFormated( + $this -> getConfig('fields', array(), 'array'), + $this -> getConfig('generated_fields', array(), 'array') + ); + } + + /** + * Export objects + * + * @param $objects array of LSldapObject The objects to export + * + * @return boolean True on succes, False otherwise + */ + public function exportObjects(&$objects) { + self :: log_trace('exportObjects(): start'); + $fields = $this -> getConfig('fields'); + if (!$fields) { + self :: log_error('exportObjects(): No field configured !'); + return false; + } + if (!LSsession :: loadLSclass('LSform', null, true)) + return false; + + $objects_data = array(); + foreach($objects as $object) { + $objects_data[$object -> getDn()] = array(); + + // Build a LSform object + $export = new LSform($object, 'export'); + + // Add attributes to export and put their values to data to export + foreach($fields as $key => $attr_name) { + $object -> attrs[$attr_name] -> addToExport($export); + $objects_data[$object -> getDn()][$key] = $export -> elements[$attr_name] -> getApiValue(); + } + } + self :: log_trace('exportObjects(): objects data = '.varDump($objects_data)); + return $this -> driver -> exportObjectsData($objects_data); } } diff --git a/src/includes/class/class.LSioFormatCSV.php b/src/includes/class/class.LSioFormatCSV.php index 159d348b..c140b64a 100644 --- a/src/includes/class/class.LSioFormatCSV.php +++ b/src/includes/class/class.LSioFormatCSV.php @@ -30,8 +30,40 @@ LSsession :: loadLSclass('LSioFormatDriver'); */ class LSioFormatCSV extends LSioFormatDriver { - // File_CSV_DataSource object - private $csv=false; + private $delimiter = null; + private $enclosure = null; + private $escape = null; + private $length = null; + + private $rows = null; + private $headers = null; + + /** + * Constructor + * + * @param[in] array $options Driver's options + * + * @retval void + **/ + public function __construct($options) { + parent :: __construct($options); + // As recommend in PHP doc, we enable this ini parameter to allow detection of + // Macintosh line-ending convention. + ini_set("auto_detect_line_endings", true); + + // Set CSV input/output parameters + $this -> delimiter = $this -> getOption('delimiter', ",", "string"); + $this -> enclosure = $this -> getOption('enclosure', '"', "string"); + $this -> escape = $this -> getOption('escape', "\\", "string"); + $this -> length = $this -> getOption('length', 0, "int"); + $this -> multiple_value_delimiter = $this -> getOption('multiple_value_delimiter', '|', "string"); + self :: log_debug( + 'New LSioFormatCSV objet started with delimiter="'.$this -> delimiter.'", '. + 'enclosure = <'.$this -> enclosure.'>, escape = "'.$this -> escape.'", '. + 'length = '.$this -> length.' and multiple value delimiter = "'. + $this -> multiple_value_delimiter.'"' + ); + } /** * Load file @@ -41,17 +73,29 @@ class LSioFormatCSV extends LSioFormatDriver { * @retval boolean True if file is loaded, false otherwise **/ public function loadFile($path) { - $this->csv=new File_CSV_DataSource; - if (is_array($this -> options)) { - foreach ($this -> options as $opt_key => $opt_val) { - if (isset($this->csv -> settings[$opt_key])) - $this->csv -> settings[$opt_key] = $opt_val; - } + self :: log_debug("loadFile($path)"); + $fd = fopen($path, 'r'); + if ($fd === false) { + self :: log_error("Fail to open file '$path'."); + return false; } - if ($this->csv->load($path)) { - return True; + + $this -> rows = array(); + while ( + ( + $row = fgetcsv( + $fd, $this -> length, $this -> delimiter, + $this -> enclosure, $this -> escape + ) + ) !== FALSE) { + $this -> rows[] = $row; } - return false; + if (!$this -> rows) + return false; + $this -> headers = array_shift($this -> rows); + self :: log_trace("loadFile($path): headers = ".varDump($this -> headers)); + self :: log_debug("loadFile($path): ".count($this -> rows)." row(s) loaded."); + return true; } /** @@ -60,10 +104,26 @@ class LSioFormatCSV extends LSioFormatDriver { * @retval boolean True if loaded file data are valid, false otherwise **/ public function isValid() { - if ($this -> csv && $this -> csv -> isSymmetric()) { - return True; + if (!is_array($this -> rows) && empty($this -> rows)) { + self :: log_error("No data loaded from input file"); + return false; } - return False; + + if (!$this -> headers) { + self :: log_error("Header line seem empty"); + return false; + } + for($i = 0; $i < count($this -> rows); $i++) { + if (count($this -> rows[$i]) != count($this -> headers)) { + self :: log_error( + "Input row #$i contain ".count($this -> rows[$i])." field(s) when ". + "headers has ".count($this -> headers) + ); + return false; + } + } + self :: log_debug("isValid(): all ".count($this -> rows)." row(s) are symetric."); + return True; } /** @@ -87,7 +147,17 @@ class LSioFormatCSV extends LSioFormatDriver { * @retval array The objects contained by the loaded file **/ public function getAll() { - return $this -> csv -> connect(); + $objects = array(); + foreach($this -> rows as $row) { + $object = array(); + foreach ($this -> headers as $idx => $key) { + $values = explode($this -> multiple_value_delimiter, $row[$idx]); + $object[$key] = (count($values) == 1?$values[0]:$values); + } + $objects[] = $object; + } + self :: log_trace("getAll(): objects = ".varDump($objects)); + return $objects; } /** @@ -104,7 +174,67 @@ class LSioFormatCSV extends LSioFormatDriver { * @retval array The fields names of the loaded file **/ public function getFieldNames() { - return $this -> csv -> getHeaders(); + return $this -> headers; } + + /** + * Export objects data + * + * @param[in] $stream The stream where objects's data have to be exported + * @param[in] $objects_data Array of objects data to export + * + * @return boolean True on succes, False otherwise + */ + public function exportObjectsData($objects_data) { + if (!function_exists('fputcsv')) { + LSerror :: addErrorCode('LSioFormatCSV_01'); + return false; + } + + $first = true; + $stream = fopen('php://temp/maxmemory:'. (5*1024*1024), 'w+'); + foreach($objects_data as $dn => $object_data) { + if ($first) { + $this -> writeRow($stream, array_keys($object_data)); + $first = false; + } + $row = array(); + foreach($object_data as $values) + $row[] = (is_array($values)?implode($this -> multiple_value_delimiter, $values):$values); + $this -> writeRow($stream, $row); + } + header("Content-disposition: attachment; filename=export.csv"); + header("Content-type: text/csv"); + rewind($stream); + print stream_get_contents($stream); + @fclose($stream); + exit(); + } + + /** + * Write CSV row to stream + * + * @param[in] $stream The CSV file description reference + * @param[in] $row An array of a CSV row fields to write + * + * @author Benjamin Renard + * + * @retval boolean True if CSV row is successfully writed, false in other case + */ + private function writeRow($stream, $row) { + // Escape character could only be specified since php 5.5.4 + if (!defined('PHP_VERSION_ID') or PHP_VERSION_ID < 50504) { + $result = fputcsv($stream, $row, $this -> delimiter, $this -> enclosure); + } + else { + $result = fputcsv($stream, $row, $this -> delimiter, $this -> enclosure, $this -> escape); + } + return ($result !== false); + } + } + +LSerror :: defineError('LSioFormatCSV_01', + ___("LSioFormatCSV: function fputcsv is not available.") +); diff --git a/src/includes/class/class.LSioFormatDriver.php b/src/includes/class/class.LSioFormatDriver.php index b32d28e2..e8661222 100644 --- a/src/includes/class/class.LSioFormatDriver.php +++ b/src/includes/class/class.LSioFormatDriver.php @@ -20,12 +20,14 @@ ******************************************************************************/ +LSsession :: loadLSclass('LSlog_staticLoggerClass'); + /** * Driver to manage ioFormat file of LSldapObject import/export * * @author Benjamin Renard */ -class LSioFormatDriver { +class LSioFormatDriver extends LSlog_staticLoggerClass { protected $options=array(); @@ -137,4 +139,29 @@ class LSioFormatDriver { return $retall; } + /** + * Export objects data + * + * @param[in] $objects_data Array of objects data to export + * + * @return boolean True on succes, False otherwise + */ + public function exportObjectsData($objects_data) { + // Must be implement in real drivers + return False; + } + + /** + * Return a option parameter (or default value) + * + * @param[] $param The option parameter + * @param[] $default The default value (default : null) + * @param[] $cast Cast resulting value in specific type (default : disabled) + * + * @retval mixed The option parameter value or default value if not set + **/ + public function getOption($param, $default=null, $cast=null) { + return LSconfig :: get($param, $default, $cast, $this -> options); + } + } diff --git a/src/includes/routes.php b/src/includes/routes.php index 13ac12a6..995ab3de 100644 --- a/src/includes/routes.php +++ b/src/includes/routes.php @@ -456,6 +456,11 @@ function handle_LSobject_search($request) { 'url' => "object/$LSobject/import", 'action' => 'import' ); + $LSview_actions['export'] = array ( + 'label' => _('Export'), + 'url' => "object/$LSobject/export", + 'action' => 'export' + ); } } $LSview_actions['refresh'] = array ( @@ -835,6 +840,45 @@ function handle_old_import_php($request) { } LSurl :: add_handler('#^import\.php#', 'handle_old_import_php', false); + +/* + * Handle LSobject export request + * + * @param[in] $request LSurlRequest The request + * + * @retval void +**/ +function handle_LSobject_export($request) { + $object = get_LSobject_from_request($request, true); + if (!$object) + return; + + $ioFormats = array(); + $result = null; + if ( LSsession :: loadLSclass('LSexport', null, true)) { // Load class with warning + $ioFormats = $object->listValidIOformats(); + if (!is_array($ioFormats) || empty($ioFormats)) { + $ioFormats = array(); + LSerror :: addErrorCode('LSsession_16'); + } + else if (isset($_REQUEST['ioFormat'])) { + if (!LSexport::export($object, $_REQUEST['ioFormat'])) + LSlog :: error("An error occurred exporting ".$object -> type); + } + } + + // Define page title & template variables + LStemplate :: assign('pagetitle', _('Export').' : '.$object->getLabel()); + LStemplate :: assign('LSobject', $object -> getType()); + LStemplate :: assign('ioFormats', $ioFormats); + + // Set & display template + LSsession :: setTemplate('export.tpl'); + LStemplate :: addCssFile('LSform.css'); + LSsession :: displayTemplate(); +} +LSurl :: add_handler('#^object/(?P[^/]+)/export/?$#', 'handle_LSobject_export'); + /* * Handle LSobject create request * diff --git a/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo b/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo index 9e0c893729b0bbbd73d28ce4d1f458c16ee9d337..710ae162223ccbd7a5d6653832536d0894b59415 100644 GIT binary patch delta 11250 zcmYk?2YgOv|Htvm2nj(HN$iLqgb*S|h}a=UiB+@&K@cHgw{E*_P$Ty2(pFWC*tNRU zs-jiZ+Pkf4ON&zcKi^zeo`28l`Fa0-*E#n&=NjkScb@0@@=2b|X?Z;tp3A$)uszOY zOd0&Eh%sw(8*{9@T8-&j&6pCHh?Q_G*1%O5gGZ77m;zzOl*77M9lKyzoPx!1jdLr8 zQXfWtV?5?ANi!OJ_*83bhx))m)D5jeKRoC>gN3MXVIbbe{8)s$3dR7efDO?Hdt)&i zh&pb9b1Jss`X+;J=lvDER{31?$Zyns!yK}}=o<3!YjwxULAALhmH zunL~Ve3+}2y#a5e=f)4cxW1`Eq8`^k^|%?f!#-FPKSB-VKGYDOLtlK1>XCPZt^Ke7 zby?I6gkmAA;o75J-3klS-UU4+N&1uM&R@YIn2EaMckns<5H-|$Q5XE)c>#4JH?Sz) zLmlr`+pd8?)aP2F_P>O>&Isqs+Kj(?ypjeD)h^Vcx{Mt#s16^-RMZGm<~O&WL3EvwKQ|{198=X6%X&u?2RhYfN*@#5g>I zY7dICH=cxC)6Bsp_$lhfbJeq-YmEuiv#=9hM2%#GhZUq%+W@(i>5U;cA1mW_jK}j> z6{|L|7fe9)WFqSL6{wLofO+vSYJ`rXKVC$2@IGp7J;CDWY1`1wSs&D5NkiS)WYi*g z4RyjL7=SBLi)<_Eg!@q!I*3|3XD|tGqR!Vo+IFlLYHH@89?y@E<2~lMYq)^AfN5ms zE)ZX$48gWI4aehgOu@Luyqs{mGk}G|Y?^U65+CAd9Kw9)_)FLgJH#3@7}sK|K2ey5 zc?b=Ya3B7RI>86LmDFB}iSLRtP&e=s_Qb9&>M0N+=k)DcBs#V zFl<9{AZl%$LY+T9cM*y$(Gx*3oP9 ze%g=K@dB>Ff^>T!u17v%Vi_j-WaeNmJl&D;??V#tyfH80e5{PWqwd(B@zf2(qk1?C z>4e$lG@b2Z6^}`@ufYuT;#t#>&%?oZ5t&UB*M)20EaV9_d%JjysY&t|4eEIa6I~9w zqJ}sf^?@u5$LpxMEzU~f9c4P8>M5xGpP)wI7YxII?)H`59D7jrMRu88I0^kcw5F2G zMfKnrYN(Q4ux>#{(>!ywXXWX}R$vZEK8@-?=pgs|0#z@>5Iz4pN$SvW9xG!}#!J>m&21mliI!n$yp0Ts@lLj{ z?m-wwoq_7ex2Q#$cZhv&bi}IEYq1f2gX);?P!=!OH$zC;;y%>e`3$p*DIQf%KrN;{ z*c@-6E?7OqKF6ammU=Zd!HdZBoAL~cMrb0cgSSy58^nU+5VH_H(@1i2lukSobwfu` zZ@9K2?PIbQ8&aP`&3OO|p$3j{uEz4z$B+la+;%qOYU8MvqB>AC-QI9xY)m~coy&QX zyi0>WZa_c$0`&qqjrs8rdSUL-_FKyvi&B@xd{`5815sEEyJ009g4J*yM&T!@j@)(D z7(;ipWAGTeXx3mj^%<;<`NrDch7GU%fZsHrG9!47RO>INdQFg8G4I1Y8fKB(iVhp%bKC*TU_aEF@t}ry z9_m6%QO9jYt(7lPYw8RZ$A7bB{)@h1ho&-Wkwu_RSP%8VIMf{WL|q^eH8RNV3} z?DO0myHd|WP2pwKjRa0L=6Os&P070$i;qzqX*A7FWpngsD0-4;j#IG-PQu2x4>cnH zqI#Trx-~xrQ2U}rB*a>T!91>QVWb_FHcZR-itF&G8qE#qd|{)TN?6HwA-n9Y)|W)JQ*ll_A%h)MJ8l zzyQ?q|EjCEV?OG$=#Q7M5I#UHGOyR|(@+leI7Ofj#$X7>p^i&Iy$@!h7cNF`TXjrYO0Q5ZoGz-@h1A9 zr|>NM!9di7!Z0frC&5zGS7+Pj`6+5KM$WO{4I@yC?I>yr^1Wf_G!)BGcR;PJ6x54o zD(c3TVtG7-iF*ETktER2cCMZC)uIAn@k7e$8c1Vk%Myfhi!bsGJ^h6Eq zGz`MosGe>>Kiq*s@enrV`X+L|ec_~`hH5i*!NWKV%Pp`!p=M!g>c6lNHp;XY8jpI> zOhv7g#aJ6xp>FU5>IQzmvUmk`gZgP)f$JL|5!U`dCF%mbP&bf-MR6Dw!AYo|zk%xD8r1oApr;ziS$9C*#r8xcPzRPrJ%;sAcbwqt zjXGfxmcTL2*{G3u8-ws7Y7v_y_ElX9wWjK!rnvJG#$Puul7?7Zi9_%_CSlxCdjlV% zdUgbh<4M#F-9QcT?^p&OU|}r2%zj;0#J1Ffu?c2jGrWiTT-0*LUnh!LZs)u;rckfM z?pR=jZSRNi)H|GcR@&cs9kCwmlTjDii5)S|D*N+20bitk6MNuO)b+Zrw(ps~9+DUu z=AuU8IELXrsKr-ljqS+-jH5n-;TZI$ZSRP_)C*BPdJBu;I@Cz*MUC7kY>j78Q&8b8 zyWi7@M2n>p>cIXOfJ0CxoQi>%fd%m$R1Y?y*1%5G=MUp}{0X(_y1s4KLK2pxej9`F z0Q%!qjL`G{h(rfef5-NuE%vAGj=k^`0sS`GFRcNnso0KjT;Dt;X@#vf*~Rk)zDRum zn_{EQcCk%DeQ+aIzz43q-dpjQWW?O{1kwZ8X{dU;J`!aq*{XTwyV|Ut-X|&6jzSK)_ z1U|%3n7o_uPb4|N+kOo<`NUp$7^>&%Q5XCTyJOHEJGA4RM^QIWZZEH0%)owFVIRMW za60xyzx}qyBQb$`Gis!~4tQ+O;}6&&eH}ZoV?8#&C#WH;_o+Q@D5`xOYRax+L#)OE zipC_={%Kh3GH;Z#iXFivAg{>HvI>`Q)H?_;zFEN!m;*jmxTd1D>jk-YeVf%;4KGaAB9VWJRyl98F$qFO5KQ!sOulI zzhFk=H0tG;jOD)OR}#L4J@7YFd#mI8J%^hx4FgyRT`>a_@e*q2o1L&DwHO&$k2yu6 zp5;4f?YJ#ks{Nx~{cmGmUBLe*JCtLwKJ^JyPkqkW3-v&a&@|Ky972Z9grB$H3H?y} z*W+mX1E=G_3-$(n#qrb?FB&rlSK;gEb%_pkA(>0E7O$b^GUKvc?SEl2>e^Rq`)JgK zE;>W5+Hb{V)EsX^-9W%K`#8?Q>eM0E?a%H`*o%4^=EIBE8DKpoH)yDfUN`J-xo9j% zorpRx1p_c0%iwJE#dR2l+p#!aK~3QU)P>96w2yN;OrT!v>buSsw;2Cub}YVSZ{QTh zQG5SvUqGF3Fm*0k2S4|a z=)kWrH-3kC@eCHgb65~>qDJ5z>VySv+n?*jFo-$;eX+i)TcSo}plhFqMW|mxe_V?3 z=-Eh8h~zPbqR(&kg0)c}h`~VYfWbHj3tNGU?-9EnqF&Fg?)JW_?^>`l^!-E)tKcag03^hW<|F9PdLR}yhwZ9vN z;ZW2KFF~Cr3w`u}e??N5hLfnpbqUquC)o!uTz}fR3PLa1t6?*&g>7&Yw!^)sktlH2 zjzkKsp?)9rShv1se?LsdSn502p6i>Mf7uhhf~~0!U<>sA+kVNk$2!ytu^t}6A!zQ~ zFQ1{3A^H1tcf)r*~hfcBgVfx4X@Im55Dg_f_g9f z<_`3IY+pc;m_qw%)bYOm+UL6_YAU9nI&>5@=U1^Z7I|WaJPH%2$D&5`=o7|Y2Rw5P zm7m%>?1@^v8K@I3!6LX3OX7a?$Fr#8{y>e$6Vy|b|C#+gQ461=?u=T*NzN41h>rHS z116wOFb6esOE3@a!7_LN8{v7>9G2o4X^AlygwtKU*44jaS=xPb<;p%!HLOn^j=JGN zSPDJq?trFU>8ZnOiA{Ntm2rb~g#A<^6^Jfx`b%_c@N9vWtI`VTwKVm1*i?$bV8Ezmh zk!zbsR3X2LY4|?AOZ-XxBbFw9BA-LNN$yQ(;qD?P>-x`=c(GI4M^5E>PIIets5`~B}#Mi`UM9#LG zqy%w=c-Ngo`__|Z5PFnGV?8yp=}~?_=>JvoBQb^i5|Kz8CGHX0{5|aaj-)8@7kLBR zN;D>-h=a8CL2XOPwT&bqh@Vxs?LGGWK&+)MOO$ZO>LsIXjV1fvH`sT`)t*5lp)}MX zN)c^|fo|s>@=PL}x)PB<{wKD^|89I8WN$j~dzmzyxRLYxZ*d3b z@Dc|;?+)&Ut=SQTU0vI&&Ya^rklb=@x5y*NKX-McbC6S?(RV|~>^gh>b8;Gn(eM#& zz~zMA_m7EW@|GZo`^uSSOY<=fApX@p*H(jL?viKs zKat`##bzSL9UyMgJ^}mVVd4~_ZJTowE~kzo-Xj0SwSP-Joybirc5S5QFp-D4xeB%? zy8eBV4~WU^Sc0Y92bPkbba`j&Lj4Kx3VBQ7ck*FGVe+EHHDV*7EzH^3mf8Pa=HD#Z zR}+)S?+_K#|F7M_{xr-a{}t=wbi$WBAMqi1d;Ap35@U%0L?t3;8&6V*x}9sQMO~dd z5bvuUM-acc{r$-8_~REuabg5JuM_jg1Mvquj;|B{5II|XPJ;RV(;h|Mowg--4F}_C zxBo@wRBZ0@mh)Xw-Z_L1y-i-3c%8f$p)G@WjkY7W5Z@=pk(a|snI}VwxhIJxwt2Mr z5^IPH#6v>c1oU(Hek^F4v;S>I-GazNbqABNC((dh+d-n5%dcm*@KUFKM7~WUndutE z+5hC{$WuA+3K8p0@EJza{yEW>C_+7ks75{w-@}{uGEtM5O|8wF{1xnlIa?RewL_7zKIBM$B~-n$jf14*H!?#QEQH4$p0XY zk=G$A5>*LJRrdC`Q#UkL1t zfy~K~wX=psCi&M)8aE;}Exln-tHk7CLFuVMwhl_|HzcWl`lu?Sf(9g}Cx)AL33f+j zyM$2wKb`+8Cnc1t^8cS2n3kFn)UHL-=Ys|$r}6pJwDJEr_C`Wj)`_+gz5jQPy zb5cT$>{GgOTSBeO8wnAafn9nOOipc;nwFB7-aMgO=Ha@PvW9nAQ8$0xpom%x>(tKj z%h*{sfA;MsrDa}T);KHAvI3<_=X9tICm%H`x!2YilK8^`ezLWmI~LafAyy<&?M6(#nHJz~d*9kV<%)CfvdjaE^$iWaeo)Tm93 z8lgtb7FDwpZC~&2pL2XZxj*lf?{%H~Joh-~-1qb7J3rq0(0^$?*K>F;Fl;ZpjLDA& z{ft?W#+X4tYBlCbNn>*1Qw%|$QpS|UvRDT@BmXl?_)`!MVHv!G1u%PQWBjqaGXhIc zcfR!Ke!vh1oG4 z)qepp+GZ{4a~Ci>K0=+xRI~&SumQeBjZlM13>kL9Y#5Ch za2V=>$6-F4jG1sLYSFH9o<^5ppaOP}P{a*cf%eGf|&AgKf~inq5ONs1e+STC4{=B%H(C#iE#(6;%xDViW9( zJb7jd>V#KOci>&a_AiPWfk@Pxw?>UjdknxB)D3!2Yw9EP$8(rN?e|EuNd7@xS;jEC zII^P-7>v0w1hu$oqYl^zb)puiH4}|}a470{7g0BM2Q?*uHSJ?r1=YX3tv#k6iB2#B zHD@cZ8*aqLn7NiQW3fHP;#rKwy0xv#ky$ieESzCD8RPIds(*jxr5z??43-NwW(Y3C z0s5p55AzQ+3`ZRxl(*3UT!~Sbm5I~^^u|tj9lK!-7D5YLgst!%GKeOO1)!-LiCV<_ zTIJh5!|^7DU}07uH)R@O5uAov8|yI{FQ7iR zG18cU_!u<>of$?Qe=ZiqQ^;VL=jhRnN?ew%Y#4vEnv+lmdWt=@pOvHM`7>OGKjNp@ ztC?L?uaIjr4Y=LTI2*g;ee8;n3{x>&gSwzos0&EjlJVCa)Ng6$I@Y-p_1L6kT>D^q zoQX-OA#K#!&gDX6mQp&0LVZ5O6KCSE0&YOHU&A2uYimcaJeH##+}2~~Y$*-AV@xt? z4t<$;b%;RS`3NkH%TX_^lh^_8qZZeD{F#W0aR}yVZ!dg0GFax3vnC&6u*`JlMGuMQ zv}i{bAofCT(p$&Hn<2=t%>h*Zy!?@)`BN6p<3LQqJXFTP zsI{{abw1A#64r?c>t^q03ese*q2{tC6R86(M4HTBs5@vAZP&&M45#+)L0@cu8v4n| zx;9&I1inTcH>kh0&U5tgGJMMe05btherC&kQ0rrTUX zE!uMZ`D(@vs5@JLtTXc*)xY5YJ9VF+*3x-br)560mKtDv&Tod1G{S9I0{@5MSbUIu zOkz+|u@*H#-m&%$<4{Ap4*8!cz_7(*0@g=AR-%sI2KC}Phk827agZ?VgIa%PIZ0W3 z?JPdbJ}yzHJC1Xnz%kT?SUII}3F?9mV{Lql8L%u@6@XPS8#Y6|c)Fnv#$!567{T@V zlgy(bJFdp`xD$hLFXqHwF$AAuDGVHG?<4|sC*z&lUHeninkf-yhdvrBQh$t9@Bl{O zt2o9-i=y@@>u4-Vy%~7|%@x#%tBkhaTAfiBI1qIw!(BZNi&Ia=jJVG2PsFs;yU`o> zqAwoAOnBNu5cpI^aFj2mZl8^d4*9Yz0w67KdeUJ*wX&%!4;E7~i0#D&IK!RFp^E zz#y!HGtdi>I2f>iPZ_wLkL&-rracH6q8c zHU5niuraSUJ$~b{I_|~V_zG)cRn8fS!?6fq_VA|?-oPmIpJeB70O~?kU`xD;?Xc`* z`+k^$x|2hwxjcy)iQA|-euZ_>=Rx@U^gul&>rwB8vseKCbLN|3e*@M)J-$(>r)AO<#$R`|mWEdN77JmksdflQ zU^w*-)ZD#7ebDzK`>L*pq0~{Rp`M1Cl6`LfpIDAM+cew1E~cmMi5ju~(-`tBB$H^+ zBAbJH8rGm5r(LMW>j)Obv#5SA(GUGt2P3`kw!N@I7)0F)d*Co^gXb_G7N283 zUmta0JyD;JLmo?yNg&aXet{aQZKx9`p+@93X28rJ+ZRnP%t&1oIe-brf!GT5m?dEy z{0B8sVRN}DY>k6(4aT7VJpF!P{wI*sqTvwgL}@;;FPcoK#S(-Su^8$CJEAV22WpiM zM15`sYVm%8MQ|(fDlwN(i>>W^J5>WQr5|SI{AQ~X+>aWXQ>YW%L0!Nj)ZD*7KlJ(3 z-g$1+9hN{HFdX%G^>q7ZqmJ_>s^41FlwGXvMuAna94TfXLXZBxGeX$SqS=0qoTWD{r%|gcCpN38}=t72|hIkC> z1d}i;F2xAkfQ|7f*2P+j?C<{%P@mh2ZSe@kV*bVU*YQkL`z>sO)s|S}moWYnXgEzn zH8h{w6I90*l=0XU&tX>#{=)uBo`|~OWGsg_P>arQsU3mlSekk)YSFDi-9U~n?N7b- zsLw6;kZ8wg)Ee+#X78jB=A#wa^+HVn@`_uWLREc@RTRf+*d~(AQH!7XVhZ5fVJ>07Qn(Q?5i{!wW@nzD2_wz-+;Q2%O3&izfw%hb$8t&P0v^&ar>T~5-ChNsvGTW+wccRjYI zeuyox?ne7&n~SZe?_fi$`mLSQiTFPC5!Bkr`kh@f-LM|@9@JXjtbteHnFUdA_$N?1b&9XJc!; z>#V-ZUO)o!3NU|TPn@%x@lPOmy4#+3!XA6z>)3|&0!elxhGA{$9asoopr#=A4|Zhw zqxLVw8h8aY6}k4>FSRaMlX@X)|2Zs(S@wAtHj*;?tSfLfb-;dOKE$t4i>Wv(D;mGV z?)VnFVD}&G>fVD9)Oi@r#n=@!~+X}E25^h_+fkeSPw}@8lIp&(D;a5t=n-N zb@`+Ax8OH8o%$x~aU5{W{vcU{@zf`=Kejy1f2hJ;*a3r1*!D5lm--eC$H!w{A90iBxVhVqPVfrnU{_XBOMHmUvGy7J&-Pi!;F^D&|*MMx{!I8AAdsae}MHd$9a2#c36P=BKE<*P^-Mt z1$)O+QO9|RI!}pi=Hwxw7X^B;qlm+dK;$4 z?6>V>k_W3$SHlpD#Y{LK)o&T*#?_b~f56Om1xw>S^hf_Yb_z?P&fDq^9zkJ za3`d2t`n? zf7p?UM_rI-2T2ggK`f7VFc}6`D+lV1%cJ%;a<;~F)LrmB z?1_=M3Y+3%)JW8NY)4`lF4OaWnMBX^*eCXf!4?ds4t{F?OJ@(%0l&kB_zWX3?3w+N z@t_vlVXTI4Z~#_(Zohn%VqNM>*cbEsWuGz+Msj|0g~S&_Uf6#)R6vbHThyW&ip_C4 z>H?BccN+B4F3u3tRFpw|E)+E~%~1W?qmJJd3u6pwiW1P%iDVN=6lVI{u7Ms{oO&K= z&b~)|@Urt?)YoUwE8DLQ_NVTPv3Lg6zs_s>823O;MIz?L|4>t&>kZ>yjHKQhJLECg zhI$=VQb*MO(0^>*0kueHVP@QeI^Z$%!3s%Qy)SWHHytvx!-;a9iZt72}EeExxD#5ia#!kdJqB{Fx2?itO34)Yi&xtE& z*ZDm6Ncs@kbjQVAp3=adP+|dX&v7kLk(}u_J@FuB#i^K!NWE2~eTr-7NA5>xv9}^h zkv|~VJSi^+)(?I(Qh!LSBeYiX z5EY3HuFo;7LVW}Sytt(EBpYbZHq~{~Vk$wNFQt`v#3bUW+us?(-M;BKhx)9mMJww4 zuJ8NQS|dxfgY9c#5;2VZ88sx|6YX5*G346xylSiD+LdP`dJw}29t=~4eM8-TUXms= z`B_&}rfi3)C#P!LM(acB#l!(}oj>LG*fbhO5-q4BaRf1w&~}Z`>VCKVPSVj8v*|OP zm`Hr?+Ah57i1lc{M*KvKquz?z^zFyyF}r9uNQ4kKXemU@CD(SslJf68mzobq2D3lf zHGJgyj>0h4_A~i0@>&?@_D52;ar;Zs)`|E|^PiWb9Xo~)JZ0t#F@w+_)Jna0I*h8+DhqeqB^AbOD zxtLAVcXb!%CQL^>Bz6*gIo2I_!Zp-~TwW8$QwI^AA{4br>R>O7aGf@jwev51fJQI7PmiSop4!=Kr!Q(z}l5 zsRPM>z!2g(c>?hz`DxUD&%Huu8;A9Y0))3~yNHk3w;elUSE4Mj&+Q+Czfnh_ryGAh zCic^?8$Thmt;5a40iqH0T8zgAsI3`sm3)t@%Q*#HNc|;IHdXsV@-)PVcb%{`q2C5uX#W?d;36DEY$UHi zjMDsbFV6v?#hNYywu zRi3i`f@%1bC`iYXZs&M+pfuDgiGjpL;yUpM@syZEpF4O9lZfAmrqq}41);5p^H2Pb z`a9wa?QokXnItVSpANH#1?1^4nD~o4J<*GNAaRuZ5#d9wEjw1jVZ=A&-(p&~Zw0xw zA=IOBAMri;kHju=xAFh~k$vK-_UtT1eu)@E{vMHms6;*3_4yd{s~_ zq3uK3yoh&O3`sQgZES|y@f?nQ_xwMgVR)(!JRx7?>Q7U((=BE5rR{6iewvnPM0dL@ z!Q@Pun*XxiRG;XHlG_&{o;m$f>ph#7b9BB)>rZ3r@hVyb`;W zYVDi2qw?H<#5_&MXYdN1KdMOyU(>Wr|Jb2JhK~%MzqU!iz`nzW#0K{tJTz`(aNque z`lQ\n" "Language-Team: LdapSaisie \n" @@ -437,68 +437,68 @@ msgstr "LSformRule_%{type} : Le paramètre %{param} n'est pas défini." msgid "LSformRule: Unknown rule type %{type}." msgstr "LSformRule : Type de règle %{type} inconnu." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:203 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:208 msgid "Failed to set post data on creation form." msgstr "Impossible de définir les données dans le formulaire de création." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:209 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:214 msgid "Error validating creation form." msgstr "Une erreur est survenue en validant le formulaire de création." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:214 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:219 msgid "Failed to validate object data." msgstr "Impossible de valider les données de l'objet." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:221 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:226 msgid "Failed to generate DN for this object." msgstr "Impossible de générer le DN de cet objet." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:235 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:240 msgid "Error creating object on LDAP server." msgstr "Une erreur est survenue en création cet objet dans l'annuaire LDAP." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:241 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:246 msgid "An object already exist on LDAP server with DN %{dn}." msgstr "Un objet existe déjà dans l'annuaire LDAP avec le DN %{dn}." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:252 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:257 msgid "" "Failed to load existing object %{dn} from LDAP server. Can't update object." msgstr "" "Impossible de charger l'objet existant %{dn} depuis l'annuaire LDAP. " "Impossible de mettre à jour cet objet." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:260 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:265 msgid "Failed to set post data on update form." msgstr "Impossible de définir les données dans le formulaire de mise à jours." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:266 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:271 msgid "Error validating update form." msgstr "Une erreur est survenue en validant le formulaire de mise à jour." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:276 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:281 msgid "Error updating object on LDAP server." msgstr "" "Une erreur est survenue en mettant à jour cet objet dans l'annuaire LDAP." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:322 -msgid "LSimport : Post data not found or not completed." +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:327 +msgid "LSimport: Post data not found or not completed." msgstr "LSimport : les données transmises sont introuvables ou incomplètes." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:325 -msgid "LSimport : object type invalid." +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:330 +msgid "LSimport: object type invalid." msgstr "LSimport : type d'objet invalide." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:328 -msgid "LSimport : input/output format %{format} invalid." +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:333 +msgid "LSimport: input/output format %{format} invalid." msgstr "LSimport : Le format d'entrée/sortie %{format} est invalide." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:331 -msgid "LSimport : Fail to initialize input/output driver" -msgstr "LSimport : Impossible d'initialiser le pilote d'entrée/sortie" +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:336 +msgid "LSimport: Fail to initialize input/output driver." +msgstr "LSimport : Impossible d'initialiser le pilote d'entrée/sortie." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:334 -msgid "LSimport : Fail to load objects's data from input file" +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:339 +msgid "LSimport: Fail to load objects's data from input file." msgstr "" "LSimport: Impossible de charger les données des objets depuis le fichier " "d'import." @@ -518,9 +518,9 @@ msgstr "Confirmez-vous votre choix ?" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSconfirmBox.php:37 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsmoothbox.php:39 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSform.php:74 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:618 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1240 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1382 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:623 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1279 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1421 #: templates/default/recoverpassword.tpl:21 msgid "Validate" msgstr "Valider" @@ -665,10 +665,10 @@ msgstr "" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_select_object.php:68 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_supannLabeledValue.php:62 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:174 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1000 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1168 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1253 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1395 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1039 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1207 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1292 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1434 msgid "Modify" msgstr "Modifier" @@ -846,6 +846,24 @@ msgstr "" "LSattr_html_select_objet : l'objet sélectionné %{name} n'a pas de valeur " "dans son attribut %{attr}, vous ne pouvez pas le sélectionner." +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSexport.php:93 +msgid "LSexport: input/output format %{format} invalid." +msgstr "LSimport : Le format d'entrée/sortie %{format} est invalide." + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSexport.php:96 +msgid "LSexport: Fail to initialize input/output driver." +msgstr "LSexport : Impossible d'initialiser le pilote d'entrée/sortie." + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSexport.php:99 +msgid "LSexport: Fail to load objects's data to export from LDAP directory." +msgstr "" +"LSexport: Impossible de charger les données des objets à exporter depuis " +"l'annuaire LDAP." + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSexport.php:102 +msgid "LSexport: Fail to export objects's data." +msgstr "LSexport: Impossible d'exporter les données des objets." + #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformRule_differentPassword.php:90 msgid "" "LSformRule_differentPassword : Other password attribute is not configured." @@ -884,11 +902,11 @@ msgstr "" "LSformRule_differentPassword : Les autres attributs mots de passe doivent " "utiliser LSattr_ldap :: password. Ce n'est pas le cas de l'attribut %{attr}." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:266 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:250 msgid "The value of field %{label} is invalid." msgstr "La valeur du champ %{label} est incorrecte." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:720 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:738 msgid "" "LSattribute : Attribute %{attr} : LDAP or HTML types unknow (LDAP = %{ldap} " "& HTML = %{html})." @@ -896,7 +914,7 @@ msgstr "" "LSattribute : Attribut %{attr} : Les types LDAP ou HTML sont inconnus (LDAP " "= %{ldap} & HTML = %{html})." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:723 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:741 msgid "" "LSattribute : The function %{func} to display the attribute %{attr} is " "unknow." @@ -904,14 +922,14 @@ msgstr "" "LSattribute : La fonction %{func} pour afficher l'attribut %{attr} est " "inconnue." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:726 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:744 msgid "" "LSattribute : The rule %{rule} to validate the attribute %{attr} is unknow." msgstr "" "LSattribute : La règle %{rule} de validation de l'attribut %{attr} n'existe " "pas." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:729 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:747 msgid "" "LSattribute : Configuration data to verify the attribute %{attr} are " "incorrect." @@ -919,22 +937,22 @@ msgstr "" "LSattribute : Les données de configuration pour vérifier l'attribut %{attr} " "sont incorrecte." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:732 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:750 msgid "" "LSattribute : The function %{func} to save the attribute %{attr} is unknow." msgstr "" "LSattribute : La fonction %{func} pour sauvegarder l'attribut %{attr} est " "inconnue." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:735 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:753 msgid "LSattribute : The value of the attribute %{attr} can't be generated." msgstr "LSattribute : La valeur de l'attribut %{attr} ne peut être générée." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:738 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:756 msgid "LSattribute : Generation of the attribute %{attr} failed." msgstr "LSattribute : La génération de l'attribut %{attr} a échouée." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:741 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:759 msgid "" "LSattribute : Generation of the attribute %{attr} did not return a correct " "value." @@ -942,7 +960,7 @@ msgstr "" "LSattribute : La génération de l'attribut %{attr} n'a pas retournée de " "valeur correcte." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:744 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:762 msgid "" "LSattribute : The attr_%{type} of the attribute %{name} is not yet defined." msgstr "" @@ -1005,7 +1023,7 @@ msgstr "Votre nouveau mot de passe vous a été envoyé à l'adresse %{mail}." #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsession.php:1640 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:156 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:462 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:467 #: templates/default/select.tpl:29 msgid "Refresh" msgstr "Rafraîchir" @@ -1509,8 +1527,8 @@ msgstr "Attention" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_select_object.php:69 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_select_object.php:85 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:190 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1016 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1160 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1055 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1199 msgid "Delete" msgstr "Supprimer" @@ -1521,7 +1539,7 @@ msgstr "Aucun objet." #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSrelation.php:712 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:449 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:945 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:984 msgid "New" msgstr "Nouveau" @@ -1719,14 +1737,14 @@ msgid "Delete this field." msgstr "Supprimer cette valeur." #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSform.php:229 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:614 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:619 msgid "Do you really want to execute custom action %{title} on this search ?" msgstr "" "Êtes-vous vraiment sûre de vouloir exécuter l'action personnalisée %{title} " "sur cette recherche ?" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSform.php:235 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1376 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1415 msgid "" "Do you really want to execute custom action %{customAction} on " "%{objectname} ?" @@ -1875,8 +1893,8 @@ msgid "Display RSS stack." msgstr "Afficher la file RSS." #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattr_ldap_password.php:100 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:574 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1326 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:579 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1365 msgid "undefined" msgstr "non-définie" @@ -2249,6 +2267,10 @@ msgstr "" "LScli : La fonction de prise en charge de la commande CLI '%{command}' n'est " "pas exécutable." +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSioFormatCSV.php:236 +msgid "LSioFormatCSV: function fputcsv is not available." +msgstr "LSioFormatCSV : la fonction fputcsv n'est pas disponible." + #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSlog.php:478 msgid "LSlog : Fail to load logging handler %{handler}." msgstr "LSlog : Impossible de charger l'handler %{handler}." @@ -2271,14 +2293,14 @@ msgid "Unknown error : %{error}" msgstr "Erreur inconnu : %{error}" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:166 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1152 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1245 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1387 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1191 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1284 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1426 msgid "View" msgstr "Voir" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:182 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1008 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1047 msgid "Copy" msgstr "Copier" @@ -2294,7 +2316,7 @@ msgstr "" "LSsearchEntry : formaterFunction %{func} invalide utilisé pour " "l'extraDisplayedColumns %{column}." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSioFormat.php:92 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSioFormat.php:144 msgid "LSioFormat : IOformat driver %{driver} invalid or unavailable." msgstr "" "LSioFormat : Le pilote d'IOformat %{driver} est invalide ou n'est pas " @@ -2313,69 +2335,74 @@ msgstr "Vous devez fournir un mot clé pour les recherches globales." msgid "Import" msgstr "Importer" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:467 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:460 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:871 +msgid "Export" +msgstr "Exporter" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:472 msgid "Reset" msgstr "Réinitialiser" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:505 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:510 #: templates/default/select.tpl:28 templates/default/global_search.tpl:6 msgid "Search" msgstr "Rechercher" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:506 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:511 #: templates/default/select.tpl:31 msgid "Approximative search" msgstr "Recherche approximative" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:507 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:512 #: templates/default/select.tpl:32 msgid "Recursive search" msgstr "Recherche récursive" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:593 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:598 msgid "" "The custom action %{title} have been successfully execute on this search." msgstr "" "L'action personnalisée %{title} a été correctement exécutée sur cette " "recherche." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:904 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:943 msgid "Data entry form" msgstr "Masque de saisie" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:910 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1626 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:949 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1665 msgid "Object has been added." msgstr "L'objet a été ajouté." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1047 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1086 msgid "My account" msgstr "Mon compte" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1110 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1716 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1149 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1755 msgid "The object has been partially modified." msgstr "L'objet a été partiellement modifié." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1113 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1719 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1152 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1758 msgid "The object has been modified successfully." msgstr "L'objet a bien été modifié." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1228 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1760 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1267 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1799 msgid "%{objectname} has been successfully deleted." msgstr "%{objectname} a bien été supprimé." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1237 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1276 msgid "Deleting : %{objectname}" msgstr "Suppression : %{objectname}" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1238 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1277 msgid "Do you really want to delete %{displayName} ?" msgstr "Voulez-vous vraiment supprimer %{displayName} ?" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1348 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1387 msgid "" "The custom action %{customAction} have been successfully execute on " "%{objectname}." @@ -2506,7 +2533,7 @@ msgstr "Fichier" msgid "Forgot your password ?" msgstr "Mot de passe perdu ?" -#: templates/default/import.tpl:13 +#: templates/default/export.tpl:8 templates/default/import.tpl:13 msgid "Format" msgstr "Format" @@ -2654,7 +2681,7 @@ msgstr "Mise à jour des objets existants" msgid "Updated objects" msgstr "Objets mis à jour" -#: templates/default/import.tpl:36 +#: templates/default/export.tpl:15 templates/default/import.tpl:36 msgid "Valid" msgstr "Valider" diff --git a/src/lang/ldapsaisie.pot b/src/lang/ldapsaisie.pot index 96fb281d..dd63e54c 100644 --- a/src/lang/ldapsaisie.pot +++ b/src/lang/ldapsaisie.pot @@ -360,65 +360,65 @@ msgstr "" msgid "LSformRule: Unknown rule type %{type}." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:203 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:208 msgid "Failed to set post data on creation form." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:209 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:214 msgid "Error validating creation form." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:214 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:219 msgid "Failed to validate object data." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:221 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:226 msgid "Failed to generate DN for this object." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:235 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:240 msgid "Error creating object on LDAP server." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:241 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:246 msgid "An object already exist on LDAP server with DN %{dn}." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:252 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:257 msgid "" "Failed to load existing object %{dn} from LDAP server. Can't update object." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:260 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:265 msgid "Failed to set post data on update form." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:266 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:271 msgid "Error validating update form." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:276 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:281 msgid "Error updating object on LDAP server." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:322 -msgid "LSimport : Post data not found or not completed." +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:327 +msgid "LSimport: Post data not found or not completed." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:325 -msgid "LSimport : object type invalid." +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:330 +msgid "LSimport: object type invalid." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:328 -msgid "LSimport : input/output format %{format} invalid." +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:333 +msgid "LSimport: input/output format %{format} invalid." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:331 -msgid "LSimport : Fail to initialize input/output driver" +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:336 +msgid "LSimport: Fail to initialize input/output driver." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:334 -msgid "LSimport : Fail to load objects's data from input file" +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSimport.php:339 +msgid "LSimport: Fail to load objects's data from input file." msgstr "" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattr_ldap_pwdHistory.php:76 @@ -436,9 +436,9 @@ msgstr "" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSconfirmBox.php:37 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsmoothbox.php:39 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSform.php:74 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:618 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1240 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1382 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:623 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1279 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1421 #: templates/default/recoverpassword.tpl:21 msgid "Validate" msgstr "" @@ -569,10 +569,10 @@ msgstr "" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_select_object.php:68 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_supannLabeledValue.php:62 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:174 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1000 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1168 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1253 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1395 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1039 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1207 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1292 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1434 msgid "Modify" msgstr "" @@ -725,6 +725,22 @@ msgid "" "value, you can't select it." msgstr "" +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSexport.php:93 +msgid "LSexport: input/output format %{format} invalid." +msgstr "" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSexport.php:96 +msgid "LSexport: Fail to initialize input/output driver." +msgstr "" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSexport.php:99 +msgid "LSexport: Fail to load objects's data to export from LDAP directory." +msgstr "" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSexport.php:102 +msgid "LSexport: Fail to export objects's data." +msgstr "" + #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformRule_differentPassword.php:90 msgid "" "LSformRule_differentPassword : Other password attribute is not configured." @@ -753,53 +769,53 @@ msgid "" "LSattr_ldap :: password. It's not the case of the attribure %{attr}." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:266 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:250 msgid "The value of field %{label} is invalid." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:720 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:738 msgid "" "LSattribute : Attribute %{attr} : LDAP or HTML types unknow (LDAP = %{ldap} " "& HTML = %{html})." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:723 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:741 msgid "" "LSattribute : The function %{func} to display the attribute %{attr} is " "unknow." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:726 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:744 msgid "" "LSattribute : The rule %{rule} to validate the attribute %{attr} is unknow." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:729 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:747 msgid "" "LSattribute : Configuration data to verify the attribute %{attr} are " "incorrect." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:732 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:750 msgid "" "LSattribute : The function %{func} to save the attribute %{attr} is unknow." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:735 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:753 msgid "LSattribute : The value of the attribute %{attr} can't be generated." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:738 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:756 msgid "LSattribute : Generation of the attribute %{attr} failed." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:741 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:759 msgid "" "LSattribute : Generation of the attribute %{attr} did not return a correct " "value." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:744 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattribute.php:762 msgid "" "LSattribute : The attr_%{type} of the attribute %{name} is not yet defined." msgstr "" @@ -853,7 +869,7 @@ msgstr "" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsession.php:1640 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:156 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:462 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:467 #: templates/default/select.tpl:29 msgid "Refresh" msgstr "" @@ -1262,8 +1278,8 @@ msgstr "" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_select_object.php:69 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_select_object.php:85 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:190 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1016 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1160 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1055 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1199 msgid "Delete" msgstr "" @@ -1274,7 +1290,7 @@ msgstr "" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSrelation.php:712 #: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:449 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:945 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:984 msgid "New" msgstr "" @@ -1436,12 +1452,12 @@ msgid "Delete this field." msgstr "" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSform.php:229 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:614 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:619 msgid "Do you really want to execute custom action %{title} on this search ?" msgstr "" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSform.php:235 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1376 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1415 msgid "" "Do you really want to execute custom action %{customAction} on " "%{objectname} ?" @@ -1579,8 +1595,8 @@ msgid "Display RSS stack." msgstr "" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattr_ldap_password.php:100 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:574 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1326 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:579 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1365 msgid "undefined" msgstr "" @@ -1906,6 +1922,10 @@ msgstr "" msgid "LScli : The CLI command '%{command}' handler is not callable." msgstr "" +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSioFormatCSV.php:236 +msgid "LSioFormatCSV: function fputcsv is not available." +msgstr "" + #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSlog.php:478 msgid "LSlog : Fail to load logging handler %{handler}." msgstr "" @@ -1928,14 +1948,14 @@ msgid "Unknown error : %{error}" msgstr "" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:166 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1152 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1245 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1387 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1191 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1284 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1426 msgid "View" msgstr "" #: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:182 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1008 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1047 msgid "Copy" msgstr "" @@ -1949,7 +1969,7 @@ msgid "" "%{column}." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSioFormat.php:92 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSioFormat.php:144 msgid "LSioFormat : IOformat driver %{driver} invalid or unavailable." msgstr "" @@ -1966,67 +1986,72 @@ msgstr "" msgid "Import" msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:467 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:460 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:871 +msgid "Export" +msgstr "" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:472 msgid "Reset" msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:505 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:510 #: templates/default/select.tpl:28 templates/default/global_search.tpl:6 msgid "Search" msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:506 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:511 #: templates/default/select.tpl:31 msgid "Approximative search" msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:507 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:512 #: templates/default/select.tpl:32 msgid "Recursive search" msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:593 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:598 msgid "" "The custom action %{title} have been successfully execute on this search." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:904 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:943 msgid "Data entry form" msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:910 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1626 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:949 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1665 msgid "Object has been added." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1047 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1086 msgid "My account" msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1110 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1716 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1149 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1755 msgid "The object has been partially modified." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1113 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1719 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1152 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1758 msgid "The object has been modified successfully." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1228 -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1760 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1267 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1799 msgid "%{objectname} has been successfully deleted." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1237 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1276 msgid "Deleting : %{objectname}" msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1238 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1277 msgid "Do you really want to delete %{displayName} ?" msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1348 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1387 msgid "" "The custom action %{customAction} have been successfully execute on " "%{objectname}." @@ -2155,7 +2180,7 @@ msgstr "" msgid "Forgot your password ?" msgstr "" -#: templates/default/import.tpl:13 +#: templates/default/export.tpl:8 templates/default/import.tpl:13 msgid "Format" msgstr "" @@ -2301,7 +2326,7 @@ msgstr "" msgid "Updated objects" msgstr "" -#: templates/default/import.tpl:36 +#: templates/default/export.tpl:15 templates/default/import.tpl:36 msgid "Valid" msgstr "" diff --git a/src/templates/default/export.tpl b/src/templates/default/export.tpl new file mode 100644 index 00000000..928548b4 --- /dev/null +++ b/src/templates/default/export.tpl @@ -0,0 +1,19 @@ +{extends file='ls:base_connected.tpl'} +{block name="content"} + {if $pagetitle != ''}

{$pagetitle|escape:"htmlall"}

{/if} + +
+
+
+
+
+ +
+ +
+
+
+
+{/block}