/**
  * 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;
 }
Exemple #2
0
 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');
     }
 }