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 00000000..28e41ea2 Binary files /dev/null and b/src/images/default/export.png differ diff --git a/src/includes/class/class.LSattribute.php b/src/includes/class/class.LSattribute.php index ff4bbaaf..9413a6b5 100644 --- a/src/includes/class/class.LSattribute.php +++ b/src/includes/class/class.LSattribute.php @@ -220,66 +220,46 @@ class LSattribute extends LSlog_staticLoggerClass { * @retval boolean true si l'ajout a fonctionner ou qu'il n'est pas nécessaire, false sinon */ public function addToForm(&$form,$idForm,&$obj=NULL,$value=NULL) { - if($this -> 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 9e0c8937..710ae162 100644 Binary files a/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo and b/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo differ diff --git a/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po b/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po index 1d7fb580..652392c0 100644 --- a/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po +++ b/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: LdapSaisie\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-04 11:51+0100\n" +"PO-Revision-Date: 2021-02-05 10:32+0100\n" "Last-Translator: Benjamin Renard \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}