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

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

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

В фреймворке много полезных стандартных репортов, разделенных на основные категории – Продажи, Товары, Покупатели и Маркетинг – в каждой категории есть множество опций по просмотру информации в различной форме.

В нашем примере мы создадим репорт, в котором будут отображаться все просмотренные, но не купленные товары. Пример простой, но на его основе вы можете создать что-то более сложное под свои нужды.

Я предполагаю, что вы работаете в последней версии OpenCart и знакомы с процессом модульной разработки, так как основной упор мы сделаем именно на генерацию репортов.

Настройка back-end файлов

Для работы нам потребуются файлы:

Интернет-магазин на OpenCart!

Создайте интернет-магазин на самой популярной CMS – OpenCart с нуля!

Приступить к созданию

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.

Интернет-магазин на OpenCart!

Создайте интернет-магазин на самой популярной CMS – OpenCart с нуля!

Приступить к созданию
<?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.

Интернет-магазин на OpenCart!

Создайте интернет-магазин на самой популярной CMS – OpenCart с нуля!

Приступить к созданию
Самые свежие новости IT и веб-разработки на нашем Telegram-канале

Фреймворк 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