<?php
/*
part-db version 0.1
Copyright (C) 2005 Christoph Lechner
http://www.cl-projects.de/
part-db version 0.2+
Copyright (C) 2009 K. Jacobs and others (see authors.php)
http://code.google.com/p/part-db/
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
$Id: lib.export.php 640 2013-05-22 14:44:45Z kami89@bluewin.ch $
Changelog (sorted by date):
[DATE] [NICKNAME] [CHANGES]
2012-12-22 kami89 - created
*/
/**
* @file lib.export.php
* @brief Miscellaneous Functions for Data Export
* @author kami89
*/
/**
* @brief Build a template loop for a <select> list of export formats
*
* @param string $export_type An export type which is defined in config_defaults.php ($config['export'][_HERE_IS_THE_EXPORT_TYPE_][0])
* @param integer|string $selected_index The ID of the selected export type (from config_defaults.php): $config['export']['searchparts'][_HERE_IS_THE_FORMAT_ID_]
*
* @retval array The template loop
*/
function build_export_formats_loop($export_type, $selected_index = 0)
{
global $config;
if ( ! ctype_alpha($selected_index))
settype($selected_index, 'integer');
$loop = array();
foreach ($config['export'][$export_type] as $key => $value)
$loop[] = array('value' => $key, 'text' => '['.$value['format'].'] '.$value['name'], 'selected' => ($key === $selected_index));
return $loop;
}
/**
* @brief Export Part or DevicePart Objects
*
* @param array &$objects Array of Objects (Supported: Part, DevicePart)
* @param string $export_type An export type which is defined in config_defaults.php: $config['export'][_HERE_IS_THE_EXPORT_TYPE_][0]
* @param integer|string $format_id The ID of the export type (from config_defaults.php): $config['export']['searchparts'][_HERE_IS_THE_FORMAT_ID_]
* @param boolean $send_file @li If true, the export file will directly send to the user with lib.php::send_string()
* @li If false, the export string will be returned
* @param string $filename @li The filename which should be displayed in the download dialog (without extension!)
* @li This is only needed if "$send_file == true"
* @param array $additional_params For some things we need more parameters, like the export quantity of DevicePart objects for calculating the total price
*
* @retval string The export string (if $send_file is "false")
*
* @note If $send_file is "true", the script will be stopped by "exit;" !
*
* @throws Exception if there was an error
*/
function export_parts(&$objects, $export_type, $format_id, $send_file = false, $filename = '', $additional_params = array())
{
global $config;
if (( ! isset($config['export'][$export_type])) || ( ! isset($config['export'][$export_type][$format_id])))
throw new Exception('Es gibt kein Exportformat in dieser Variable: $config[\'export\'][\''.$export_type.'\'][\''.$format_id.'\']');
$format = strtoupper($config['export'][$export_type][$format_id]['format']);
$columns = explode(';', $config['export'][$export_type][$format_id]['columns']);
// prepare stuff
switch ($format)
{
case 'CSV':
$separator = $config['export'][$export_type][$format_id]['separator']; // the separator is needed for CSV export!
$items_separator = (($separator == ';') ? ',' : ';');
$show_header = $config['export'][$export_type][$format_id]['header']; // the header is needed for CSV export!
if ($show_header)
$output = '#'.implode($separator, $columns)."\n"; // header
else
$output = '';
break;
case 'XML':
$items_separator = ',';
$dom = new DOMDocument('1.0', 'utf-8');
$dom->formatOutput = true;
$root_node = $dom->createElement('parts');
$dom->appendChild($root_node);
break;
case 'TXT':
$separator = $config['export'][$export_type][$format_id]['separator']; // the separator is needed for CSV export!
$items_separator = (($separator == ';') ? ',' : ';');
$show_header = $config['export'][$export_type][$format_id]['header']; // the header is needed for CSV export!
if ($show_header)
$output = '#'.implode($separator, $columns)."\n"; // header
else
$output = '';
break;
default:
throw new Exception('Nicht unterstütztes Exportformat: "'.$format.'"');
}
foreach ($objects as $object)
{
// prepare stuff for the next object
switch ($format)
{
case 'CSV':
$column_output = '';
break;
case 'XML':
$object_node = $dom->createElement(strtolower(get_class($object)));
break;
case 'TXT':
$column_output = '';
break;
}
switch (get_class($object))
{
case 'Part':
$part = $object;
break;
case 'DevicePart':
$part = $object->get_part();
$devicepart = $object;
break;
default:
throw new Exception('Klasse "'.get_class($object).'" kann nicht exportiert werden (wird nicht unterstützt)!');
break;
}
for ($i=0; $i<count($columns); $i++)
{
$column = $columns[$i];
switch ($column)
{
// sometimes empty columns are needed...
case '':
$value = '';
break;
// general parts stuff
case 'id':
$value = $part->get_id();
break;
case 'name':
$value = $part->get_name();
break;
case 'description':
$value = $part->get_description();
break;
case 'instock':
$value = $part->get_instock();
break;
case 'mininstock':
$value = $part->get_mininstock();
break;
case 'footprint':
if (is_object($part->get_footprint()))
$value = $part->get_footprint()->get_name();
else
$value = '';
break;
case 'footprint_fullpath':
if (is_object($part->get_footprint()))
$value = $part->get_footprint()->get_full_path();
else
$value = '';
break;
case 'manufacturer':
if (is_object($part->get_manufacturer()))
$value = $part->get_manufacturer()->get_name();
else
$value = '';
break;
case 'manufacturer_fullpath':
if (is_object($part->get_manufacturer()))
$value = $part->get_manufacturer()->get_full_path();
else
$value = '';
break;
case 'storelocation':
if (is_object($part->get_storelocation()))
$value = $part->get_storelocation()->get_name();
else
$value = '';
break;
case 'storelocation_fullpath':
if (is_object($part->get_storelocation()))
$value = $part->get_storelocation()->get_full_path();
else
$value = '';
break;
case 'suppliers':
$value = $part->get_suppliers(false, $items_separator, false, true);
break;
case 'suppliers_fullpath':
$value = $part->get_suppliers(false, $items_separator, true, true);
break;
case 'supplierpartnrs':
$value = $part->get_supplierpartnrs($items_separator, true);
break;
case 'average_single_price':
$value = $part->get_average_price(true);
break;
case 'single_prices':
$value = $part->get_prices(false, $items_separator, 1, NULL, true);
break;
// order parts stuff
case 'order_supplier':
if (is_object($part->get_order_orderdetails()))
$value = $part->get_order_orderdetails()->get_supplier()->get_name();
else
$value = '';
break;
case 'order_supplierpartnr':
if (is_object($part->get_order_orderdetails()))
$value = $part->get_order_orderdetails()->get_supplierpartnr();
else
$value = '';
break;
case 'order_quantity':
$value = $part->get_order_quantity();
break;
case 'order_single_price': // the single price of the selected orderdetails
if (is_object($part->get_order_orderdetails()))
$value = $part->get_order_orderdetails()->get_price(true);
else
$value = '';
break;
case 'order_total_price': // the total price of the selected orderdetails
if (is_object($part->get_order_orderdetails()))
$value = $part->get_order_orderdetails()->get_price(true, $object->get_order_quantity());
else
$value = '';
break;
case 'order_total_prices':
$value = $part->get_prices(false, $items_separator, $part->get_order_quantity(), NULL, true);
break;
// device parts stuff
case 'mount_quantity':
$value = $devicepart->get_mount_quantity();
break;
case 'total_mount_quantity':
if ( ! isset($additional_params['export_quantity']))
throw new Exception('$additional_params[\'export_quantity\'] ist nicht gesetzt!');
$value = $devicepart->get_mount_quantity() * (integer)$additional_params['export_quantity'];
break;
case 'mount_names':
$value = $devicepart->get_mount_names();
break;
case 'total_prices':
if ( ! isset($additional_params['export_quantity']))
throw new Exception('$additional_params[\'export_quantity\'] ist nicht gesetzt!');
$value = $part->get_prices(false, $items_separator, $devicepart->get_mount_quantity() * (integer)$additional_params['export_quantity'], NULL, true);
break;
// unknown column
default:
throw new Exception('Nicht unterstützte Spalte: "'.$column.'"');
break;
}
// finish stuff for that column
switch ($format)
{
case 'CSV':
$column_output .= str_replace($separator, ' ', $value);
if ($i < (count($columns) - 1))
$column_output .= $separator; // Add the separator if this is not the last column
break;
case 'XML':
$column_node = $dom->createElement($column, $value);
$object_node->appendChild($column_node); // append the new column child to the object node
break;
case 'TXT':
$column_output .= str_replace($separator, ' ', $value);
if ($i < (count($columns) - 1))
$column_output .= $separator; // Add the separator if this is not the last column
break;
}
}
// finish stuff for that object (only if that object has to be exported!)
if ((( ! in_array('order_supplier', $columns)) && ( ! in_array('order_supplierpartnr', $columns))
&& ( ! in_array('order_single_price', $columns)) && ( ! in_array('order_total_price', $columns)))
|| (isset($part) && is_object($part->get_order_orderdetails())))
{
switch ($format)
{
case 'CSV':
$output .= $column_output."\n"; // Add a line break
break;
case 'XML':
$root_node->appendChild($object_node); // append the new object node to the root node
break;
case 'TXT':
$output .= $column_output."\n"; // Add a line break
break;
}
}
}
// finish stuff
switch ($format)
{
case 'CSV':
// nothing to do, the CSV is already in $output
break;
case 'XML':
$output = $dom->saveXML($dom, LIBXML_NOEMPTYTAG); // write the XML from the DOMDocument to $output
break;
case 'TXT':
// nothing to do, the TXT is already in $output
break;
}
// send file or return string
if ($send_file)
{
$mimetype = $config['export'][$export_type][$format_id]['mimetype'];
$filename .= '.'.substr($mimetype, strpos($mimetype, '/') + 1);
send_string($output, $filename, $mimetype); // in this function is an "exit;" !
}
else
return $output;
}
?>