1<?php
2/**
3 * @package tikiwiki
4 */
5// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
6//
7// All Rights Reserved. See copyright.txt for details and a complete list of authors.
8// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
9// $Id$
10
11// still used for export from trackerfilter (only - Tiki 9)
12
13require_once('tiki-setup.php');
14$access->check_feature('feature_trackers');
15if (! isset($_REQUEST['trackerId'])) {
16	$smarty->assign('msg', tra('No tracker indicated'));
17	$smarty->display('error.tpl');
18	die;
19}
20$trklib = TikiLib::lib('trk');
21@ini_set('max_execution_time', 0);
22
23$tracker_info = $trklib->get_tracker($_REQUEST['trackerId']);
24if (empty($tracker_info)) {
25	$smarty->assign('msg', tra('No tracker indicated'));
26	$smarty->display('error.tpl');
27	die;
28}
29if ($t = $trklib->get_tracker_options($_REQUEST['trackerId'])) {
30	$tracker_info = array_merge($tracker_info, $t);
31}
32$tikilib->get_perm_object($_REQUEST['trackerId'], 'tracker', $tracker_info);
33$access->check_permission('tiki_p_export_tracker', tra('Export Tracker'), 'tracker', $_REQUEST['trackerId']);
34
35$smarty->assign_by_ref('trackerId', $_REQUEST['trackerId']);
36$smarty->assign_by_ref('tracker_info', $tracker_info);
37
38$filters = [];
39if (! empty($_REQUEST['listfields'])) {
40	if (is_string($_REQUEST['listfields'])) {
41		$filters['fieldId'] = preg_split('/[,:]/', $_REQUEST['listfields']);
42	} elseif (is_array($_REQUEST['listfields'])) {
43		$filters['fieldId'] = $_REQUEST['listfields'];
44	}
45} elseif (isset($_REQUEST['which']) && $_REQUEST['which'] == 'ls') {
46	$filters['or'] = ['isSearchable' => 'y', 'isTblVisible' => 'y'];
47} elseif (isset($_REQUEST['which']) && $_REQUEST['which'] == 'list') {
48	$filters['isTblVisible'] = 'y';
49}
50if ($tiki_p_admin_trackers != 'y') {
51	$filters['isHidden'] = ['n', 'c'];
52}
53if ($tiki_p_tracker_view_ratings != 'y') {
54	$filters['not'] = ['type' => 's'];
55}
56$filters['not'] = ['type' => 'h'];
57
58$fields = $trklib->list_tracker_fields($_REQUEST['trackerId'], 0, -1, 'position_asc', '', true, $filters);
59$listfields = [];
60foreach ($fields['data'] as $field) {
61	$listfields[$field['fieldId']] = $field;
62}
63// If we have a list of displayed fields, we show only those, so the export matches the online display
64if (isset($_REQUEST["displayedFields"])) {
65	$displayedFields = explode(':',$_REQUEST["displayedFields"]);
66	$listfields = array_intersect_key($listfields, array_flip($displayedFields));
67}
68
69if (! isset($_REQUEST['which'])) {
70	$_REQUEST['which'] = 'all';
71}
72if (! isset($_REQUEST['status'])) {
73	$_REQUEST['status'] = '';
74}
75if (! isset($_REQUEST['initial'])) {
76	$_REQUEST['initial'] = '';
77}
78$filterFields = [];
79$values = [];
80$exactValues = [];
81foreach ($_REQUEST as $key => $val) {
82	if (substr($key, 0, 2) == 'f_' && ! empty($val) && (! is_array($val) || ! empty($val[0]))) {
83		$fieldId = substr($key, 2);
84		$filterFields[] = $fieldId;
85		if (isset($_REQUEST["x_$fieldId"]) && ($_REQUEST["x_$fieldId"] == 't' || $_REQUEST["x_$fieldId"] == 'm')) {
86			$exactValues[] = '';
87			if (is_array($val)) {
88				$values[] = $val;
89			} else {
90				$values[] = urldecode($val);
91			}
92		} else {
93			$exactValues[] = urldecode($val);
94			$values[] = '';
95		}
96	}
97}
98$smarty->assign_by_ref('listfields', $listfields);
99
100if (isset($_REQUEST['showStatus'])) {
101	$showStatus = $_REQUEST['showStatus'] == 'on' ? 'y' : 'n';
102} else {
103	$showStatus = 'n';
104}
105$smarty->assign_by_ref('showStatus', $showStatus);
106
107if (isset($_REQUEST['showItemId'])) {
108	$showItemId = $_REQUEST['showItemId'] == 'on' ? 'y' : 'n';
109} else {
110	$showItemId = 'n';
111}
112$smarty->assign_by_ref('showItemId', $showItemId);
113
114if (isset($_REQUEST['showCreated'])) {
115	$showCreated = $_REQUEST['showCreated'] == 'on' ? 'y' : 'n';
116} else {
117	$showCreated = 'n';
118}
119$smarty->assign_by_ref('showCreated', $showCreated);
120
121if (isset($_REQUEST['showLastModif'])) {
122	$showLastModif = $_REQUEST['showLastModif'] == 'on' ? 'y' : 'n';
123} else {
124	$showLastModif = 'n';
125}
126$smarty->assign_by_ref('showLastModif', $showLastModif);
127
128if (isset($_REQUEST['parse'])) {
129	$parse = $_REQUEST['parse'] == 'on' ? 'y' : 'n';
130} else {
131	$parse = 'n';
132}
133$smarty->assign_by_ref('parse', $parse);
134
135if (empty($_REQUEST['encoding'])) {
136	$_REQUEST['encoding'] = 'ISO-8859-1';
137}
138if (empty($_REQUEST['separator'])) {
139	$_REQUEST['separator'] = ',';
140}
141$smarty->assign_by_ref('separator', $_REQUEST['separator']);
142if (empty($_REQUEST['delimitorL'])) {
143	$_REQUEST['delimitorL'] = '"';
144}
145$smarty->assign_by_ref('delimitorL', $_REQUEST['delimitorL']);
146if (empty($_REQUEST['delimitorR'])) {
147	$_REQUEST['delimitorR'] = '"';
148}
149$smarty->assign_by_ref('delimitorR', $_REQUEST['delimitorR']);
150if (empty($_REQUEST['CR'])) {
151	$_REQUEST['CR'] = '%%%';
152}
153$smarty->assign_by_ref('CR', $_REQUEST['CR']);
154
155$fp = null;
156
157if (! empty($_REQUEST['debug'])) {
158	$fp = fopen($prefs['tmpDir'] . '/' . tra('tracker') . "_" . $_REQUEST['trackerId'] . ".csv", 'w');
159	echo 'ouput:' . $prefs['tmpDir'] . '/' . tra('tracker') . "_" . $_REQUEST['trackerId'] . ".csv";
160} else {
161	// Compression of the stream may corrupt files on windows
162	if ($prefs['feature_obzip'] != 'y') {
163		ob_end_clean();
164	}
165	ini_set('zlib.output_compression', 'Off');
166
167	$extension = empty($_REQUEST['zip']) ? '.csv' : '.zip';
168	if (! empty($_REQUEST['file'])) {
169		if (preg_match('/' . $extension . '$/', $_REQUEST['file'])) {
170			$file = $_REQUEST['file'];
171		} else {
172			$file = $_REQUEST['file'] . $extension;
173		}
174	} else {
175		$file = tra('tracker') . '_' . $_REQUEST['trackerId'] . $extension;
176	}
177	if (! empty($_REQUEST['zip'])) {
178		$tmpCsv = tempnam($prefs['tmpDir'], 'tracker_' . $_REQUEST['trackerId']) . '.csv';
179		/*debug*/$tmpCsv = $prefs['tmpDir'] . '/' . 'tracker_' . $_REQUEST['trackerId'] . '.csv';
180		if (! ($fp = fopen($tmpCsv, 'w'))) {
181			$smarty->assign('msg', tra('The file cannot be opened') . ' ' . $tmpCsv);
182			$smarty->display('error.tpl');
183			die;
184		}
185		if (! ($archive = new ZipArchive())) {
186			$smarty->assign('msg', tra('Problem zip initialisation'));
187			$smarty->display('error.tpl');
188			die;
189		}
190		$tmpZip = $prefs['tmpDir'] . '/' . $file;
191		if (! ($archive->open($tmpZip, ZIPARCHIVE::OVERWRITE))) {
192			$smarty->assign('msg', tra('The file cannot be opened') . ' ' . $prefs['tmpDir'] . '/' . $file);
193			$smarty->display('error.tpl');
194			die;
195		}
196
197		header('Content-Type: application/zip');
198		header('Content-Transfer-Encoding: binary');
199	} else {
200		header("Content-type: text/comma-separated-values; charset:" . $_REQUEST['encoding']);
201	}
202	header("Content-Disposition: attachment; filename=$file");
203	header("Expires: 0");
204	header("Cache-Control: must-revalidate, post-check=0,pre-check=0");
205	header("Pragma: public");
206}
207
208$offset = 0;
209$maxRecords = 100;
210if ($tracker_info['defaultOrderKey'] == -1) {
211	$sort_mode = 'lastModif';
212} elseif ($tracker_info['defaultOrderKey'] == -2) {
213	$sort_mode = 'created';
214} elseif ($tracker_info['defaultOrderKey'] == -3) {
215	$sort_mode = 'itemId';
216} elseif (isset($tracker_info['defaultOrderKey'])) {
217	$sort_mode = 'f_' . $tracker_info['defaultOrderKey'];
218} else {
219	$sort_mode = 'itemId';
220}
221if (isset($tracker_info['defaultOrderDir'])) {
222	$sort_mode .= "_" . $tracker_info['defaultOrderDir'];
223} else {
224		$sort_mode .= "_asc";
225}
226$heading = 'y';
227$smarty->assign_by_ref('heading', $heading);
228if (empty($_REQUEST['itemId'])) {
229	while (($items = $trklib->list_items($_REQUEST['trackerId'], $offset, $maxRecords, $sort_mode, $listfields, $filterFields, $values, $_REQUEST['status'], $_REQUEST['initial'], $exactValues)) && ! empty($items['data'])) {
230		// still need to filter the fields that are view only by the admin and the item creator
231		if ($tracker_info['useRatings'] == 'y') {
232			foreach ($items['data'] as $f => $v) {
233				$items['data'][$f]['my_rate'] = $tikilib->get_user_vote("tracker." . $_REQUEST['trackerId'] . '.' . $items['data'][$f]['itemId'], $user);
234			}
235		}
236		$smarty->assign_by_ref('items', $items["data"]);
237
238		$data = $smarty->fetch('tiki-export_tracker_item.tpl');
239		$data = preg_replace("/^\n/", "", $data);
240		if (empty($_REQUEST['encoding']) || $_REQUEST['encoding'] == 'ISO-8859-1') {
241			$data = utf8_decode($data);
242		}
243
244		$offset += $maxRecords;
245		$heading = 'n';
246		if (! empty($fp)) {
247			fwrite($fp, $data);
248		} else {
249			echo $data;
250		}
251		if ($tracker_info['useAttachments'] == 'y' && ! empty($_REQUEST['zip'])) {
252			foreach ($items['data'] as $v) {
253				if (! $trklib->export_attachment($v['itemId'], $archive)) {
254					$smarty->assign('msg', tra('Problem zip'));
255					$smarty->display('error.tpl');
256					die;
257				}
258			}
259		}
260	}
261} else {
262	$items = [];
263	$items[] = $trklib->get_tracker_item($_REQUEST['itemId']);
264	$items[0]['field_values'] = $trklib->get_item_fields($_REQUEST['trackerId'], $_REQUEST['itemId'], $listfields);
265	$smarty->assign_by_ref('items', $items);
266
267	$data = $smarty->fetch('tiki-export_tracker_item.tpl');
268	$data = preg_replace("/^\n/", "", $data);
269	if (empty($_REQUEST['encoding']) || $_REQUEST['encoding'] == 'ISO-8859-1') {
270		$data = utf8_decode($data);
271	}
272	if (! empty($fp)) {
273		fwrite($fp, $data);
274	} else {
275		echo $data;
276	}
277}
278if (! empty($fp)) {
279	fclose($fp);
280}
281if (! empty($_REQUEST['zip'])) {
282	$archive->addFile($tmpCsv, str_replace('.zip', '.csv', $file));
283	$archive->close();
284	readfile($tmpZip);
285	unlink($tmpZip);
286	unlink($tmpCsv);
287}
288die;
289