mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-01 12:23:50 +01:00
189 lines
4.8 KiB
PHP
189 lines
4.8 KiB
PHP
<?php
|
|
/**
|
|
* eGroupWare importexport
|
|
*
|
|
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
|
* @package importexport
|
|
* @link http://www.egroupware.org
|
|
* @author Cornelius Weiss <nelius@cwtech.de>
|
|
* @copyright Cornelius Weiss <nelius@cwtech.de>
|
|
* @version $Id$
|
|
*/
|
|
|
|
require_once('class.iface_export_record.inc.php');
|
|
require_once('class.import_export_helper_functions.inc.php');
|
|
require_once('class.iface_egw_record.inc.php');
|
|
require_once(EGW_INCLUDE_ROOT. '/phpgwapi/inc/class.translation.inc.php');
|
|
|
|
/**
|
|
* class export_csv
|
|
* This an record exporter.
|
|
* An record is e.g. a single address or or single event.
|
|
* No mater where the records come from, at the end export_entry
|
|
* stores it into the stream
|
|
*/
|
|
class export_csv implements iface_export_record
|
|
{
|
|
/**
|
|
* @var array array with field mapping in form egw_field_name => exported_field_name
|
|
*/
|
|
protected $mapping = array();
|
|
|
|
/**
|
|
* @var array array with conversions to be done in form: egw_field_name => conversion_string
|
|
*/
|
|
protected $conversion = array();
|
|
|
|
/**
|
|
* @var array holding the current record
|
|
*/
|
|
protected $record = array();
|
|
|
|
/**
|
|
* @var translation holds (charset) translation object
|
|
*/
|
|
protected $translation;
|
|
|
|
/**
|
|
* @var string charset of csv file
|
|
*/
|
|
protected $csv_charset;
|
|
|
|
/**
|
|
* @var int holds number of exported records
|
|
*/
|
|
protected $num_of_records = 0;
|
|
|
|
/**
|
|
* @var stream stream resource of csv file
|
|
*/
|
|
protected $handle;
|
|
|
|
/**
|
|
* @var array csv specific options
|
|
*/
|
|
protected $csv_options = array(
|
|
'delimiter' => ';',
|
|
'enclosure' => '"',
|
|
);
|
|
|
|
/**
|
|
* constructor
|
|
*
|
|
* @param stram $_stream resource where records are exported to.
|
|
* @param array _options options for specific backends
|
|
* @return bool
|
|
*/
|
|
public function __construct( $_stream, array $_options ) {
|
|
if (!is_object($GLOBALS['egw']->translation)) {
|
|
$GLOBALS['egw']->translation = new translation();
|
|
}
|
|
$this->translation = &$GLOBALS['egw']->translation;
|
|
$this->handle = $_stream;
|
|
$this->csv_charset = $_options['charset'] ? $_options['charset'] : 'utf-8';
|
|
if ( !empty( $_options ) ) {
|
|
$this->csv_options = array_merge( $this->csv_options, $_options );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* sets field mapping
|
|
*
|
|
* @param array $_mapping egw_field_name => csv_field_name
|
|
*/
|
|
public function set_mapping( array $_mapping) {
|
|
if ($this->num_of_records > 0) {
|
|
throw new Exception('Error: Field mapping can\'t be set during ongoing export!');
|
|
}
|
|
$this->mapping = $_mapping;
|
|
}
|
|
|
|
/**
|
|
* Sets conversion.
|
|
* See import_export_helper_functions::conversion.
|
|
*
|
|
* @param array $_conversion
|
|
*/
|
|
public function set_conversion( array $_conversion) {
|
|
$this->conversion = $_conversion;
|
|
}
|
|
|
|
/**
|
|
* exports a record into resource of handle
|
|
*
|
|
* @param iface_egw_record record
|
|
* @return bool
|
|
*/
|
|
public function export_record( iface_egw_record $_record ) {
|
|
$this->record = $_record->get_record_array();
|
|
|
|
// begin with fieldnames ?
|
|
if ($this->num_of_records == 0 && $this->csv_options['begin_with_fieldnames'] ) {
|
|
$mapping = ! empty( $this->mapping ) ? $this->mapping : array_keys ( $this->record );
|
|
$mapping = $this->translation->convert( $mapping, $this->translation->charset(), $this->csv_charset );
|
|
fputcsv( $this->handle ,$mapping ,$this->csv_options['delimiter'], $this->csv_options['enclosure'] );
|
|
}
|
|
|
|
// do conversions
|
|
if ( !empty( $this->conversion )) {
|
|
$this->record = import_export_helper_functions::conversion( $this->record, $this->conversion );
|
|
}
|
|
|
|
// do fieldmapping
|
|
if ( !empty( $this->mapping ) ) {
|
|
$record_data = $this->record;
|
|
$this->record = array();
|
|
foreach ($this->mapping as $egw_field => $csv_field) {
|
|
$this->record[$csv_field] = $record_data[$egw_field];
|
|
}
|
|
}
|
|
|
|
// do charset translation
|
|
$this->record = $this->translation->convert( $this->record, $this->translation->charset(), $this->csv_charset );
|
|
|
|
$this->fputcsv( $this->handle, $this->record, $this->csv_options['delimiter'], $this->csv_options['enclosure'] );
|
|
$this->num_of_records++;
|
|
}
|
|
|
|
/**
|
|
* Retruns total number of exported records.
|
|
*
|
|
* @return int
|
|
*/
|
|
public function get_num_of_records() {
|
|
return $this->num_of_records;
|
|
}
|
|
|
|
/**
|
|
* destructor
|
|
*
|
|
* @return
|
|
*/
|
|
public function __destruct() {
|
|
|
|
}
|
|
|
|
/**
|
|
* The php build in fputcsv function is buggy, so we need an own one :-(
|
|
*
|
|
* @param resource $filePointer
|
|
* @param array $dataArray
|
|
* @param char $delimiter
|
|
* @param char $enclosure
|
|
*/
|
|
protected function fputcsv($filePointer, $dataArray, $delimiter, $enclosure){
|
|
$string = "";
|
|
$writeDelimiter = false;
|
|
foreach($dataArray as $dataElement) {
|
|
if($writeDelimiter) $string .= $delimiter;
|
|
$string .= $enclosure . $dataElement . $enclosure;
|
|
$writeDelimiter = true;
|
|
}
|
|
$string .= "\n";
|
|
|
|
fwrite($filePointer, $string);
|
|
|
|
}
|
|
} // end export_csv_record
|
|
?>
|