diff --git a/languages/bg.lang b/languages/bg.lang
index 22cf6496..f11bb96b 100644
--- a/languages/bg.lang
+++ b/languages/bg.lang
@@ -22,6 +22,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/ca.lang b/languages/ca.lang
index 20727ffe..24272463 100644
--- a/languages/ca.lang
+++ b/languages/ca.lang
@@ -21,6 +21,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/cn.lang b/languages/cn.lang
index 33cafebd..15b3e3ea 100644
--- a/languages/cn.lang
+++ b/languages/cn.lang
@@ -21,6 +21,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/cs.lang b/languages/cs.lang
index 1d7b8ef7..5560051f 100644
--- a/languages/cs.lang
+++ b/languages/cs.lang
@@ -25,6 +25,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/da.lang b/languages/da.lang
index a88a3b4e..1e1a1afb 100644
--- a/languages/da.lang
+++ b/languages/da.lang
@@ -24,6 +24,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/de.lang b/languages/de.lang
index de18922b..2b408ea9 100644
--- a/languages/de.lang
+++ b/languages/de.lang
@@ -22,6 +22,7 @@ $PALANG['show'] = 'Anzeigen:';
$PALANG['all'] = 'Alle';
$PALANG['created'] = 'Erstellt';
$PALANG['unknown'] = 'unbekannt';
+$PALANG['download_csv'] = 'Diese Liste als CSV-Datei herunterladen';
$PALANG['missing_field'] = 'Das Feld %s fehlt';
$PALANG['must_be_numeric'] = '%s muss numerisch sein';
$PALANG['must_be_boolean'] = "%s muss ein Bool'scher Wert sein";
diff --git a/languages/en.lang b/languages/en.lang
index 8047eef3..43182811 100644
--- a/languages/en.lang
+++ b/languages/en.lang
@@ -22,6 +22,7 @@ $PALANG['show'] = 'Show:';
$PALANG['all'] = 'All';
$PALANG['created'] = 'Created';
$PALANG['unknown'] = 'unknown';
+$PALANG['download_csv'] = 'Download this list as CSV file';
$PALANG['missing_field'] = 'Field %s is missing';
$PALANG['must_be_numeric'] = '%s must be numeric';
$PALANG['must_be_boolean'] = '%s must be boolean';
diff --git a/languages/es.lang b/languages/es.lang
index 4c7cfe69..8efbc3fa 100644
--- a/languages/es.lang
+++ b/languages/es.lang
@@ -22,6 +22,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/et.lang b/languages/et.lang
index c7db5485..3f6e7422 100644
--- a/languages/et.lang
+++ b/languages/et.lang
@@ -21,6 +21,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/eu.lang b/languages/eu.lang
index ed378525..bb301cd3 100644
--- a/languages/eu.lang
+++ b/languages/eu.lang
@@ -21,6 +21,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/fi.lang b/languages/fi.lang
index f1dcc433..d72be66e 100644
--- a/languages/fi.lang
+++ b/languages/fi.lang
@@ -22,6 +22,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/fo.lang b/languages/fo.lang
index 866728d8..01f14d6f 100644
--- a/languages/fo.lang
+++ b/languages/fo.lang
@@ -21,6 +21,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/fr.lang b/languages/fr.lang
index 56f7ddb7..ab97d8ab 100644
--- a/languages/fr.lang
+++ b/languages/fr.lang
@@ -23,6 +23,7 @@ $PALANG['show'] = 'Afficher:';
$PALANG['all'] = 'Tous';
$PALANG['created'] = 'Créé';
$PALANG['unknown'] = 'inconnu';
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Le champ %s est manquant';
$PALANG['must_be_numeric'] = '%s doit être numérique';
$PALANG['must_be_boolean'] = '%s doit être booléen';
diff --git a/languages/hr.lang b/languages/hr.lang
index 3d1bd4b4..a76353ca 100644
--- a/languages/hr.lang
+++ b/languages/hr.lang
@@ -20,6 +20,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/hu.lang b/languages/hu.lang
index 7aabccbd..08d0d7e6 100644
--- a/languages/hu.lang
+++ b/languages/hu.lang
@@ -21,6 +21,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/is.lang b/languages/is.lang
index 36041b41..b522e84a 100644
--- a/languages/is.lang
+++ b/languages/is.lang
@@ -21,6 +21,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/it.lang b/languages/it.lang
index bf7120b5..61b983e7 100644
--- a/languages/it.lang
+++ b/languages/it.lang
@@ -22,6 +22,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/ja.lang b/languages/ja.lang
index 9efb7bc2..3ef38172 100644
--- a/languages/ja.lang
+++ b/languages/ja.lang
@@ -22,6 +22,7 @@ $PALANG['show'] = '閲覧:';
$PALANG['all'] = '全て';
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/lt.lang b/languages/lt.lang
index e9053609..5545137a 100644
--- a/languages/lt.lang
+++ b/languages/lt.lang
@@ -21,6 +21,7 @@ $PALANG['show'] = 'Rodyti:';
$PALANG['all'] = 'Visi';
$PALANG['created'] = 'Sukurta';
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/mk.lang b/languages/mk.lang
index 152cf564..ea950e1a 100644
--- a/languages/mk.lang
+++ b/languages/mk.lang
@@ -21,6 +21,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/nb.lang b/languages/nb.lang
index 4dff1659..7969a917 100644
--- a/languages/nb.lang
+++ b/languages/nb.lang
@@ -23,6 +23,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/nl.lang b/languages/nl.lang
index 918c86b9..44d923bc 100644
--- a/languages/nl.lang
+++ b/languages/nl.lang
@@ -22,6 +22,7 @@ $PALANG['show'] = 'Toon:';
$PALANG['all'] = 'Alle';
$PALANG['created'] = 'Aangemaakt'; #XXX
$PALANG['unknown'] = 'onbekend'; #XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Veld %s is niet aanwezig'; #XXX
$PALANG['must_be_numeric'] = '%s moet een getal zijn'; #XXX
$PALANG['must_be_boolean'] = '%s moet een boolean zijn'; #XXX
diff --git a/languages/nn.lang b/languages/nn.lang
index 5a31bb18..7ae8daf6 100644
--- a/languages/nn.lang
+++ b/languages/nn.lang
@@ -21,6 +21,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/pl.lang b/languages/pl.lang
index 2938f58d..feb418ff 100644
--- a/languages/pl.lang
+++ b/languages/pl.lang
@@ -24,6 +24,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/pt-br.lang b/languages/pt-br.lang
index e832eb42..aeaaf69d 100644
--- a/languages/pt-br.lang
+++ b/languages/pt-br.lang
@@ -22,6 +22,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/ru.lang b/languages/ru.lang
index 808b991c..15cdb11d 100644
--- a/languages/ru.lang
+++ b/languages/ru.lang
@@ -23,6 +23,7 @@ $PALANG['show'] = 'Показать:';
$PALANG['all'] = 'Все';
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/sk.lang b/languages/sk.lang
index 62a0d1c4..bae21073 100644
--- a/languages/sk.lang
+++ b/languages/sk.lang
@@ -22,6 +22,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/sl.lang b/languages/sl.lang
index 8dc15f8c..2ccba55d 100644
--- a/languages/sl.lang
+++ b/languages/sl.lang
@@ -21,6 +21,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/sv.lang b/languages/sv.lang
index 8a5586c0..ba8e7ac5 100644
--- a/languages/sv.lang
+++ b/languages/sv.lang
@@ -23,6 +23,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/tr.lang b/languages/tr.lang
index 2f116fae..a0639a9c 100644
--- a/languages/tr.lang
+++ b/languages/tr.lang
@@ -21,6 +21,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/languages/tw.lang b/languages/tw.lang
index 511630b2..6a5d3a5d 100644
--- a/languages/tw.lang
+++ b/languages/tw.lang
@@ -21,6 +21,7 @@ $PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
+$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
diff --git a/list.php b/list.php
index 2dc4b5b1..48bea500 100644
--- a/list.php
+++ b/list.php
@@ -56,9 +56,46 @@ if ($is_admin) {
$handler->getList('');
$items = $handler->result();
-$smarty->assign('admin_list', $list_admins);
-$smarty->assign('admin_selected', $username);
-#if ($is_superadmin) {
+if (safeget('output') == 'csv') {
+
+ $out = fopen('php://output', 'w');
+ header( 'Content-Type: text/csv; charset=utf-8' );
+ header( 'Content-Disposition: attachment;filename='.$table.'.csv');
+
+ print "\xEF\xBB\xBF"; # utf8 byte-order to indicate the file is utf8 encoded
+ # print "sep=;"; # hint that ; is used as seperator - breaks the utf8 flag in excel import!
+ print "\n";
+
+ if (!defined('ENT_HTML401')) { # for compability for PHP < 5.4.0
+ define('ENT_HTML401', 0);
+ }
+
+ # print column headers as csv
+ $header = array();
+ $columns = array();
+ foreach ($handler->getStruct() as $key => $field) {
+ if ($field['display_in_list'] && $field['label'] != '') { # don't show fields without a label
+ $header[] = html_entity_decode ( $field['label'], ENT_COMPAT | ENT_HTML401, 'UTF-8' );
+ $columns[] = $key;
+ }
+ }
+ fputcsv($out, $header, ';');
+
+ # print items as csv
+ foreach ($items as $item) {
+ $fields = array();
+ foreach ($columns as $column) {
+ $fields[] = $item[$column];
+ }
+ fputcsv($out, $fields, ';');
+ }
+
+ fclose($out);
+
+} else { # HTML output
+
+ $smarty->assign('admin_list', $list_admins);
+ $smarty->assign('admin_selected', $username);
$smarty->assign('smarty_template', 'list');
$smarty->assign('struct', $handler->getStruct());
$smarty->assign('msg', $handler->getMsg());
@@ -66,11 +103,10 @@ $smarty->assign('admin_selected', $username);
$smarty->assign('items', $items);
$smarty->assign('id_field', $handler->getId_field());
$smarty->assign('formconf', $formconf);
-#} else {
-# $smarty->assign ('smarty_template', 'overview-get');
-#}
-$smarty->display ('index.tpl');
+ $smarty->display ('index.tpl');
+
+}
/* vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */
?>
diff --git a/templates/list.tpl b/templates/list.tpl
index 2c4f3529..2ea6243b 100644
--- a/templates/list.tpl
+++ b/templates/list.tpl
@@ -64,5 +64,7 @@
{$PALANG.{$formconf.create_button}}
+
+
{$PALANG.download_csv}