Advertisement
  1. Code
  2. OpenCart

Cómo usar Ajax con OpenCart

Scroll to top
Read Time: 8 min

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

La inclusión de bibliotecas jQuery en el núcleo de OpenCart hace que la implementación de Ajax sea muy sencilla y más que una experiencia agradable. De hecho, encontrarás varios fragmentos repartidos por todo el marco que muestran el uso intensivo de jQuery, si intentas profundizar en los archivos de vista específicamente.

A lo largo de este artículo, crearemos una página personalizada para demostrar el uso de Ajax en OpenCart. Será una interfaz simple que te permitirá seleccionar un producto del cuadro desplegable y mostrará un bonito bloque de resumen del producto seleccionado. La parte interesante del caso de uso es la forma en que se construye el bloque de resumen del producto; se preparará usando Ajax sobre la marcha. Por supuesto, no es algo que lo convierta en un ejemplo fuera del mundo, pero supongo que servirá para el propósito básico de mostrar cómo funcionan las cosas en OpenCart.

¡Supongo que estás utilizando la última versión de OpenCart, que es 2.1.x.x! Además, la discusión principal de este artículo se concentra en Ajax con OpenCart, por lo que analizaré los conceptos básicos del desarrollo de módulos personalizados en OpenCart. Sin embargo, si no estás familiarizado con él, una explicación rápida de los fragmentos de código intermedios asegura que puedas seguir hasta el final.

Un vistazo rápido a la organización de archivos

Repasemos rápidamente la configuración del archivo necesaria para nuestra página personalizada.

  • catalog/controller/ajax/index.php: es un archivo de controlador que proporciona la lógica de aplicación del controlador habitual en OpenCart.
  • catalog/language/english/ajax/index.php: es un archivo de idioma que ayuda a configurar etiquetas de idioma.
  • catalog/view/theme/default/template/ajax/index.tpl: es un archivo de plantilla de vista que contiene el XHTML de la página personalizada.
  • catalog/view/theme/default/template/ajax/product.tpl: es un archivo de plantilla de vista que contiene el XHTML de la respuesta AJAX.

Entonces, esa es una lista rápida de los archivos que implementaremos hoy.

Crea archivos de módulo

Continúa y crea una carpeta  catalog/controller/ajax/index.php con el siguiente contenido.

1
<?php
2
// catalog/controller/ajax/index.php

3
class ControllerAjaxIndex extends Controller {
4
  public function index() {
5
    $this->load->language('ajax/index');
6
    $this->load->model('catalog/product');
7
    
8
    $this->document->setTitle($this->language->get('heading_title'));
9
    
10
    // load all products

11
    $products = $this->model_catalog_product->getProducts();
12
    $data['products'] = $products;
13
    
14
    $data['breadcrumbs'] = array();
15
16
    $data['breadcrumbs'][] = array(
17
      'href' => $this->url->link('common/home'),
18
      'text' => $this->language->get('text_home')
19
    );
20
21
    $data['breadcrumbs'][] = array(
22
      'href' => $this->url->link('ajax/index'),
23
      'text' => $this->language->get('heading_title')
24
    );
25
26
    $data['heading_title'] = $this->language->get('heading_title');
27
    $data['text_product_dropdown_label'] = $this->language->get('text_product_dropdown_label');
28
29
    $data['column_left'] = $this->load->controller('common/column_left');
30
    $data['column_right'] = $this->load->controller('common/column_right');
31
    $data['content_top'] = $this->load->controller('common/content_top');
32
    $data['content_bottom'] = $this->load->controller('common/content_bottom');
33
    $data['footer'] = $this->load->controller('common/footer');
34
    $data['header'] = $this->load->controller('common/header');
35
36
    if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/ajax/index.tpl')) {
37
      $this->response->setOutput($this->load->view($this->config->get('config_template') . '/template/ajax/index.tpl', $data));
38
    } else {
39
      $this->response->setOutput($this->load->view('default/template/ajax/index.tpl', $data));
40
    }
41
  }
42
 
43
  // ajax call method

44
  public function ajaxGetProduct() {
45
    if (isset($this->request->get['product_id'])) {
46
      $product_id = (int) $this->request->get['product_id'];
47
48
      if ($product_id > 0) {
49
        // load the particular product requested in ajax

50
        $this->load->model('catalog/product');
51
        $product = $this->model_catalog_product->getProduct($product_id);
52
        $data['product'] = $product;
53
        
54
        // prepare thumb image

55
        $this->load->model('tool/image');
56
        if ($product['image']) {
57
          $data['thumb'] = $this->model_tool_image->resize($product['image'], $this->config->get('config_image_thumb_width'), $this->config->get('config_image_thumb_height'));
58
        }
59
        
60
        // format price

61
        $data['price'] = $this->currency->format($this->tax->calculate($product['price'], $product['tax_class_id'], $this->config->get('config_tax')));
62
        
63
        $this->load->language('product/product');
64
        $data['text_manufacturer'] = $this->language->get('text_manufacturer');
65
        $data['text_model'] = $this->language->get('text_model');
66
        $data['text_note'] = $this->language->get('text_note');
67
        $data['tab_description'] = $this->language->get('tab_description');
68
        
69
        if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/ajax/product.tpl')) {
70
          $this->response->setOutput($this->load->view($this->config->get('config_template') . '/template/ajax/product.tpl', $data));
71
        } else {
72
          $this->response->setOutput($this->load->view('default/template/ajax/product.tpl', $data));
73
        }
74
      }
75
    }
76
  }
77
}

Para empezar, el método de index del controlador se utiliza para cargar los archivos de idioma y modelo y configurar las variables comunes para la plantilla OpenCart habitual. Estamos cargando el modelo de producto disponible en el núcleo mismo, por lo que no tenemos que duplicar el código para obtener la información del producto.

Después de cargar el modelo de producto, usamos el método getProducts para cargar todos los productos. Finalmente, concluimos el método de index estableciendo index.tpl como nuestro archivo de plantilla principal.

El siguiente es el importante método ajaxGetProduct, que se usa para construir un bloque de resumen de producto basado en la identificación del producto pasada en la llamada Ajax, como veremos pronto en el archivo de plantilla. Carga el mismo modelo de producto que hicimos en el método de index y llama al método getProduct para obtener información específica del producto en función de la identificación del producto.

Al final, la plantilla product.tpl se establece como plantilla para este método. Específicamente para los requisitos en nuestro caso, estamos usando la plantilla para construir nuestra salida Ajax, pero también podrías enviar la respuesta JSON en su lugar.

Continuando, creemos un archivo de idioma catalog/language/english/ajax/index.php para contener la información de la etiqueta estática.

1
<?php
2
// catalog/language/english/ajax/index.php

3
// Heading

4
$_['heading_title']            = 'Simple Ajax Example';
5
$_['text_product_dropdown_label']   = 'Select Product';

El archivo de plantilla de vista, uno de los archivos más importantes en el contexto de este tutorial, debe crearse en catalog/view/theme/default/template/ajax/index.tpl con el siguiente contenido.

1
<!-- catalog/view/theme/default/template/ajax/index.tpl -->
2
<?php echo $header; ?>
3
<div class="container">
4
  <ul class="breadcrumb">
5
    <?php foreach ($breadcrumbs as $breadcrumb) { ?>
6
    <li><a href="<?php echo $breadcrumb['href']; ?>"><?php echo $breadcrumb['text']; ?></a></li>
7
    <?php } ?>
8
  </ul>
9
  <div class="row"><?php echo $column_left; ?>
10
    <?php if ($column_left && $column_right) { ?>
11
    <?php $class = 'col-sm-6'; ?>
12
    <?php } elseif ($column_left || $column_right) { ?>
13
    <?php $class = 'col-sm-9'; ?>
14
    <?php } else { ?>
15
    <?php $class = 'col-sm-12'; ?>
16
    <?php } ?>
17
    <div id="content" class="<?php echo $class; ?>"><?php echo $content_top; ?>
18
      <h2><?php echo $heading_title; ?></h2>
19
      <fieldset id="account">
20
      <div>
21
        <label class="col-sm-2 control-label" for="product"><?php echo $text_product_dropdown_label; ?></label>
22
        <div class="col-sm-10">
23
          <select name="product" class="form-control" id="product">
24
            <option>-- <?php echo $text_product_dropdown_label; ?> --</option>
25
            <?php foreach ($products as $product) { ?>
26
              <option value="<?php echo $product['product_id']; ?>"><?php echo $product['name']; ?></option>
27
            <?php } ?>
28
          </select>
29
        </div>
30
      </div>
31
      </fieldset>
32
      <div id="product_summary"></div>
33
      <?php echo $content_bottom; ?></div>
34
    <?php echo $column_right; ?></div>
35
</div>
36
<?php echo $footer; ?>
37
38
<script type="text/javascript">
39
  $('#product').on('change', function() {
40
    $.ajax({
41
      url: 'index.php?route=ajax/index/ajaxGetProduct&product_id=' + this.value,
42
      dataType: 'html',
43
      success: function(htmlText) {
44
        $('#product_summary').html(htmlText);
45
      },
46
      error: function(xhr, ajaxOptions, thrownError) {
47
        alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
48
      }
49
    });
50
  });
51
</script>

El fragmento de nuestro interés se encuentra al final de index.tpl, el código JavaScript que utiliza métodos jQuery para vincular cambios y eventos Ajax. Cuando el usuario selecciona un producto del cuadro desplegable, se activa el evento de cambio que finalmente realiza una llamada Ajax. En la llamada Ajax, enviamos el product_id adjunto como una variable de cadena de consulta GET.

Por otro lado, como ya hemos discutido en la configuración del controlador, ajaxGetProduct envía el XHTML del bloque de resumen del producto basado en la variable product_id query-string. En el método de éxito, agregamos la respuesta XHTML a la etiqueta div que tiene el atributo id establecido en product_summary.

Finalmente, sigue adelante y crea un archivo de plantilla catalog/view/theme/default/template/ajax/product.tpl con el siguiente contenido para una llamada Ajax.

1
<!-- catalog/view/theme/default/template/ajax/product.tpl -->
2
<div style="border: 1px solid #CCC;padding:10px;margin:10px;">
3
  <h3><?php echo $product['name']; ?> - <?php echo $price; ?></h3>
4
  <p><img src="<?php echo $thumb; ?>"/></p>
5
  <p><b><?php echo $text_manufacturer; ?></b>&nbsp;<?php echo $product['manufacturer']; ?></p>
6
  <p><b><?php echo $text_model; ?></b>&nbsp;<?php echo $product['model']; ?></p>
7
</div>

Aquí no hay nada lujoso: hemos incluido un bloque de resumen de producto básico XHTML.

Entonces, eso es todo en lo que respecta a la configuración del archivo. En nuestra próxima sección, revisaremos la interfaz para probar lo que hemos construido hasta ahora.

Pruebas de interfaz

Así que hemos hecho todo el trabajo duro y ahora es el momento de realizar algunas pruebas. Dirígete a la interfaz de OpenCart y visita la URL http://www.yourstore.com/index.php?route=ajax/index. Debería mostrar una interfaz atractiva como se muestra en la siguiente captura de pantalla.

Custom Page Drop-DownCustom Page Drop-DownCustom Page Drop-Down

Es nuestra página personalizada y muestra un cuadro desplegable que contiene la lista de todos los productos. Ahora, intentemos seleccionar un producto del cuadro de selección, y haremos una llamada Ajax en segundo plano.

Como resultado, deberías ver un bonito bloque de resumen de producto que se muestra justo debajo del cuadro desplegable, como se muestra en la siguiente captura de pantalla.

AJAX PreviewAJAX PreviewAJAX Preview

Si seguiste el tutorial e implementaste todos los archivos como se explicó, ¡debería funcionar sin problemas para ti tan bien como lo hizo para mí! Por supuesto, esa fue una demostración bastante simple de cómo funciona Ajax en OpenCart, pero puedes estirarlo al siguiente nivel según tus requisitos.

Continúa y juega con él, e intenta hacer algunas cosas interactivas usando Ajax, ya que es la mejor manera de aprender. Eso es todo por hoy y volveré pronto con algunas cosas más emocionantes.

Conclusión

Ajax con OpenCart fue la atracción central del artículo de hoy. Como de costumbre, adoptamos un enfoque de módulo personalizado para demostrarlo e hicimos un caso de uso simple pero efectivo.

Como siempre, 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 haya sido informativo y útil, ¡y no dudes en dejar tus consultas y comentarios!

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.