public function dispatchLoopShutdown() { // // Force output to be sent - we need the client to have the page before // we start flushing progress bar updates // $app = AppController::getInstance(); $req = $app->getRequest(); $resp = $app->getResponse(); $resp->sendResponse(); $resp->clearContent(); // // Do export // if (!$req->isLoggedIn()) { return; } set_time_limit(3600 * 24); // if it takes more than 24 hours we're in trouble $vn_id = $req->getParameter('exporter_id', pInteger); $t_exporter = new ca_data_exporters($vn_id); $vs_file = tempnam(__CA_APP_DIR__ . DIRECTORY_SEPARATOR . 'tmp', 'dataExport'); // we have 3 different sources for batch exports: search/browse result, sets and search expressions (deprecated) // they all operate on different parameters and on different static functions in ca_data_exporters if ($req->getParameter('caIsExportFromSearchOrBrowseResult', pInteger)) { // batch export from search or browse result $vs_find_type = $req->getParameter('find_type', pString); $vo_result_context = new ResultContext($req, $t_exporter->getTargetTableName(), $vs_find_type); $t_instance = $t_exporter->getTargetTableInstance(); $o_result = $t_instance->makeSearchResult($t_instance->tableName(), $vo_result_context->getResultList()); ca_data_exporters::exportRecordsFromSearchResult($t_exporter->get('exporter_code'), $o_result, $vs_file, array('request' => $req, 'progressCallback' => 'caIncrementBatchMetadataExportProgress')); } else { if ($vn_set_id = $req->getParameter('set_id', pInteger)) { // batch export from set ca_data_exporters::exportRecordsFromSet($t_exporter->get('exporter_code'), $vn_set_id, $vs_file, array('request' => $req, 'progressCallback' => 'caIncrementBatchMetadataExportProgress')); } else { // batch export from search expression (deprecated) $vs_search = $req->getParameter('search', pString); ca_data_exporters::exportRecordsFromSearchExpression($t_exporter->get('exporter_code'), $vs_search, $vs_file, array('request' => $req, 'progressCallback' => 'caIncrementBatchMetadataExportProgress')); } } // export done, record it in session for later usage in download/destination action if (filesize($vs_file)) { $o_session = $req->getSession(); $o_session->setVar('export_file', $vs_file); $o_session->setVar('export_content_type', $t_exporter->getContentType()); $o_session->setVar('exporter_id', $t_exporter->getPrimaryKey()); caExportAddDownloadLink($req); } }
protected function _genExportWithMapping($po_result, $pn_exporter_id) { // Can user batch export? if (!$this->request->user->canDoAction('can_batch_export_metadata')) { $this->response->setRedirect($this->request->config->get('error_display_url') . '/n/3440?r=' . urlencode($this->request->getFullUrlPath())); return; } // Can user export records of this type? if (!$this->request->user->canDoAction('can_export_' . $this->ops_tablename)) { $this->response->setRedirect($this->request->config->get('error_display_url') . '/n/3430?r=' . urlencode($this->request->getFullUrlPath())); return; } $t_exporter = new ca_data_exporters($pn_exporter_id); if (!($t_exporter->getPrimaryKey() > 0)) { $this->postError(3420, _t("Could not load export mapping"), "BaseFindController->_genExportWithMapping()"); return; } if (substr(get_class($this), 0, 6) == 'Browse') { $vs_export_filename = Configuration::load()->get($this->ops_tablename . '_batch_export_filename'); } else { $vs_export_filename = preg_replace("/[^\\p{L}\\p{N}\\-]/", '_', $this->opo_result_context->getSearchExpression()); $vs_export_filename = preg_replace("/[\\_]+/", '_', $vs_export_filename); } $vs_tmp_file = tempnam(caGetTempDirPath(), 'export'); ca_data_exporters::exportRecordsFromSearchResult($t_exporter->get('exporter_code'), $po_result, $vs_tmp_file); header('Content-Type: ' . $t_exporter->getContentType() . '; charset=UTF-8'); header('Content-Disposition: attachment; filename="' . $vs_export_filename . '.' . $t_exporter->getFileExtension() . '"'); header('Content-Transfer-Encoding: binary'); readfile($vs_tmp_file); @unlink($vs_tmp_file); exit; }