Opencart - Как Создать Пользовательский Репорт

Тема в разделе "Общие вопросы", создана пользователем admin, 1 фев 2018.

  1. TopicStarter Overlay
    Offline

    admin Команда форума Администратор

    Сообщения:
    2.595
    Симпатии:
    111.137
    Репутация:
    175
    Неважно какой у вас бизнес, всегда важно иметь под рукой инструменты по анализу статистики произошедшего за день. С помощью таких инструментов можно корректировать стратегию развития бизнеса, если что-то пошло не так. Сегодня мы поговорим о репортах в 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 и скопируйте в него следующий код:
    Код:
    <?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.
    Код:
    <?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.
    Код:
    <?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.
    Код:
    <?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 и сохраните изменения в группе.

    1.png

    Теперь вы можете получить доступ к ресурсу.

    Как получить доступ к ресурсу со стороны back-end’а
    Нам нужно изменить файл admin/view/template/common/menu.tpl и добавить в него ссылку на наш пользовательский репорт. Для простоты мы отредактируем его напрямую, но вы можете сделать это через расширение OCMOD. Плагин позволяет менять файлы ядра при помощи XML системы поиска и замены.

    Откройте файл admin/view/template/common/menu.tpl и перейдите к следующей строке.
    Код:
    <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 появилась наша ссылка. Кликните на нее, и вам откроется наш репорт!

    2.png

    В нем показываются все просмотренные, но еще некупленные товары. По созданию пользовательского репорта это все; надеюсь, информации было не слишком много для одной статьи. Как бы то ни было, теперь вы знаете, как создавать свои репорты и легко сможете расширить наш репорт под свои нужды.

    Заключение
    Сегодня мы узнали, как создавать пользовательские репорты в OpenCart. Мы прошли по всему процессу, от создания файлов и до того, как получить доступ со стороны back-end’а.