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