mirror of
https://github.com/EGroupware/egroupware.git
synced 2025-08-17 12:01:20 +02:00
initial import of my importexport work,
export is quite clean at the moment, but import needs lots of work, all the stuff is not really for production yet, but i import it now, so that the guy from metaways can also work on it. most pending tasks: - implement conversions based on regular expressions - implement options of plugin - rework import part (mostly ui)
This commit is contained in:
200
importexport/inc/class.export_csv.inc.php
Normal file
200
importexport/inc/class.export_csv.inc.php
Normal file
@ -0,0 +1,200 @@
|
||||
<?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');
|
||||
|
||||
/**
|
||||
* 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
|
||||
{
|
||||
|
||||
/** Aggregations: */
|
||||
|
||||
/** Compositions: */
|
||||
|
||||
/**
|
||||
* array with field mapping in form egw_field_name => exported_field_name
|
||||
* @var array
|
||||
*/
|
||||
protected $mapping = array();
|
||||
|
||||
/**
|
||||
* array with conversions to be done in form: egw_field_name => conversion_string
|
||||
* @var array
|
||||
*/
|
||||
protected $conversion = array();
|
||||
|
||||
/**
|
||||
* array holding the current record
|
||||
* @access protected
|
||||
*/
|
||||
protected $record = array();
|
||||
|
||||
/**
|
||||
* holds (charset) translation object
|
||||
* @var object
|
||||
*/
|
||||
protected $translation;
|
||||
|
||||
/**
|
||||
* charset of csv file
|
||||
* @var string
|
||||
*/
|
||||
protected $csv_charset;
|
||||
|
||||
/**
|
||||
* holds number of exported records
|
||||
* @var unknown_type
|
||||
*/
|
||||
protected $num_of_records = 0;
|
||||
|
||||
/**
|
||||
* stream resource of csv file
|
||||
* @var resource
|
||||
*/
|
||||
protected $handle;
|
||||
|
||||
/**
|
||||
* csv specific options
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $csv_options = array(
|
||||
'delimiter' => ';',
|
||||
'enclosure' => '"',
|
||||
);
|
||||
|
||||
/**
|
||||
* constructor
|
||||
*
|
||||
* @param object _handle resource where records are exported to.
|
||||
* @param string _charset charset the records are exported to.
|
||||
* @param array _options options for specific backends
|
||||
* @return bool
|
||||
* @access public
|
||||
*/
|
||||
public function __construct( $_handle, $_charset, array $_options=array() ) {
|
||||
$this->translation &= $GLOBALS['egw']->translation;
|
||||
$this->handle = $_handle;
|
||||
$this->csv_charset = $_charset;
|
||||
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!');
|
||||
}
|
||||
foreach ($_mapping as $egw_filed => $csv_field) {
|
||||
$this->mapping[$egw_filed] = $this->translation->convert($csv_field, $this->csv_charset);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
* @access public
|
||||
*/
|
||||
public function export_record( iface_egw_record $_record ) {
|
||||
$record_data = $_record->get_record_array();
|
||||
|
||||
if (empty($this->mapping)) {
|
||||
$this->mapping = array_combine(array_keys($record_data),array_keys($record_data));
|
||||
}
|
||||
|
||||
if ($this->num_of_records == 0 && $this->csv_options['begin_with_fieldnames'] && !empty($this->mapping)) {
|
||||
fputcsv($this->handle,array_values($this->mapping),$this->csv_options['delimiter'],$this->csv_options['enclosure']);
|
||||
}
|
||||
|
||||
// do conversions
|
||||
if ($this->conversion[$egw_field]) {
|
||||
$record_data[$egw_field] = import_export_helper_functions::conversion($record_data,$this->conversion);
|
||||
}
|
||||
|
||||
// do fieldmapping
|
||||
foreach ($this->mapping as $egw_field => $csv_field) {
|
||||
$this->record[$csv_field] = $record_data[$egw_field];
|
||||
}
|
||||
|
||||
$this->fputcsv($this->handle,$this->record,$this->csv_options['delimiter'],$this->csv_options['enclosure']);
|
||||
$this->num_of_records++;
|
||||
$this->record = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retruns total number of exported records.
|
||||
*
|
||||
* @return int
|
||||
* @access public
|
||||
*/
|
||||
public function get_num_of_records() {
|
||||
return $this->num_of_records;
|
||||
}
|
||||
|
||||
/**
|
||||
* destructor
|
||||
*
|
||||
* @return
|
||||
* @access public
|
||||
*/
|
||||
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
|
||||
?>
|
Reference in New Issue
Block a user