Для очередного проекта появилась нестандартная просьба — сделать экспорт покупателей в админке opencart в формат csv. Конечно можно было купить соответствующий модуль, но это решение не для программистов) Я предлагаю свое простенькое решение, которое реализуется путем добавления небольшого кода в 2-х файлах.Итак первый файл, который нужно отредактировать это customer_list.tpl находится в папке admin\view\template\sale
Было
<div class="buttons"><a onclick="$('form').attr('action', '<?php echo $approve; ?>'); $('form').submit();" class="button"><?php echo $button_approve; ?></a><a onclick="location = '<?php echo $insert; ?>'" class="button"><?php echo $button_insert; ?></a><a onclick="$('form').attr('action', '<?php echo $delete; ?>'); $('form').submit();" class="button"><?php echo $button_delete; ?></a></div>
Стало
<div class="buttons"><a class="button" href="/admin/index.php?route=sale/customer/export&token=<?php echo $this->session->data['token'] ?>">Экспорт покупателей</a><a onclick="$('form').attr('action', '<?php echo $approve; ?>'); $('form').submit();" class="button"><?php echo $button_approve; ?></a><a onclick="location = '<?php echo $insert; ?>'" class="button"><?php echo $button_insert; ?></a><a onclick="$('form').attr('action', '<?php echo $delete; ?>'); $('form').submit();" class="button"><?php echo $button_delete; ?></a></div>
Далее добавляем в файл admin\controller\sale\customer.php фуекцию экспорта, я разместил в конце файла перед последним закрытием }
public function export(){ $this->load->model('sale/customer'); $results = $this->model_sale_customer->getCustomers($data); foreach ($results as $result) { $this->data['customers'][] = array( 'customer_id' => $result['customer_id'], 'name' => $result['name'], 'email' => $result['email'], 'customer_group' => $result['customer_group'], 'status' => ($result['status'] ? $this->language->get('text_enabled') : $this->language->get('text_disabled')), 'approved' => ($result['approved'] ? $this->language->get('text_yes') : $this->language->get('text_no')), 'ip' => $result['ip'], 'date_added' => date($this->language->get('date_format_short'), strtotime($result['date_added'])), ); } $output = ''; $customer_export = 'customer_export_' . (string)(date('Y-m-d-Hi')) . '.csv'; $tmp = DIR_SYSTEM . 'logs/'; $uid = uniqid(); $tmp_dir = $tmp . '/' . $uid . '/'; $file = $tmp . '/' . $uid.'.csv'; if (($handle = fopen($file, 'w')) !== FALSE) { $ods_title = array( '_customer_id_', '_name_', '_email_', '_customer_group_', '_status_', '_approved_', '_ip_', '_date_added_' ); fputcsv($handle, $ods_title, ';', '"'); foreach ($this->data['customers'] as $fields) { fputcsv($handle, $fields, ';', '"'); } fclose($handle); } else { return ''; } if (($output = file_get_contents($file)) !== FALSE ) { unlink($file); } $this->response->addheader('Pragma: public'); $this->response->addheader('Connection: Keep-Alive'); $this->response->addheader('Expires: 0'); $this->response->addheader('Content-Description: File Transfer'); $this->response->addheader('Content-Type: application/octet-stream'); $this->response->addheader('Content-Disposition: attachment; filename='.$customer_export); $this->response->addheader('Content-Transfer-Encoding: binary'); $this->response->addheader('Content-Length: '. strlen($output)); $this->response->setOutput($output); exit($this->response->output()); }
Поля естественно можно поменять, что-то отключить, что-то добавить, но основной смысл думаю понятен) Теперь при клике на кнопку Экспорт покупателей мы получим список всех покупателей нашего магазина в csv
Этот же способ актуален и для Aceshop, собстевнно для него он и писался 😉
1.Файл не создается. Выгружается в окне браузера.
2. Выкидывает при нажатии на кнопку «экспорт».
Причин может быть куча. Включите отображение ошибок и смотрите в чем проблема.
С ссылкой еще можно поступить таким образом что бы не выкидывало:
<a class="button" href="/admin/index.php?route=sale/customer/export&token=session->data[‘token’]; ?>»>Экспорт покупателей
Ссылка неправильная
$results = $this->model_sale_customer->getCustomers($data);
а откуда у нас бурется переменная $data ?
Ниоткуда) Её можно не писать, эта переменная используется только когда нужно сделать выборку по определённым параметрам. В данном случае она не нужна и ее нет.
$results = $this->model_sale_customer->getCustomers($data);
$data ….я убрал из-за неё ошибка вылетает
Так же href=»/admin/index.php?route=sale/customer/export» не катит….так при клике на кнопку нас выкидывает с админки и просит заново авторизоваться….нужно еще токен передавать
в фалй admin\controller\sale\customer.php в функцию getList()
добавлена строка
$this->data[‘export’] = $this->url->link(‘sale/customer/export’, ‘token=’ . $this->session->data[‘token’] . $url, ‘SSL’);
ну и в теме теперь используется
href=»» вместо старой ссылки.
еще была проблема с кодировкой русских символов в csv файле
Есть возможность предоставить код с учетом указанных правок в комментариях?
Сам я туповат не совсем догоняю как исправить проблему с кодировкой ((((
что и куда прописывать чтобы не выкидывало из админки? И с кодировкой помогите, спс.
Иначе в чем смысл статьи если в ней половина решения?
Поправил ссылку в статье. Добавил токен &token=session->data[‘token’] ?> . С кодировкой проблемы могут быть если файл сохранили после редактирования не в utf-8