Как создать пользовательский репорт в OpenCart

Как создать пользовательский репорт в OpenCart

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

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

Как получить доступ к ресурсу со стороны 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 появилась наша ссылка. Кликните на нее, и вам откроется наш репорт!

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

Заключение

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

Автор: Sajal Soni

Источник: http://code.tutsplus.com/

Редакция: Команда webformyself.

Фреймворк YII2: теория и первая практика

Овладейте азами фреймворка Yii2 за 5 дней!

Получить

Метки:

Комментарии Вконтакте:

Комментарии Facebook:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree