Example #1
0
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);
            }
        }
    }
}
Example #2
0
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;
}