От автора: неважно какой у вас бизнес, всегда важно иметь под рукой инструменты по анализу статистики произошедшего за день. С помощью таких инструментов можно корректировать стратегию развития бизнеса, если что-то пошло не так. Сегодня мы поговорим о репортах в OpenCart.
В фреймворке много полезных стандартных репортов, разделенных на основные категории – Продажи, Товары, Покупатели и Маркетинг – в каждой категории есть множество опций по просмотру информации в различной форме.
В нашем примере мы создадим репорт, в котором будут отображаться все просмотренные, но не купленные товары. Пример простой, но на его основе вы можете создать что-то более сложное под свои нужды.
Я предполагаю, что вы работаете в последней версии OpenCart и знакомы с процессом модульной разработки, так как основной упор мы сделаем именно на генерацию репортов.
Настройка back-end файлов
Для работы нам потребуются файлы:
admin/controller/report/product_custom.php: Файл основного контроллера, используется для загрузки данных модели и создания переменных.
admin/model/report/product_custom.php: Файл модели, который используется для создания SQL запросов в базу данных и вытягивания данных.
admin/view/template/report/product_custom.tpl: Файл представления, в нем хранится вся логика представления.
admin/language/english/report/product_custom.php: Файл языка.
Контроллер
Создайте файл admin/controller/report/product_custom.php и скопируйте в него следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
<?php class ControllerReportProductCustom extends Controller { public function index() { $this->load->language('report/product_custom'); $this ->document ->setTitle($this->language->get('heading_title')); if (isset($this->request->get['page'])) { $page = $this->request->get['page']; } else { $page = 1; } $url = ''; if (isset($this->request->get['page'])) { $url .= '&page=' . $this->request->get['page']; } $data['breadcrumbs'] = array(); $data['breadcrumbs'][] = array( 'text' => $this->language->get('text_home'), 'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL') ); $data['breadcrumbs'][] = array( 'text' => $this->language->get('heading_title'), 'href' => $this->url->link('report/product_custom', 'token=' . $this->session->data['token'] . $url, 'SSL') ); $this->load->model('report/product_custom'); $data['products'] = array(); $filter_data = array( 'start' => ($page - 1) * $this->config->get('config_limit_admin'), 'limit' => $this->config->get('config_limit_admin') ); $product_total = $this ->model_report_product_custom ->getTotalCustomProducts($filter_data); $results = $this ->model_report_product_custom ->getCustomProducts($filter_data); foreach ($results as $result) { $data['products'][] = array( 'name' => $result['name'], 'model' => $result['model'], 'viewed' => $result['viewed'], ); } $data['heading_title'] = $this->language->get('heading_title'); $data['text_list'] = $this->language->get('text_list'); $data['text_no_results'] = $this->language->get('text_no_results'); $data['text_confirm'] = $this->language->get('text_confirm'); $data['column_name'] = $this->language->get('column_name'); $data['column_model'] = $this->language->get('column_model'); $data['column_viewed'] = $this->language->get('column_viewed'); $data['entry_date_start'] = $this->language->get('entry_date_start'); $data['entry_date_end'] = $this->language->get('entry_date_end'); $data['token'] = $this->session->data['token']; $url = ''; $pagination = new Pagination(); $pagination->total = $product_total; $pagination->page = $page; $pagination->limit = $this->config->get('config_limit_admin'); $pagination->url = $this->url->link('report/product_custom', 'token=' . $this->session->data['token'] . $url . '&page={page}', 'SSL'); $data['pagination'] = $pagination->render(); $data['results'] = sprintf($this->language->get('text_pagination'), ($product_total) ? (($page - 1) * $this->config->get('config_limit_admin')) + 1 : 0, ((($page - 1) * $this->config->get('config_limit_admin')) > ($product_total - $this->config->get('config_limit_admin'))) ? $product_total : ((($page - 1) * $this->config->get('config_limit_admin')) + $this->config->get('config_limit_admin')), $product_total, ceil($product_total / $this->config->get('config_limit_admin'))); $data['header'] = $this->load->controller('common/header'); $data['column_left'] = $this->load->controller('common/column_left'); $data['footer'] = $this->load->controller('common/footer'); $this ->response ->setOutput($this->load->view('report/product_custom.tpl', $data)); } } |
Тут важно отметить, что мы разместили файл в папке «report», где должны храниться все файлы, связанные с отчетностью.
А в остальном это обычный контроллер – в методе index загружается подходящий язык и модель, а затем задаются переменные. В конце мы делаем файл product_custom.tpl нашим основным файлом шаблона, через который будет выводить репорт.
Модель
Давайте создадим файл модели admin/model/report/product_custom.php.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php class ModelReportProductCustom extends Model { public function getCustomProducts($data = array()) { $sql = "SELECT pd.name, p.model, p.viewed FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "order_product op ON p.product_id = op.product_id WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.viewed > 0 AND ISNULL(op.product_id) ORDER BY p.viewed DESC"; if (isset($data['start']) || isset($data['limit'])) { if ($data['start'] < 0) { $data['start'] = 0; } if ($data['limit'] < 1) { $data['limit'] = 20; } $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit']; } $query = $this->db->query($sql); return $query->rows; } public function getTotalCustomProducts($data) { $sql = "SELECT count(*) as total FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "order_product op ON p.product_id = op.product_id WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.viewed > 0 AND ISNULL(op.product_id)"; $query = $this->db->query($sql); return $query->row['total']; } } |
В нашей модели хранится два метода – getCustomProducts вытягивает подходящие записи из базы данных, а getTotalCustomProducts возвращает общее количество записей, что потом используется в компоненте постраничной навигации.
Представление
Файл представления должен лежать в admin/view/template/report/product_custom.tpl.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
<?php echo $header; ?><?php echo $column_left; ?> <div id="content"> <div class="page-header"> <div class="container-fluid"> <h1><?php echo $heading_title; ?></h1> <ul class="breadcrumb"> <?php foreach ($breadcrumbs as $breadcrumb) { ?> <li><a href="<?php echo $breadcrumb['href']; ?>"><?php echo $breadcrumb['text']; ?></a></li> <?php } ?> </ul> </div> </div> <div class="container-fluid"> <div class="panel panel-default"> <div class="panel-heading"> <h3 class="panel-title"><i class="fa fa-bar-chart"></i> <?php echo $text_list; ?></h3> </div> <div class="panel-body"> <div class="table-responsive"> <table class="table table-bordered"> <thead> <tr> <td class="text-left"><?php echo $column_name; ?></td> <td class="text-left"><?php echo $column_model; ?></td> <td class="text-right"><?php echo $column_viewed; ?></td> </tr> </thead> <tbody> <?php if ($products) { ?> <?php foreach ($products as $product) { ?> <tr> <td class="text-left"><?php echo $product['name']; ?></td> <td class="text-left"><?php echo $product['model']; ?></td> <td class="text-right"><?php echo $product['viewed']; ?></td> </tr> <?php } ?> <?php } else { ?> <tr> <td class="text-center" colspan="4"><?php echo $text_no_results; ?></td> </tr> <?php } ?> </tbody> </table> </div> <div class="row"> <div class="col-sm-6 text-left"><?php echo $pagination; ?></div> <div class="col-sm-6 text-right"><?php echo $results; ?></div> </div> </div> </div> </div> </div> <?php echo $footer; ?> |
Товары будут показываться в форме красивой таблицы. Разметка полностью адаптивна, так как в ядре у нас bootstrap!
Файл языка
Последнее, создадим файл языка admin/language/english/report/product_custom.php.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php // Heading $_['heading_title'] = 'Products Custom Report (Viewed but not purchased)'; // Text $_['text_list'] = 'Products Custom List'; // Column $_['column_date_start'] = 'Date Start'; $_['column_date_end'] = 'Date End'; $_['column_name'] = 'Product Name'; $_['column_model'] = 'Model'; $_['column_viewed'] = 'Viewed'; // Entry $_['entry_date_start'] = 'Date Start'; $_['entry_date_end'] = 'Date End' |
По файлам мы закончили.
Открываем разрешение на публикацию пользовательских репортов
Хотя мы и закончили с модулем репорта, мы пока что не можем получить к нему доступ. Ресурс считается новым, и сперва необходимо разрешить доступ к нему группе администраторов. Так что давайте откроем доступ администраторам.
Зайдите в System > Users > Users Group и перейдите на страницу редактирования группы Administrator. Под выпадающим боксом Access Permission поставьте галочку report/product_custom и сохраните изменения в группе.
Теперь вы можете получить доступ к ресурсу.
Как получить доступ к ресурсу со стороны back-end’а
Нам нужно изменить файл admin/view/template/common/menu.tpl и добавить в него ссылку на наш пользовательский репорт. Для простоты мы отредактируем его напрямую, но вы можете сделать это через расширение OCMOD. Плагин позволяет менять файлы ядра при помощи XML системы поиска и замены.
Откройте файл admin/view/template/common/menu.tpl и перейдите к следующей строке.
1 2 3 |
<li><a href="<?php echo $report_product_purchased; ?>"><?php echo $text_report_product_purchased; ?></a></li> После нее вставьте эту строку. <li><a href="/index.php?route=report/product_custom&token=<?php echo $_SESSION['token']; ?>">Custom Report</a></li> |
Теперь вы увидите, что в панели Reports > Products появилась наша ссылка. Кликните на нее, и вам откроется наш репорт!
В нем показываются все просмотренные, но еще некупленные товары. По созданию пользовательского репорта это все; надеюсь, информации было не слишком много для одной статьи. Как бы то ни было, теперь вы знаете, как создавать свои репорты и легко сможете расширить наш репорт под свои нужды.
Заключение
Сегодня мы узнали, как создавать пользовательские репорты в OpenCart. Мы прошли по всему процессу, от создания файлов и до того, как получить доступ со стороны back-end’а.
Автор: Sajal Soni
Источник: //code.tutsplus.com/
Редакция: Команда webformyself.