function fn_export($pattern, $export_fields, $options) { if (empty($pattern) || empty($export_fields)) { return false; } // Languages if (!empty($options['lang_code'])) { $multi_lang = $options['lang_code']; $count_langs = count($multi_lang); } else { $multi_lang = array(DEFAULT_LANGUAGE); $count_langs = 1; $options['lang_code'] = $multi_lang; } $can_continue = true; if (!empty($pattern['export_pre_moderation'])) { $data_export_pre_moderation = array('pattern' => &$pattern, 'export_fields' => &$export_fields, 'options' => &$options, 'can_continue' => &$can_continue); fn_exim_processing('export', $pattern['export_pre_moderation'], $options, $data_export_pre_moderation); } if (!$can_continue) { return false; } if (!empty($pattern['pre_processing'])) { fn_exim_processing('export', $pattern['pre_processing'], $options); } if (isset($options['fields_names'])) { if ($options['fields_names']) { $fields_names = $export_fields; $export_fields = array_keys($export_fields); } } $primary_key = array(); $_primary_key = $pattern['key']; foreach ($_primary_key as $key) { $primary_key[$key] = $key; } array_walk($primary_key, 'fn_attach_value_helper', $pattern['table'] . '.'); $table_fields = $primary_key; $processes = array(); // Build list of fields that should be retrieved from the database fn_export_build_retrieved_fields($processes, $table_fields, $pattern, $export_fields); if (empty($pattern['export_fields']['multilang'])) { $multi_lang = array(DEFAULT_LANGUAGE); $count_langs = 1; $options['lang_code'] = $multi_lang; } // Build the list of joins $joins = fn_export_build_joins($pattern, $options, $primary_key, $multi_lang); // Add retrieve conditions $conditions = fn_export_build_conditions($pattern, $options); if (!empty($pattern['pre_export_process'])) { $pre_export_process_data = array('pattern' => &$pattern, 'export_fields' => &$export_fields, 'options' => &$options, 'conditions' => &$conditions, 'joins' => &$joins, 'table_fields' => &$table_fields, 'processes' => &$processes); fn_exim_processing('export', $pattern['pre_export_process'], $options, $pre_export_process_data); } $total = db_get_field("SELECT COUNT(*) FROM ?:" . $pattern['table'] . " as " . $pattern['table'] . ' ' . implode(' ', $joins) . (!empty($conditions) ? ' WHERE ' . implode(' AND ', $conditions) : '')); fn_set_progress('parts', $total); fn_set_progress('step_scale', 1); $sorting = ''; if (!empty($pattern['order_by'])) { $sorting = ' ORDER BY ' . $pattern['order_by']; } // Build main query $query = "SELECT " . implode(', ', $table_fields) . " FROM ?:" . $pattern['table'] . " as " . $pattern['table'] . ' ' . implode(' ', $joins) . (!empty($conditions) ? ' WHERE ' . implode(' AND ', $conditions) : '') . $sorting; $step = fn_floor_to_step(DB_LIMIT_SELECT_ROW, $count_langs); // define number of rows to get from database $iterator = 0; // start retrieving from $progress = 0; $data_exported = false; $main_lang = reset($multi_lang); $manual_multilang = true; $field_lang = ''; foreach ($pattern['export_fields']['multilang'] as $key => $value) { if (array_search('languages', $value, true)) { if (!isset($value['linked']) || $value['linked'] === true) { $manual_multilang = false; } $field_lang = $key; break; } } if (empty($field_lang) || !in_array($field_lang, $export_fields)) { $multi_lang = array($main_lang); $count_langs = 1; } while ($data = db_get_array($query . " LIMIT {$iterator}, {$step}")) { $data_exported = true; if ($manual_multilang) { $data_lang = $data; $data = array(); foreach ($data_lang as $data_key => $data_value) { $data[] = array_combine($multi_lang, array_fill(0, $count_langs, $data_value)); } } else { $data_lang = array_chunk($data, $count_langs); $data = array(); foreach ($data_lang as $data_key => $data_value) { // Sort foreach ($multi_lang as $lang_code) { foreach ($data_value as $v) { if (array_search($lang_code, $v, true)) { $data[$data_key][$lang_code] = $v; } } } } } $result = array(); foreach ($data as $k => $v) { $progress += $count_langs; fn_set_progress('echo', __('exporting_data') . ': <b>' . $progress . '</b>'); fn_export_fill_fields($result[$k], $v, $processes, $pattern, $options); } $_result = array(); foreach ($result as $k => $v) { foreach ($multi_lang as $lang_code) { $_data = array(); foreach ($export_fields as $field) { if (isset($fields_names[$field])) { $_data[$fields_names[$field]] = $v[$lang_code][$field]; } else { $_data[$field] = isset($v[$lang_code][$field]) ? $v[$lang_code][$field] : ''; } } $_result[] = $_data; } } // Put data $enclosure = isset($pattern['enclosure']) ? $pattern['enclosure'] : '"'; fn_echo(' .'); if (isset($pattern['func_save_content_to_file']) && is_callable($pattern['func_save_content_to_file'])) { call_user_func($pattern['func_save_content_to_file'], $_result, $options, $enclosure); } else { fn_put_csv($_result, $options, $enclosure); } $iterator += $step; } if (!empty($pattern['post_processing'])) { fn_set_progress('echo', __('processing'), false); if ($data_exported && file_exists(fn_get_files_dir_path() . $options['filename'])) { $data_exported = fn_exim_processing('export', $pattern['post_processing'], $options); } } return $data_exported; }
function fn_export($pattern, $export_fields, $options) { if (!empty($pattern['pre_processing'])) { $func = $pattern['pre_processing']; $function = array_shift($func); $args = $func; foreach ($args as $k => $v) { if (strpos($v, '@') !== false) { $_opt = str_replace('@', '', $v); $args[$k] = isset($options[$_opt]) ? $options[$_opt] : ''; } } call_user_func_array($function, $args); } if (isset($options['fields_names'])) { if ($options['fields_names']) { $fields_names = $export_fields; $export_fields = array_keys($export_fields); } } $primary_key = $pattern['key']; array_walk($primary_key, 'fn_attach_value_helper', $pattern['table'] . '.'); $table_fields = $primary_key; $joins = array(); $processes = array(); $conditions = array(); // Build list of fields that should be retrieved from the database foreach ($pattern['export_fields'] as $field => $data) { if (!in_array($field, $export_fields)) { continue; } // Do no link this field if (isset($data['linked']) && $data['linked'] == false) { // do something? } elseif (empty($data['table']) || $data['table'] == $pattern['table']) { $table_fields[] = $pattern['table'] . '.' . (!empty($data['db_field']) ? $data['db_field'] . ' as "' . $field . '"' : $field); // Linked object tables } else { $table_fields[] = $data['table'] . '.' . (!empty($data['db_field']) ? $data['db_field'] . ' as "' . $field . '"' : $field); } if (!empty($data['process_get'])) { $processes[$field]['function'] = array_shift($data['process_get']); $processes[$field]['args'] = $data['process_get']; } } // Build the list of joins if (!empty($pattern['references'])) { foreach ($pattern['references'] as $table => $data) { $ref = array(); foreach ($data['reference_fields'] as $k => $v) { if (strval($v) == 'key' || strval($v) == '#key') { $_val = sizeof($primary_key) == 1 ? reset($primary_key) : ''; } elseif ($v[0] == '&') { $_val = $pattern['table'] . '.' . substr($v, 1); } elseif (strpos($v, '@') !== false) { $_opt = str_replace('@', '', $v); $_val = "'" . $options[$_opt] . "'"; } else { $_val = "'{$v}'"; } $ref[] = "{$table}.{$k} = {$_val}"; // fixme } $joins[] = $data['join_type'] . ' JOIN ?:' . $table . " as {$table} ON " . implode(' AND ', $ref); } } // Add retrieve conditions if (!empty($pattern['condition'])) { $_cond = array(); foreach ($pattern['condition'] as $field => $value) { if (is_array($value)) { $_val = implode("','", $value); } elseif (strpos($value, '@') !== false) { $_opt = str_replace('@', '', $value); $_val = $options[$_opt]; } else { $_val = $value; } $_cond[] = $pattern['table'] . ".{$field} IN ('{$_val}')"; } $conditions[] = implode(' AND ', $_cond); } // Limit scope to the current vendor's products only (if in vendor mode) $company_condition = fn_get_company_condition('products.company_id', false); if (!empty($company_condition)) { $conditions[] = $company_condition; } // Build main query $query = "SELECT " . implode(', ', $table_fields) . " FROM ?:" . $pattern['table'] . " as " . $pattern['table'] . ' ' . implode(' ', $joins) . (!empty($conditions) ? ' WHERE ' . implode(' AND ', $conditions) : ''); $step = 30; // define number of rows to get from database $iterator = 0; // start retrieving from $data_exported = false; fn_start_scroller(); fn_echo(fn_get_lang_var('exporting_data') . '<br />'); while ($data = db_get_array($query . " LIMIT {$iterator}, {$step}")) { $data_exported = true; $iterator += $step; $result = array(); foreach ($data as $k => $v) { $result[$k] = fn_array_key_intersect($v, $pattern['export_fields']); foreach ($processes as $field => $process_data) { $args = array(); foreach ($process_data['args'] as $ak => $av) { if ($av == '#this') { $args[$ak] = $v[$field]; } elseif ($av == '#key') { $args[$ak] = sizeof($pattern['key']) == 1 ? $v[reset($pattern['key'])] : ''; } elseif (strpos($av, '@') !== false) { $_opt = str_replace('@', '', $av); $args[$ak] = $options[$_opt]; } elseif ($av == '#field') { $args[$ak] = $field; } else { $args[$ak] = $av; } } $result[$k][$field] = call_user_func_array($process_data['function'], $args); } } // Sort result array $_result = array(); foreach ($result as $k => $v) { foreach ($export_fields as $field) { if (isset($fields_names[$field])) { $_result[$k][$fields_names[$field]] = $v[$field]; } else { $_result[$k][$field] = $v[$field]; } } } unset($result); // Put data $enclosure = isset($pattern['enclosure']) ? $pattern['enclosure'] : '"'; fn_echo(' .'); fn_put_csv($_result, $options, $enclosure); unset($_result); } fn_stop_scroller(); if (!empty($pattern['post_processing'])) { $func = $pattern['post_processing']; if (file_exists(DIR_EXIM . $options['filename'])) { $function = array_shift($func); $args = $func; foreach ($args as $k => $v) { if (strpos($v, '@') !== false) { $_opt = str_replace('@', '', $v); $args[$k] = $options[$_opt]; } } $data_exported = call_user_func_array($function, $args); } } echo '<br/>'; echo '<a href="/var/exim/' . $options['filename'] . '">' . $options['filename'] . '</a>'; return $data_exported; }