예제 #1
0
파일: exim.php 프로젝트: arpad9/bygmarket
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') . ':&nbsp;<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;
}
예제 #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;
}