@10.U.U @P73UH^3U !zU_3Uh.U1#%2U1Ux~2U٢zUA}2U~2U}2UzU~2Ux~2U x~2U@&zUGZMZzU~2U}2UzU~2U(2Ux~2U)zUc2UP1Uh2U~2UzU (2U2U~2Up+zU0h2UP2U2U(2UzU 2U2Uh2Up+zU2U2Ug2U2UP%zUinja_table_get_data_provider($tableId); $isDataTables = $dataProvider === 'default' && isset($tableSettings['library']) && $tableSettings['library'] === 'datatables'; if ($format == 'csv') { if ($isDataTables) { $data = static::getDataTablesCsvData($tableId); } else { $sortingType = Arr::get($tableSettings, 'sorting_type', 'by_created_at'); $data = ninjaTablesGetTablesDataByID($tableId, $tableColumns, $sortingType, true); } $header = array(); foreach ($tableColumns as $item) { $header[$item['key']] = $item['name']; } $exportData = array(); foreach ($data as $item) { $temp = array(); foreach ($header as $accessor => $name) { $value = Arr::get($item, $accessor); if (is_array($value)) { $value = implode(', ', $value); } $temp[] = ninjaTablesSanitizeForCSV($value); } array_push($exportData, $temp); } static::exportAsCSV($exportData, $fileName, array_values($header)); } elseif ($format == 'json') { $table = get_post($tableId); $rows = array(); if ($isDataTables) { $rows = static::getDataTablesRows($tableId, $tableColumns); } elseif ($dataProvider == 'default') { $rawRows = NinjaTableItem::selectedRows($tableId); foreach ($rawRows as $row) { $row->value = json_decode($row->value, true); $rows[] = $row; } } $matas = get_post_meta($tableId); $allMeta = array(); $excludedMetaKeys = array( '_ninja_table_cache_object', '_ninja_table_cache_html', '_external_cached_data', '_last_external_cached_time', '_last_edited_by', '_last_edited_time', '__ninja_cached_table_html' ); foreach ($matas as $metaKey => $metaValue) { if (!in_array($metaKey, $excludedMetaKeys)) { if (isset($metaValue[0])) { $metaValue = maybe_unserialize($metaValue[0]); $allMeta[$metaKey] = $metaValue; } } } $exportData = array( 'post' => $table, 'columns' => $tableColumns, 'settings' => $tableSettings, 'data_provider' => $dataProvider, 'metas' => $allMeta, 'rows' => array(), 'original_rows' => $rows ); if ($externalSource) { return $exportData; } static::exportAsJSON($exportData, $fileName); } } private static function exportAsCSV($data, $fileName = null, $header = null) { $fileName = ($fileName) ? $fileName . '.csv' : 'export-data-' . gmdate('d-m-Y') . '.csv'; $writer = Writer::createFromFileObject(new \SplTempFileObject()); $writer->setDelimiter(","); $writer->setNewline("\r\n"); $header !== null ? $writer->insertOne($header) : ''; $writer->insertAll($data); $writer->output($fileName); wp_die(); } private static function exportAsJSON($data, $fileName = null) { $fileName = ($fileName) ? $fileName . '.json' : 'export-data-' . gmdate('d-m-Y') . '.json'; header('Content-disposition: attachment; filename=' . $fileName); header('Content-type: application/json'); header('X-Content-Type-Options: nosniff'); echo json_encode($data); wp_die(); } /** * Get flat row data from DataTables dynamic table for CSV export * * @param int $tableId Table ID * * @return array Array of associative arrays keyed by column key */ private static function getDataTablesCsvData($tableId) { $tableManager = new DynamicTableManager($tableId); if (!$tableManager->tableExists()) { return []; } $dynamicRow = new DynamicRow($tableId); $total = $dynamicRow->count(); $rawRows = $dynamicRow->getAll(max($total, 1), 1, DynamicTableManager::COL_POSITION, 'ASC'); $data = []; foreach ($rawRows as $rawRow) { $mapped = $dynamicRow->mapRowToUserKeys($rawRow); $data[] = $mapped['values']; } return $data; } /** * Get rows from DataTables dynamic table for export * * @param int $tableId Table ID * @param array $tableColumns Column definitions * * @return array Formatted rows for export */ private static function getDataTablesRows($tableId, $tableColumns) { $tableManager = new DynamicTableManager($tableId); if (!$tableManager->tableExists()) { return []; } $dynamicRow = new DynamicRow($tableId); $total = $dynamicRow->count(); $rawRows = $dynamicRow->getAll(max($total, 1), 1, DynamicTableManager::COL_POSITION, 'ASC'); $rows = []; foreach ($rawRows as $rawRow) { $mapped = $dynamicRow->mapRowToUserKeys($rawRow); // Format to match existing export structure $rows[] = (object)[ 'id' => $mapped['id'], 'position' => $mapped['position'] ?? 0, 'owner_id' => $mapped['owner_id'] ?? 0, 'value' => $mapped['values'], 'settings' => !empty($mapped['settings']) ? $mapped['settings'] : null, 'created_at' => $mapped['created_at'] ?? '', 'updated_at' => $mapped['updated_at'] ?? '', ]; } return $rows; } }