function fn_export_fill_fields(&$result, $data, $processes, $pattern, $options) { $multi_lang = array_keys($data); $main_lang = reset($multi_lang); // Filter $export_fields_all = array_merge($pattern['export_fields']['main'], $pattern['export_fields']['multilang']); $result[$main_lang] = fn_array_key_intersect($data[$main_lang], $export_fields_all); foreach (array_diff($multi_lang, array($main_lang)) as $lang_code) { $result[$lang_code] = fn_array_key_intersect($data[$lang_code], $pattern['export_fields']['multilang']); } foreach ($processes['main'] as $field => $process_data) { $vars = array('key' => array($data[$main_lang][reset($pattern['key'])]), 'field' => $field, 'lang_code' => $main_lang); $args = fn_exim_get_values($process_data['args'], $pattern, $options, $vars, $data[$main_lang], ''); if (!empty($process_data['function'])) { $result[$main_lang][$field] = call_user_func_array($process_data['function'], $args); } else { $result[$main_lang][$field] = array_shift($args); } } foreach ($processes['multilang'] as $field => $process_data) { foreach ($multi_lang as $lang_code) { $vars = array('key' => array($data[$lang_code][reset($pattern['key'])]), 'field' => $field, 'lang_code' => $lang_code); $args = fn_exim_get_values($process_data['args'], $pattern, $options, $vars, $data[$lang_code], ''); //$args[$index_lang] = $lang_code; if (!empty($process_data['function'])) { $result[$lang_code][$field] = call_user_func_array($process_data['function'], $args); } else { $result[$lang_code][$field] = array_shift($args); } } } }
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; }