$time = elgg_format_element('label', ['for' => 'csv-exporter-time'], elgg_echo('csv_exporter:admin:time')); $time .= elgg_view('input/select', ['name' => 'time', 'value' => $time_value, 'options_values' => $time_options, 'class' => 'mls', 'id' => 'csv-exporter-time']); $time .= elgg_format_element('div', ['class' => 'elgg-subtext'], elgg_echo('csv_exporter:admin:time:description')); $range = elgg_echo('csv_exporter:admin:time:range:created_time_lower'); $range .= elgg_view('input/date', ['name' => 'created_time_lower', 'value' => elgg_get_sticky_value('csv_exporter', 'created_time_lower', get_input('created_time_lower')), 'timestamp' => true, 'datepicker_options' => ['maxDate' => '-1d'], 'class' => 'mhs']); $range .= elgg_echo('csv_exporter:admin:time:range:created_time_upper'); $range .= elgg_view('input/date', ['name' => 'created_time_upper', 'value' => elgg_get_sticky_value('csv_exporter', 'created_time_upper', get_input('created_time_upper')), 'timestamp' => true, 'datepicker_options' => ['maxDate' => '+1d'], 'class' => 'mls']); $time .= elgg_format_element('div', ['id' => 'csv-exporter-range', 'class' => $time_value === 'range' ? '' : 'hidden'], $range); $form_body .= elgg_format_element('div', [], $time); // optional title for export $title = elgg_format_element('label', ['for' => 'csv-exporter-title'], elgg_echo('csv_exporter:admin:title')); $title .= elgg_view('input/text', ['id' => 'csv-exporter-title', 'name' => 'title', 'value' => elgg_get_sticky_value('csv_exporter', 'title', get_input('title'))]); $form_body .= elgg_format_element('div', [], $title); // get exportable values list($type, $subtype) = explode(':', $type_subtype); $exportable_values_options = csv_exporter_get_exportable_values($type, $subtype, true); uksort($exportable_values_options, 'strcasecmp'); $exportable_values = elgg_get_sticky_value('csv_exporter', 'exportable_values', get_input('exportable_values')); $form_body .= '<div>'; $form_body .= elgg_echo('csv_exporter:admin:exportable_values') . '<br />'; $form_body .= elgg_view('input/checkboxes', ['name' => 'exportable_values', 'options' => $exportable_values_options, 'value' => $exportable_values]); $form_body .= '</div>'; $form_body .= '<div class="elgg-foot">'; $form_body .= '<div class="float-alt elgg-discover csv-exporter-align-right">'; $form_body .= elgg_view('input/button', ['value' => elgg_echo('csv_exporter:admin:schedule'), 'class' => 'elgg-button-action', 'id' => 'csv-exporter-schedule']); $form_body .= elgg_format_element('div', ['class' => 'elgg-subtext elgg-discoverable'], elgg_echo('csv_exporter:admin:schedule:description')); $form_body .= '</div>'; $form_body .= elgg_view('input/submit', ['value' => elgg_echo('csv_exporter:admin:preview')]); $form_body .= '</div>'; if (!empty($exportable_values)) { $preview = elgg_view('csv_exporter/preview', ['type' => $type, 'subtype' => $subtype, 'exportable_values' => $exportable_values]);
<?php /** * Show a preview of the exported content * * @uses $vars['type'] the entity type * @uses $vars['subtype'] the entity subtype, * @uses $vars['exportable_values'] the values to export */ $type = elgg_extract('type', $vars); $subtype = elgg_extract('subtype', $vars); $exportable_values = elgg_extract('exportable_values', $vars); $readable_values = csv_exporter_get_exportable_values($type, $subtype, true); $content = '<table class="elgg-table">'; $content .= '<thead>'; $content .= '<tr>'; foreach ($exportable_values as $name) { $content .= '<th>' . array_search($name, $readable_values) . '</th>'; } $content .= '</tr>'; $content .= '</thead>'; $content .= '<tbody>'; $limit = max(0, get_input('limit', 25)); $offset = max(0, get_input('offset', 0)); $options = ['type' => $type, 'subtype' => $subtype, 'limit' => $limit, 'offset' => $offset]; if ($type == 'user') { $options['relationship'] = 'member_of_site'; $options['relationship_guid'] = elgg_get_site_entity()->getGUID(); $options['inverse_relationship'] = true; } $entities = new ElggBatch('elgg_get_entities_from_relationship', $options);
/** * Process the export to generate the downloadable file * * @return void */ public function process() { if ($this->isProcessing()) { return; } // lock this entity in order to prevent duplicate processing $this->lockProcessing(); // get content type/subtype $type = $this->getFormData('type'); $subtype = $this->getFormData('subtype'); // get possible exportable values for this content type/subtype $available_values = csv_exporter_get_exportable_values($type, $subtype, true); // get configured export fields $exportable_values = $this->getFormData('exportable_values'); if (empty($exportable_values)) { $this->unlockProcessing(); return; } // prepare for exporting $fo = $this->getFileObject(); $seperator = csv_exporter_get_separator(); // make csv header row $headers = []; foreach ($exportable_values as $export_value) { $headers[] = array_search($export_value, $available_values); } // create the new file with the headers $fh = $fo->open('write'); fputcsv($fh, $headers, $seperator); // append the rest of the data $fh = $fo->open('append'); // set entity options $entity_options = ['type' => $type, 'subtype' => $subtype, 'limit' => false]; // limit users to members of the site if ($type == 'user') { $entity_options['relationship'] = 'member_of_site'; $entity_options['relationship_guid'] = elgg_get_site_entity()->getGUID(); $entity_options['inverse_relationship'] = true; } // add time constraints $this->addTimeContraints($entity_options); // this could take a while set_time_limit(0); $entities = new ElggBatch('elgg_get_entities_from_relationship', $entity_options); /* @var $entity ElggEntity */ foreach ($entities as $entity) { $values = []; // params for hook $params = ['type' => $type, 'subtype' => $subtype, 'entity' => $entity]; foreach ($exportable_values as $export_value) { $params['exportable_value'] = $export_value; $value = elgg_trigger_plugin_hook('export_value', 'csv_exporter', $params); if ($value === null) { $value = $entity->{$export_value}; } if (is_array($value)) { $value = implode(', ', $value); } $values[] = $value; } // write row fputcsv($fh, $values, $seperator); } // cleanup $this->complete(); $this->unlockProcessing(); $fo->close(); }