Advertisement
  1. Code
  2. OpenCart

Crea un informe personalizado en OpenCart

Scroll to top
Read Time: 8 min

() translation by (you can also view the original English article)

No importa con qué negocio estés tratando, siempre es importante contar con herramientas que te ayuden a analizar las estadísticas generales de los acontecimientos del día a día. Por supuesto, también te ayuda a desarrollar más estrategias para tu negocio en caso de que las cosas no vayan por el camino correcto.

Hoy, discutiremos las herramientas de informes en el contexto de OpenCart. Encontrarás muchos informes útiles en el núcleo mismo. Hay cuatro categorías principales para ser precisos: Ventas, Productos, Clientes y Marketing, y cada una de ellas ofrece más opciones para ver la información en diferentes contextos.

En nuestro ejemplo, crearemos un informe que muestra todos los productos que se ven pero que aún no se compran. Por supuesto, es un caso de uso simple, pero puedes seguir adelante y crear uno más complejo según tus requisitos.

Supongo que estás utilizando la última versión de OpenCart y estás familiarizado con el proceso de desarrollo del módulo básico en OpenCart, ya que enfatizaremos la generación de informes en lugar de los pasos básicos de desarrollo del módulo. Si deseas explorar el desarrollo de módulos básicos en OpenCart, hay un buen artículo sobre el tema.

Configuración de archivos volver-finalizar

Enumeremos los archivos que deben implementarse para nuestro informe personalizado:

  • admin/controller/report/product_custom.php: es el archivo del controlador principal que se usa para cargar los datos del modelo y configurar las variables.
  • admin/model/report/product_custom.php: es un archivo modelo que se utiliza para configurar consultas SQL para obtener los datos de la base de datos.
  • admin/view/template/report/product_custom.tpl: es un archivo de vista que contiene la lógica de presentación.
  • admin/language/english/report/product_custom.php: es un archivo de idioma.

El controlador

Continúa y crea un archivo admin/controller/report/product_custom.php con el siguiente contenido.

1
<?php
2
class ControllerReportProductCustom extends Controller {
3
    public function index() {
4
        $this->load->language('report/product_custom');
5
6
        $this->document->setTitle($this->language->get('heading_title'));
7
8
        if (isset($this->request->get['page'])) {
9
            $page = $this->request->get['page'];
10
        } else {
11
            $page = 1;
12
        }
13
14
        $url = '';
15
16
        if (isset($this->request->get['page'])) {
17
            $url .= '&page=' . $this->request->get['page'];
18
        }
19
20
        $data['breadcrumbs'] = array();
21
22
        $data['breadcrumbs'][] = array(
23
            'text' => $this->language->get('text_home'),
24
            'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL')
25
        );
26
27
        $data['breadcrumbs'][] = array(
28
            'text' => $this->language->get('heading_title'),
29
            'href' => $this->url->link('report/product_custom', 'token=' . $this->session->data['token'] . $url, 'SSL')
30
        );
31
32
        $this->load->model('report/product_custom');
33
34
        $data['products'] = array();
35
36
        $filter_data = array(
37
            'start'                  => ($page - 1) * $this->config->get('config_limit_admin'),
38
            'limit'                  => $this->config->get('config_limit_admin')
39
        );
40
41
        $product_total = $this->model_report_product_custom->getTotalCustomProducts($filter_data);
42
43
        $results = $this->model_report_product_custom->getCustomProducts($filter_data);
44
45
        foreach ($results as $result) {
46
            $data['products'][] = array(
47
                'name'       => $result['name'],
48
                'model'      => $result['model'],
49
                'viewed'      => $result['viewed'],
50
            );
51
        }
52
53
        $data['heading_title'] = $this->language->get('heading_title');
54
55
        $data['text_list'] = $this->language->get('text_list');
56
        $data['text_no_results'] = $this->language->get('text_no_results');
57
        $data['text_confirm'] = $this->language->get('text_confirm');
58
59
        $data['column_name'] = $this->language->get('column_name');
60
        $data['column_model'] = $this->language->get('column_model');
61
        $data['column_viewed'] = $this->language->get('column_viewed');
62
63
        $data['entry_date_start'] = $this->language->get('entry_date_start');
64
        $data['entry_date_end'] = $this->language->get('entry_date_end');
65
66
        $data['token'] = $this->session->data['token'];
67
68
        $url = '';
69
70
        $pagination = new Pagination();
71
        $pagination->total = $product_total;
72
        $pagination->page = $page;
73
        $pagination->limit = $this->config->get('config_limit_admin');
74
        $pagination->url = $this->url->link('report/product_custom', 'token=' . $this->session->data['token'] . $url . '&page={page}', 'SSL');
75
76
        $data['pagination'] = $pagination->render();
77
78
        $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')));
79
80
        $data['header'] = $this->load->controller('common/header');
81
        $data['column_left'] = $this->load->controller('common/column_left');
82
        $data['footer'] = $this->load->controller('common/footer');
83
84
        $this->response->setOutput($this->load->view('report/product_custom.tpl', $data));
85
    }
86
}

Lo importante a tener en cuenta aquí es que lo hemos colocado en el directorio "informe", que es el lugar correcto para todos los archivos relacionados con el informe.

Aparte de eso, son cosas bastante habituales del controlador: cargamos el lenguaje y el modelo adecuados en el método de índice y luego configuramos las variables. Al final, hemos asignado product_custom.tpl como nuestro archivo de plantilla principal que es responsable de la salida del informe principal.

El modelo

Continuando, configuremos el archivo de modelo en admin/model/report/product_custom.php.

1
<?php
2
class ModelReportProductCustom extends Model {
3
    public function getCustomProducts($data = array()) {
4
        $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) 

5
        LEFT JOIN " . DB_PREFIX . "order_product op ON p.product_id = op.product_id

6
        WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.viewed > 0 

7
        AND ISNULL(op.product_id) ORDER BY p.viewed DESC";
8
9
        if (isset($data['start']) || isset($data['limit'])) {
10
            if ($data['start'] < 0) {
11
                $data['start'] = 0;
12
            }
13
14
            if ($data['limit'] < 1) {
15
                $data['limit'] = 20;
16
            }
17
18
            $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
19
        }
20
21
        $query = $this->db->query($sql);
22
23
        return $query->rows;
24
    }
25
26
    public function getTotalCustomProducts($data) {
27
        $sql = "SELECT count(*) as total FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) 

28
        LEFT JOIN " . DB_PREFIX . "order_product op ON p.product_id = op.product_id

29
        WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.viewed > 0 

30
        AND ISNULL(op.product_id)";
31
32
        $query = $this->db->query($sql);
33
34
        return $query->row['total'];
35
    }
36
}

Hay dos métodos en nuestro archivo de modelo: getCustomProducts obtienes los registros apropiados de la base de datos, mientras que getTotalCustomProducts devuelve el recuento total de registros utilizado por el componente de paginación en el controlador.

La vista

A continuación, el archivo de vista debes ubicarlo en admin/view/template/report/product_custom.tpl.

1
<?php echo $header; ?><?php echo $column_left; ?>
2
<div id="content">
3
  <div class="page-header">
4
    <div class="container-fluid">
5
      <h1><?php echo $heading_title; ?></h1>
6
      <ul class="breadcrumb">
7
        <?php foreach ($breadcrumbs as $breadcrumb) { ?>
8
        <li><a href="<?php echo $breadcrumb['href']; ?>"><?php echo $breadcrumb['text']; ?></a></li>
9
        <?php } ?>
10
      </ul>
11
    </div>
12
  </div>
13
  <div class="container-fluid">
14
    <div class="panel panel-default">
15
      <div class="panel-heading">
16
        <h3 class="panel-title"><i class="fa fa-bar-chart"></i> <?php echo $text_list; ?></h3>
17
      </div>
18
      <div class="panel-body">
19
        <div class="table-responsive">
20
          <table class="table table-bordered">
21
            <thead>
22
              <tr>
23
                <td class="text-left"><?php echo $column_name; ?></td>
24
                <td class="text-left"><?php echo $column_model; ?></td>
25
                <td class="text-right"><?php echo $column_viewed; ?></td>
26
              </tr>
27
            </thead>
28
            <tbody>
29
              <?php if ($products) { ?>
30
              <?php foreach ($products as $product) { ?>
31
              <tr>
32
                <td class="text-left"><?php echo $product['name']; ?></td>
33
                <td class="text-left"><?php echo $product['model']; ?></td>
34
                <td class="text-right"><?php echo $product['viewed']; ?></td>
35
              </tr>
36
              <?php } ?>
37
              <?php } else { ?>
38
              <tr>
39
                <td class="text-center" colspan="4"><?php echo $text_no_results; ?></td>
40
              </tr>
41
              <?php } ?>
42
            </tbody>
43
          </table>
44
        </div>
45
        <div class="row">
46
          <div class="col-sm-6 text-left"><?php echo $pagination; ?></div>
47
          <div class="col-sm-6 text-right"><?php echo $results; ?></div>
48
        </div>
49
      </div>
50
    </div>
51
  </div> 
52
</div>
53
<?php echo $footer; ?>

Mostrará la lista de productos en una forma tabular agradable y, por supuesto, es receptivo ya que bootstrap está en el núcleo ahora.

El archivo de idioma

Al final, creemos un archivo de idioma en admin/language/english/report/product_custom.php.

1
<?php
2
// Heading

3
$_['heading_title']     = 'Products Custom Report (Viewed but not purchased)';
4
5
// Text

6
$_['text_list']         = 'Products Custom List';
7
8
// Column

9
$_['column_date_start'] = 'Date Start';
10
$_['column_date_end']   = 'Date End';
11
$_['column_name']       = 'Product Name';
12
$_['column_model']      = 'Model';
13
$_['column_viewed']      = 'Viewed';
14
15
// Entry

16
$_['entry_date_start']  = 'Date Start';
17
$_['entry_date_end']    = 'Date End';

Así que eso es todo en lo que respecta a la configuración del archivo.

Otorga permiso para el informe personalizado

Aunque hemos terminado con nuestro módulo de informes personalizados, todavía no podrás acceder a él. Esto se debe a que se considera un recurso nuevo y el grupo de usuarios administradores debería poder acceder a este recurso. Por lo tanto, sigamos adelante y concedamos permiso para este recurso al grupo de usuarios administradores.

Ve a Sistema > Usuarios > Grupo de usuarios y edita el grupo de usuarios administrador. En el cuadro desplegable permiso de acceso, marca el recurso report/product_custom y guarda el grupo.

Custom ReportCustom ReportCustom Report

Ahora, deberías poder acceder a este recurso.

Cómo acceder a nuestro informe en el volver-finalizar

Tendremos que modificar admin/view/template/common/menu.tpl para incluir nuestro enlace de informe personalizado. En aras de la simplicidad, lo modificaremos directamente, pero es posible que desees lograr lo mismo con la extensión OCMOD. Te permite cambiar los archivos principales mediante un sistema de búsqueda/reemplazo basado en XML.

Ahora, abre el archivo admin/view/template/common/menu.tpl y busca la siguiente línea.

1
<li><a href="<?php echo $report_product_purchased; ?>"><?php echo $text_report_product_purchased; ?></a></li>

Después de esa línea, agrega la siguiente línea.

1
<li><a href="/index.php?route=report/product_custom&token=<?php echo $_SESSION['token']; ?>">Custom Report</a></li>

Ahora deberías poder ver nuestro enlace en Informes > Productos. ¡Haz clic en eso para ver nuestro increíble informe personalizado!

Custom Report LinkCustom Report LinkCustom Report Link

Enumera todos los productos que se han visto y aún no se han comprado. Entonces, eso es todo en lo que respecta a la creación de informes personalizados; Espero que no haya sido demasiado a la vez. Pero, de todos modos, tienes la idea y puedes ampliarla fácilmente según tus requisitos.

Conclusión

Hoy, discutimos cómo crear un informe personalizado en OpenCart. Pasamos por el proceso completo de configuración de los archivos requeridos y, en la parte posterior del artículo, demostramos cómo acceder al informe desde el volver-finalizar.

Si estás buscando herramientas, utilidades, extensiones, etc. de OpenCart adicionales que puedas aprovechar en tus propios proyectos o para tu propia educación, no olvides ver lo que tenemos disponible en el mercado.

Espero que hayas disfrutado de todo hasta ahora y estés atento a más sobre OpenCart. En caso de cualquier consulta o sugerencia, puedes comunicarte conmigo a través de Twitter o utilizar el feed de comentarios a continuación.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.