/** * Export set of records from a given SearchResult object to an array of strings with the individual exports, keyed by primary key. * The behavior is tailored towards the needs of the OAIPMHService. * * @param string $ps_exporter_code defines the exporter to use * @param SearchResult $po_result search result as object * @param array $pa_options * 'start' = * 'limit' = * @return array exported data */ public static function exportRecordsFromSearchResultToArray($ps_exporter_code, $po_result, $pa_options = null) { $vn_start = isset($pa_options['start']) ? (int) $pa_options['start'] : 0; $vn_limit = isset($pa_options['limit']) ? (int) $pa_options['limit'] : 0; ca_data_exporters::$s_exporter_cache = array(); ca_data_exporters::$s_exporter_item_cache = array(); require_once __CA_LIB_DIR__ . '/core/Search/SearchResult.php'; if (!$po_result instanceof SearchResult) { return false; } if (!($t_mapping = ca_data_exporters::loadExporterByCode($ps_exporter_code))) { return false; } if (sizeof(ca_data_exporters::checkMapping($ps_exporter_code)) > 0) { return false; } $t_instance = $t_mapping->getAppDatamodel()->getInstanceByTableNum($t_mapping->get('table_num')); if ($vn_start > 0 && $vn_start < $po_result->numHits()) { $po_result->seek($vn_start); } $va_return = array(); $vn_i = 0; while ($po_result->nextHit()) { if ($vn_limit && $vn_i >= $vn_limit) { break; } $vn_pk_val = $po_result->get($t_instance->primaryKey()); $va_return[$vn_pk_val] = ca_data_exporters::exportRecord($ps_exporter_code, $vn_pk_val); $vn_i++; } return $va_return; }
public static function export_data($po_opts = null) { require_once __CA_MODELS_DIR__ . "/ca_data_exporters.php"; $vs_search = $po_opts->getOption('search'); $vs_id = $po_opts->getOption('id'); $vb_rdf = (bool) $po_opts->getOption('rdf'); if (!$vb_rdf && !$vs_search && !$vs_id) { print _t('You must specify either an idno or a search expression to select a record or record set for export or activate RDF mode.') . "\n"; return false; } if (!($vs_filename = $po_opts->getOption('file'))) { print _t('You must specify a file to write export output to.') . "\n"; return false; } if (@file_put_contents($vs_filename, "") === false) { // probably a permission error print _t("Can't write to file %1. Check the permissions.", $vs_filename) . "\n"; return false; } // RDF mode if ($vb_rdf) { if (!($vs_config = $po_opts->getOption('config'))) { print _t('You must specify a configuration file that contains the export definition for the RDF mode.') . "\n"; return false; } // test config syntax if (!Configuration::load($vs_config)) { print _t('Syntax error in configuration file %s.', $vs_config) . "\n"; return false; } if (ca_data_exporters::exportRDFMode($vs_config, $vs_filename, array('showCLIProgressBar' => true))) { print _t("Exported data to %1", CLIUtils::textWithColor($vs_filename, 'yellow')); return true; } else { print _t("Could not run RDF mode export") . "\n"; return false; } } // Search or ID mode if (!($vs_mapping = $po_opts->getOption('mapping'))) { print _t('You must specify a mapping for export.') . "\n"; return false; } if (!ca_data_exporters::loadExporterByCode($vs_mapping)) { print _t('Mapping %1 does not exist', $vs_mapping) . "\n"; return false; } if (sizeof($va_errors = ca_data_exporters::checkMapping($vs_mapping)) > 0) { print _t("Mapping %1 has errors: %2", $vs_mapping, join("; ", $va_errors)) . "\n"; return false; } if ($vs_search) { if (!ca_data_exporters::exportRecordsFromSearchExpression($vs_mapping, $vs_search, $vs_filename, array('showCLIProgressBar' => true, 'useNcurses' => true))) { print _t("Could not export mapping %1", $vs_mapping) . "\n"; return false; } else { print _t("Exported data to %1", $vs_filename) . "\n"; } } else { if ($vs_id) { if ($vs_export = ca_data_exporters::exportRecord($vs_mapping, $vs_id, $pa_options = array('singleRecord' => true))) { file_put_contents($vs_filename, $vs_export); print _t("Exported data to %1", CLIUtils::textWithColor($vs_filename, 'yellow')); } else { print _t("Could not export mapping %1", $vs_mapping) . "\n"; return false; } } } }
/** * Export single record (usually via inspector) */ public function ExportSingleData() { $t_exporter = $this->getExporterInstance(); if (!$t_exporter->getPrimaryKey()) { $this->getResponse()->setRedirect($this->getRequest()->config->get('error_display_url') . '/n/3420?r=' . urlencode($this->getRequest()->getFullUrlPath())); return; } $t_subject = $t_exporter->getAppDatamodel()->getInstanceByTableNum($t_exporter->get('table_num'), true); // Can user export records of this type? if (!$this->getRequest()->user->canDoAction('can_export_' . $t_subject->tableName())) { $this->getResponse()->setRedirect($this->getRequest()->config->get('error_display_url') . '/n/3430?r=' . urlencode($this->getRequest()->getFullUrlPath())); return; } $va_errors = ca_data_exporters::checkMapping($t_exporter->get('exporter_code')); if (is_array($va_errors) && sizeof($va_errors) > 0) { $this->getView()->setVar("errors", $va_errors); $this->render('export/export_errors_html.php'); } else { set_time_limit(3600); $o_config = $t_subject->getAppConfig(); $vn_id = $this->getRequest()->getParameter('item_id', pInteger); $this->getView()->setVar("t_subject", $t_subject); // alternate destinations $va_alt_dest = $o_config->getAssoc('exporter_alternate_destinations'); $this->getView()->setVar('exporter_alternate_destinations', $va_alt_dest); // filename set via request wins $vs_filename = $this->getRequest()->getParameter('file_name', pString); // else run template from config if (!$vs_filename && ($vs_export_filename_template = $o_config->get($t_subject->tableName() . "_single_item_export_filename"))) { if ($vs_filename = caProcessTemplateForIDs($vs_export_filename_template, $t_subject->tableNum(), array($vn_id))) { // processed template comes without file extension $vs_filename = $vs_filename . '.' . $t_exporter->getFileExtension(); } } // still no filename? use hardcoded default if (!$vs_filename) { $vs_filename = $vn_id . '.' . $t_exporter->getFileExtension(); } // pass to view as default value for form field $this->getView()->setVar('file_name', $vs_filename); // Can user read this particular item? if (!caCanRead($this->getRequest()->getUserID(), $t_exporter->get('table_num'), $vn_id)) { $this->getResponse()->setRedirect($this->getRequest()->config->get('error_display_url') . '/n/2320?r=' . urlencode($this->getRequest()->getFullUrlPath())); return; } $this->getView()->setVar('item_id', $vn_id); // do item export and dump into tmp file $vs_export = ca_data_exporters::exportRecord($t_exporter->get('exporter_code'), $vn_id, array('singleRecord' => true)); $this->getView()->setVar("export", $vs_export); $vs_tmp_file = tempnam(__CA_APP_DIR__ . DIRECTORY_SEPARATOR . 'tmp', 'dataExport'); file_put_contents($vs_tmp_file, $vs_export); // Store file name and exporter data in session for later retrieval. We don't want to have to pass that on through a bunch of requests. $o_session = $this->getRequest()->getSession(); $o_session->setVar('export_file', $vs_tmp_file); $o_session->setVar('export_content_type', $t_exporter->getContentType()); $o_session->setVar('exporter_id', $t_exporter->getPrimaryKey()); $this->render('export/export_destination_html.php'); } }