UPGRADE NOTE:
Do not edit or add to this file if you wish to upgrade AbanteCart to newer
versions in the future. If you wish to customize AbanteCart for your
needs please refer to http://www.AbanteCart.com for more information.
------------------------------------------------------------------------------*/
if(!defined('DIR_CORE')){
header('Location: static_pages/');
}
class ControllerPagesToolImportExport extends AController{
public $tabs = array('export', 'import');
public $error;
public $success = '';
private $data = array();
private $handler;
public function main(){
//init controller data
$this->extensions->hk_InitData($this, __FUNCTION__);
$this->handler = new AData();
$this->loadLanguage('tool/import_export');
$this->document->setTitle($this->language->get('import_export_title'));
$this->data['title'] = $this->language->get('import_export_title');
$this->data['text_tables'] = $this->language->get('text_tables');
$this->data['text_options'] = $this->language->get('text_options');
$this->data['tabs'] = $this->tabs;
if(isset($this->request->get['active']) && strpos($this->request->get['active'], '-') !== false){
$this->request->get['active'] = substr($this->request->get['active'], 0, strpos($this->request->get['active'], '-'));
}
$this->data['active'] = isset($this->request->get['active']) && in_array($this->request->get['active'], $this->data['tabs']) ?
$this->request->get['active'] : $this->data['tabs'][0];
foreach($this->data['tabs'] as $tab){
$this->data['tab_' . $tab] = $this->language->get('tab_' . $tab);
$this->data['link_' . $tab] = $this->html->getSecureURL('p/tool/import_export', '&active=' . $tab);
}
$this->data['token'] = $this->session->data['token'];
$this->document->initBreadcrumb(array(
'href' => $this->html->getSecureURL('index/home'),
'text' => $this->language->get('text_home'),
'separator' => false
));
$this->document->addBreadcrumb(array(
'href' => $this->html->getSecureURL('tool/import_export'),
'text' => $this->language->get('import_export_title'),
'current' => true
));
$this->getForm();
$this->view->assign('help_url', $this->gen_help_url($this->data['active']));
if(isset($this->session->data['error'])){
$this->data['error_warning'] = $this->session->data['error'];
unset($this->session->data['error']);
} else{
$this->data['error_warning'] = $this->errors;
}
$this->data['success'] = $this->success;
$this->view->batchAssign($this->data);
if($this->data['active'] == 'import'){
$this->processTemplate('pages/tool/import.tpl');
} else{
$this->processTemplate('pages/tool/export.tpl');
}
//update controller data
$this->extensions->hk_UpdateData($this, __FUNCTION__);
}
private function getForm(){
$form = new AForm('ST');
$form->setForm(array(
'form_name' => $this->data['active'] . 'Frm'
));
$this->data['form']['id'] = $this->data['active'] . 'Frm';
$this->data['form']['submit'] = $form->getFieldHtml(array(
'type' => 'button',
'name' => 'submit',
'text' => $this->language->get('tab_' . $this->data['active']),
'style' => 'button1',
));
$this->data['form']['cancel'] = $form->getFieldHtml(array(
'type' => 'button',
'name' => 'cancel',
'text' => $this->language->get('button_cancel'),
'style' => 'button2',
));
switch($this->data['active']){
case 'import':
$this->data['action'] = $this->html->getSecureURL('tool/import_export', '&active=' . $this->data['active']);
$this->data['text_load_file'] = $this->language->get('text_load_file');
$this->data['text_file_field'] = $this->language->get('text_file_field');
$fileForm = new AForm('ST');
$fileForm->setForm(array(
'form_name' => 'file_import_form'
));
$this->data['file_form_open'] = $fileForm->getFieldHtml(array(
'type' => 'form',
'name' => 'file_import_form',
'action' => $this->data['action'],
'attr' => 'class="aform form-horizontal"',
));
$this->data['file_field'] = $fileForm->getFieldHtml(array(
'type' => 'file',
'name' => 'imported_file'
));
$this->data['file_submit'] = $fileForm->getFieldHtml(array(
'type' => 'button',
'name' => 'file_submit',
'text' => $this->language->get('text_load'),
'style' => 'button1',
));
$options['text']['delimiter'] = $this->language->get('text_csv_delimiter') . '
' . $this->language->get('text_export_note_csv_delimiter');
$options['item']['delimiter'] = $fileForm->getFieldHtml(array(
'type' => 'selectbox',
'name' => 'options[delimiter]',
'value' => 0,
'options' => array(',', ';', 'TAB')
));
$options['text']['test_mode'] = $this->language->get('text_test_mode');
$options['item']['test_mode'] = $form->getFieldHtml(array(
'type' => 'checkbox',
'name' => 'test_mode',
'value' => 'test',
'style' => '',
));
$this->data['options'] = $options;
if(!empty($this->request->files)){
if(file_exists($this->request->files['imported_file']['tmp_name'])){
$this->data['results'] = $this->import($this->request->files['imported_file']);
if(!$this->data['results']){
$this->success = $this->language->get('text_import_loaded') . '0';
$this->session->data['error'] = $this->language->get('error_data_corrupted');
} else{
$this->data['text_updated'] = $this->language->get('text_updated');
$this->data['count_updated'] = isset($this->data['results']['update']) ? count($this->data['results']['update']) : 0;
$this->data['text_created'] = $this->language->get('text_created');
$this->data['count_created'] = isset($this->data['results']['insert']) ? count($this->data['results']['insert']) : 0;
$this->data['text_errors'] = $this->language->get('text_errors');
$this->data['count_errors'] = isset($this->data['results']['error']) ? count($this->data['results']['error']) : 0;
$this->data['text_some_errors'] = $this->language->get('text_some_errors');
$this->data['text_loaded'] = $this->language->get('text_import_loaded');
$this->data['count_loaded'] = $this->data['count_updated'] + $this->data['count_created'] + $this->data['count_errors'];
$this->data['text_show_details'] = $this->language->get('text_show_details');
if(isset($this->data['results']['sql'])){
$this->data['text_test_completed'] = $this->language->get('text_test_completed');
$this->data['count_test_sqls'] = count($this->data['results']['sql']);
}
}
} elseif($this->request->files['imported_file']['error'] != 0){
$this->success = $this->language->get('text_import_loaded') . '0';
$this->session->data['error'] = $this->language->get('error_upload_' . $this->request->files['imported_file']['error']);
}
}
break;
case 'export':
$sections = $this->handler->getSections();
$this->data['action'] = $this->html->getSecureURL('p/tool/export_upload');
$this->data['form']['fields'] = $this->_build_table_fields($form, (array)$sections);
$this->data['text_range_from'] = $this->language->get('text_id_range_from');
$this->data['text_to'] = $this->language->get('text_to');
break;
}
$options = array();
$options['text']['file_format'] = $this->language->get('text_file_format');
$options['item']['file_format'] = $form->getFieldHtml(array(
'type' => 'selectbox',
'name' => 'options[file_format]',
'value' => 0,
'options' => array(
'csv' => ' CSV ',
'txt' => 'TXT (delimited)',
'xml' => ' XML '
)
));
$options['text']['file_name'] = $this->language->get('text_file_name');
$options['item']['file_name'] = $form->getFieldHtml(array(
'type' => 'input',
'name' => 'options[file_name]',
'value' => 'export_' . date('dmY_His'),
'style' => 'large-field',
));
$options['text']['delimiter'] = $this->language->get('text_csv_delimiter') . '
' . $this->language->get('text_export_note_csv_delimiter');
$options['item']['delimiter'] = $form->getFieldHtml(array(
'type' => 'selectbox',
'name' => 'options[delimiter]',
'value' => 0,
'options' => array(',', ';', 'TAB')
));
$this->data['form']['options'] = $options;
$this->data['form']['form_open'] = $form->getFieldHtml(array(
'type' => 'form',
'name' => $this->data['active'] . 'Frm',
'action' => $this->data['action'],
'attr' => 'class="aform form-horizontal"',
));
}
private function getImportedData($file){
if(in_array($file['type'], array('text/csv', 'application/vnd.ms-excel'))){
return $this->handler->csvToArray($file);
} elseif(in_array($file['type'], array('text/xml'))){
if($xml = simplexml_load_file($file['tmp_name'])){
return $this->handler->xmlToArray($xml);
}
}
return false;
}
private function import($file, $action = 'update_or_insert'){
$results = array();
$run_mode = isset($this->request->post['test_mode']) ? $this->request->post['test_mode'] : 'commit';
if(in_array($file['type'], array('text/csv', 'application/vnd.ms-excel', 'text/plain', 'application/octet-stream'))){
#NOTE: 'application/octet-stream' is a solution for Windows OS sending unknown file type
#TODO: Need to add test for the file in case of 'application/octet-stream'
$csv_array = $this->handler->CSV2ArrayFromFile($file['tmp_name'], $this->request->post['options']['delimiter']);
$results = $this->handler->importData($csv_array, $run_mode);
$this->cache->delete('*');
} elseif($file['type'] == 'text/xml'){
$xml_array = $this->handler->XML2ArrayFromFile($file['tmp_name']);
$results = $this->handler->importData($xml_array, $run_mode);
$this->cache->delete('*');
} else{
$this->session->data['error'] = $this->language->get('error_file_format');
}
return $results;
}
private function _build_table_fields($form, $data){
$result = array();
foreach($data as $table_name => $val){
$result[$table_name]['main'] = $form->getFieldHtml(array(
'type' => 'checkbox',
'name' => 'section_' . $table_name,
'value' => $table_name,
'style' => 'section_input',
));
$columns_data = $this->handler->getTableColumns($table_name);
$columns = array();
foreach($columns_data as $column){
$columns[$column['Field']] = $column['Field'];
}
$result[$table_name]['filter']['columns'] = $form->getFieldHtml(array(
'type' => 'selectbox',
'name' => 'data[' . $table_name . '][filter][columns]',
'value' => 0,
'options' => $columns
));
$name = 'data[' . $table_name . ']';
if(isset($val['children'])){
$name .= '[tables]';
$children = $this->_get_table_children($form, $val['children'], $name);
$result[$table_name]['children'] = $children;
}
}
$this->data['text_no_children'] = $this->language->get('text_no_children');
ksort($result);
return $result;
}
private function _get_table_children($form, $data, $name){
$children = array();
foreach($data as $key => $val){
$new_name = $name . '[' . $key . ']';
$children[$key]['name'] = $new_name;
$children[$key]['field'] = $form->getFieldHtml(array(
'type' => 'checkbox',
'name' => $new_name,
'value' => $key,
'style' => '',
));
if(isset($val['children'])){
$new_name .= '[tables]';
$children = array_merge($children, $this->_get_table_children($form, $val['children'], $new_name));
}
}
return $children;
}
}