2006-01-21 20:08:36 +01:00
< ? php
2009-02-14 01:36:49 +01:00
/* Copyright ( C ) 2006 - 2009 Laurent Destailleur < eldy @ users . sourceforge . net >
2009-09-28 22:06:15 +02:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
* or see http :// www . gnu . org /
*/
2006-01-21 20:08:36 +01:00
/**
2008-08-25 09:04:51 +02:00
* \file htdocs / includes / modules / export / export_csv . modules . php
* \ingroup export
2009-02-14 01:36:49 +01:00
* \brief File to build exports with CSV format
2008-08-25 09:04:51 +02:00
* \author Laurent Destailleur
* \version $Id $
2009-02-14 01:36:49 +01:00
*/
2006-01-21 20:08:36 +01:00
require_once ( DOL_DOCUMENT_ROOT . " /includes/modules/export/modules_export.php " );
/**
2008-08-25 09:04:51 +02:00
* \class ExportCsv
2009-03-25 22:26:15 +01:00
* \brief Classe permettant de generer les fichiers exports au format CSV
2008-08-25 09:04:51 +02:00
*/
2006-01-21 20:08:36 +01:00
class ExportCsv extends ModeleExports
{
2009-09-28 22:06:15 +02:00
var $id ;
var $label ;
var $extension ;
var $version ;
var $label_lib ;
var $version_lib ;
var $separator ;
var $handle ; // Handle fichier
/**
* \brief Constructeur
* \param db Handler acces base de donnee
*/
function ExportCsv ( $db )
{
global $conf ;
$this -> db = $db ;
$this -> separator = ',' ;
if ( ! empty ( $conf -> global -> EXPORT_CSV_SEPARATOR_TO_USE )) $this -> separator = $conf -> global -> EXPORT_CSV_SEPARATOR_TO_USE ;
$this -> escape = '"' ;
2009-10-03 01:07:31 +02:00
$this -> enclosure = '"' ;
2009-09-28 22:06:15 +02:00
$this -> id = 'csv' ; // Same value then xxx in file name export_xxx.modules.php
$this -> label = 'Csv' ; // Label of driver
2009-10-03 14:08:48 +02:00
$this -> desc = '<b>Comma Separated Value</b> file format (.csv).<br>This is a text file format where fields are separated by separator [ ' . $this -> separator . ' ]. If separator is found inside a field content, field is rounded by round character [ ' . $this -> enclosure . ' ]. Escape character to escape round character is [ ' . $this -> escape . ' ].' ;
2009-09-28 22:06:15 +02:00
$this -> extension = 'csv' ; // Extension for generated file by this driver
$this -> picto = 'mime/other' ; // Picto
2009-10-20 15:14:44 +02:00
$ver = explode ( ' ' , '$Revision$' );
2009-09-28 22:06:15 +02:00
$this -> version = $ver [ 2 ]; // Driver version
// If driver use an external library, put its name here
$this -> label_lib = 'Dolibarr' ;
$this -> version_lib = DOL_VERSION ;
}
function getDriverId ()
{
return $this -> id ;
}
function getDriverLabel ()
{
return $this -> label ;
}
function getDriverDesc ()
{
return $this -> desc ;
}
function getDriverExtension ()
{
return $this -> extension ;
}
function getDriverVersion ()
{
return $this -> version ;
}
function getLibLabel ()
{
return $this -> label_lib ;
}
function getLibVersion ()
{
return $this -> version_lib ;
}
/**
* \brief Open output file
2009-02-14 01:36:49 +01:00
* \param file Path of filename
* \return int < 0 if KO , >= 0 if OK
*/
2008-10-27 00:15:09 +01:00
function open_file ( $file , $outputlangs )
2009-09-28 22:06:15 +02:00
{
global $langs ;
2009-05-19 02:14:27 +02:00
2009-09-28 22:06:15 +02:00
dol_syslog ( " ExportCsv::open_file file= " . $file );
2008-03-30 17:49:25 +02:00
$ret = 1 ;
2009-05-19 02:14:27 +02:00
2009-09-28 22:06:15 +02:00
$outputlangs -> load ( " exports " );
2008-03-30 17:49:25 +02:00
$this -> handle = fopen ( $file , " wt " );
2009-09-28 22:06:15 +02:00
if ( ! $this -> handle )
2008-03-30 17:49:25 +02:00
{
$langs -> load ( " errors " );
$this -> error = $langs -> trans ( " ErrorFailToCreateFile " , $file );
$ret =- 1 ;
}
2009-05-19 02:14:27 +02:00
2008-03-30 17:49:25 +02:00
return $ret ;
2009-04-28 12:16:31 +02:00
}
2006-01-21 20:08:36 +01:00
2008-08-25 09:04:51 +02:00
/**
* \brief Output header into file
* \param langs Output language
*/
2009-09-28 22:06:15 +02:00
function write_header ( $outputlangs )
{
return 0 ;
}
2006-01-21 20:08:36 +01:00
2008-08-25 09:04:51 +02:00
/**
* \brief Output title line into file
* \param langs Output language
*/
2009-09-28 22:06:15 +02:00
function write_title ( $array_export_fields_label , $array_selected_sorted , $outputlangs )
{
global $conf ;
if ( ! empty ( $conf -> global -> EXPORT_CSV_FORCE_CHARSET ))
{
$outputlangs -> charset_output = $conf -> global -> EXPORT_CSV_FORCE_CHARSET ;
}
else
{
$outputlangs -> charset_output = 'ISO-8859-1' ;
}
foreach ( $array_selected_sorted as $code => $value )
{
$newvalue = $outputlangs -> transnoentities ( $array_export_fields_label [ $code ]);
$newvalue = $this -> csv_clean ( $newvalue );
fwrite ( $this -> handle , $newvalue . $this -> separator );
}
fwrite ( $this -> handle , " \n " );
return 0 ;
}
2006-01-21 20:08:36 +01:00
2008-08-25 09:04:51 +02:00
/**
* \brief Output record line into file
*/
2009-09-28 22:06:15 +02:00
function write_record ( $array_alias , $array_selected_sorted , $objp , $outputlangs )
{
global $conf ;
if ( ! empty ( $conf -> global -> EXPORT_CSV_FORCE_CHARSET ))
{
$outputlangs -> charset_output = $conf -> global -> EXPORT_CSV_FORCE_CHARSET ;
}
else
{
$outputlangs -> charset_output = 'ISO-8859-1' ;
}
$this -> col = 0 ;
foreach ( $array_selected_sorted as $code => $value )
{
$alias = $array_alias [ $code ];
if ( empty ( $alias )) dol_print_error ( '' , 'Bad value for field with code=' . $code . '. Try to redefine export.' );
$newvalue = $outputlangs -> convToOutputCharset ( $objp -> $alias );
// Translation newvalue
2009-10-22 17:09:04 +02:00
if ( preg_match ( '/^\((.*)\)$/i' , $newvalue , $reg ))
2009-09-28 22:06:15 +02:00
{
$newvalue = $outputlangs -> transnoentities ( $reg [ 1 ]);
}
$newvalue = $this -> csv_clean ( $newvalue );
fwrite ( $this -> handle , $newvalue . $this -> separator );
$this -> col ++ ;
}
fwrite ( $this -> handle , " \n " );
return 0 ;
}
2006-01-21 20:08:36 +01:00
2008-08-25 09:04:51 +02:00
/**
* \brief Output footer into file
2008-10-27 00:15:09 +01:00
* \param outputlangs Output language
2008-08-25 09:04:51 +02:00
*/
2009-09-28 22:06:15 +02:00
function write_footer ( $outputlangs )
{
2008-10-27 00:15:09 +01:00
return 0 ;
2009-09-28 22:06:15 +02:00
}
2009-05-19 02:14:27 +02:00
2008-08-25 09:04:51 +02:00
/**
* \brief Close file handle
*/
2009-09-28 22:06:15 +02:00
function close_file ()
{
fclose ( $this -> handle );
return 0 ;
}
/**
* Clean a cell to respect rules of CSV file cells
* @ param newvalue String to clean
* @ return string Value cleaned
*/
function csv_clean ( $newvalue )
{
$addquote = 0 ;
2009-05-19 02:14:27 +02:00
2008-08-25 09:04:51 +02:00
// Rule Dolibarr: No HTML
2008-11-06 02:31:57 +01:00
$newvalue = dol_string_nohtmltag ( $newvalue );
2008-08-25 09:04:51 +02:00
// Rule 1 CSV: No CR, LF in cells
2009-10-21 20:14:00 +02:00
$newvalue = str_replace ( " \r " , '' , $newvalue );
$newvalue = str_replace ( " \n " , '\n' , $newvalue );
2009-05-19 02:14:27 +02:00
2009-09-28 22:06:15 +02:00
// Rule 2 CSV: If value contains ", we must escape with ", and add "
2009-10-21 20:14:00 +02:00
if ( preg_match ( '/"/' , $newvalue ))
2008-08-25 09:04:51 +02:00
{
$addquote = 1 ;
2009-10-21 20:14:00 +02:00
$newvalue = str_replace ( '"' , '""' , $newvalue );
2008-08-25 09:04:51 +02:00
}
// Rule 3 CSV: If value contains separator, we must add "
2009-10-21 20:14:00 +02:00
if ( preg_match ( '/' . $this -> separator . '/' , $newvalue ))
2009-09-28 22:06:15 +02:00
{
$addquote = 1 ;
}
2009-05-19 02:14:27 +02:00
2009-09-28 22:06:15 +02:00
return ( $addquote ? '"' : '' ) . $newvalue . ( $addquote ? '"' : '' );
}
2009-05-19 02:14:27 +02:00
2006-01-21 20:08:36 +01:00
}
?>