Включение библиотек jQuery в ядро OpenCart делает реализацию Ajax простой и приятной. Фактически, вы найдете несколько фрагментов, разбросанных по всей структуре, которые демонстрируют интенсивное использование jQuery, если вы попытаетесь копаться в файлах представлений специально.
На протяжении всей этой статьи мы будем создавать пользовательскую страницу, чтобы продемонстрировать использование Ajax в OpenCart. Это будет простой интерфейс, который позволит вам выбрать продукт из выпадающего списка и отобразит симпатичный сводный блок о выбранном продукте. Интересная часть варианта использования — это способ создания сводного блока продукта — он будет готовиться с использованием Ajax на лету. Конечно, это не то, что делает его примером из мира, но я думаю, что это послужит основной цели — показать, как все работает в OpenCart.
Я предполагаю, что вы используете последнюю версию OpenCart, которая является 2.1.xx! Кроме того, основное обсуждение этой статьи сосредоточено на Ajax с OpenCart, поэтому я рассмотрю основы разработки пользовательских модулей в OpenCart. Однако, если вы не знакомы с ним, быстрое объяснение фрагментов кода между ними гарантирует, что вы сможете следовать до конца!
Быстрый взгляд на организацию файлов
Давайте быстро пройдемся по настройке файла, необходимой для нашей пользовательской страницы.
-
catalog/controller/ajax/index.php
: это файл контроллера, который обеспечивает логику приложения обычного контроллера в OpenCart. -
catalog/language/english/ajax/index.php
: Это языковой файл, который помогает настроить языковые метки. -
catalog/view/theme/default/template/ajax/index.tpl
: это файл шаблона представления, который содержит XHTML пользовательской страницы. -
catalog/view/theme/default/template/ajax/product.tpl
: это файл шаблона представления, который содержит XHTML ответа AJAX.
Итак, это краткий список файлов, которые мы собираемся реализовать сегодня.
Создать файлы модулей
Далее создайте файл catalog/controller/ajax/index.php
со следующим содержимым.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
<?php
// catalog/controller/ajax/index.php
class ControllerAjaxIndex extends Controller {
public function index() {
$this->load->language(‘ajax/index’);
$this->load->model(‘catalog/product’);
$this->document->setTitle($this->language->get(‘heading_title’));
// load all products
$products = $this->model_catalog_product->getProducts();
$data[‘products’] = $products;
$data[‘breadcrumbs’] = array();
$data[‘breadcrumbs’][] = array(
‘href’ => $this->url->link(‘common/home’),
‘text’ => $this->language->get(‘text_home’)
);
$data[‘breadcrumbs’][] = array(
‘href’ => $this->url->link(‘ajax/index’),
‘text’ => $this->language->get(‘heading_title’)
);
$data[‘heading_title’] = $this->language->get(‘heading_title’);
$data[‘text_product_dropdown_label’] = $this->language->get(‘text_product_dropdown_label’);
$data[‘column_left’] = $this->load->controller(‘common/column_left’);
$data[‘column_right’] = $this->load->controller(‘common/column_right’);
$data[‘content_top’] = $this->load->controller(‘common/content_top’);
$data[‘content_bottom’] = $this->load->controller(‘common/content_bottom’);
$data[‘footer’] = $this->load->controller(‘common/footer’);
$data[‘header’] = $this->load->controller(‘common/header’);
if (file_exists(DIR_TEMPLATE . $this->config->get(‘config_template’) . ‘/template/ajax/index.tpl’)) {
$this->response->setOutput($this->load->view($this->config->get(‘config_template’) . ‘/template/ajax/index.tpl’, $data));
} else {
$this->response->setOutput($this->load->view(‘default/template/ajax/index.tpl’, $data));
}
}
// ajax call method
public function ajaxGetProduct() {
if (isset($this->request->get[‘product_id’])) {
$product_id = (int) $this->request->get[‘product_id’];
if ($product_id > 0) {
// load the particular product requested in ajax
$this->load->model(‘catalog/product’);
$product = $this->model_catalog_product->getProduct($product_id);
$data[‘product’] = $product;
// prepare thumb image
$this->load->model(‘tool/image’);
if ($product[‘image’]) {
$data[‘thumb’] = $this->model_tool_image->resize($product[‘image’], $this->config->get(‘config_image_thumb_width’), $this->config->get(‘config_image_thumb_height’));
}
// format price
$data[‘price’] = $this->currency->format($this->tax->calculate($product[‘price’], $product[‘tax_class_id’], $this->config->get(‘config_tax’)));
$this->load->language(‘product/product’);
$data[‘text_manufacturer’] = $this->language->get(‘text_manufacturer’);
$data[‘text_model’] = $this->language->get(‘text_model’);
$data[‘text_note’] = $this->language->get(‘text_note’);
$data[‘tab_description’] = $this->language->get(‘tab_description’);
if (file_exists(DIR_TEMPLATE . $this->config->get(‘config_template’) . ‘/template/ajax/product.tpl’)) {
$this->response->setOutput($this->load->view($this->config->get(‘config_template’) . ‘/template/ajax/product.tpl’, $data));
} else {
$this->response->setOutput($this->load->view(‘default/template/ajax/product.tpl’, $data));
}
}
}
}
}
|
Начнем с того, что index
метод контроллера используется для загрузки файлов языка и модели и установки общих переменных для обычного шаблона OpenCart. Мы загружаем модель продукта, доступную в самом ядре, поэтому нам не нужно дублировать код для получения информации о продукте.
После загрузки модели продукта мы используем метод getProducts
для загрузки всех продуктов. Наконец, мы завершаем метод index
, устанавливая index.tpl
качестве основного файла шаблона.
Далее следует важный метод ajaxGetProduct
, который используется для создания сводного блока продукта на основе идентификатора продукта, переданного в вызове Ajax, как мы скоро увидим в файле шаблона. Он загружает ту же модель продукта, что и в методе index
, и вызывает метод getProduct
для получения конкретной информации о продукте на основе идентификатора продукта.
В конце шаблон product.tpl
устанавливается как шаблон для этого метода. В соответствии с требованиями в нашем случае мы используем шаблон для создания выходных данных Ajax, но вы также можете отправить ответ JSON.
Продвигаясь вперед, давайте создадим catalog/language/english/ajax/index.php
языковых файлов catalog/language/english/ajax/index.php
для хранения статической информации метки.
1
2
3
4
5
|
<?php
// catalog/language/english/ajax/index.php
// Heading
$_[‘heading_title’] = ‘Simple Ajax Example’;
$_[‘text_product_dropdown_label’] = ‘Select Product’;
|
Файл шаблона представления, один из наиболее важных файлов в контексте этого руководства, должен быть создан в catalog/view/theme/default/template/ajax/index.tpl
со следующим содержимым.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
<!— catalog/view/theme/default/template/ajax/index.tpl —>
<?php echo $header;
<div class=»container»>
<ul class=»breadcrumb»>
<?php foreach ($breadcrumbs as $breadcrumb) { ?>
<li><a href=»<?php echo $breadcrumb[‘href’]; ?>»><?php echo $breadcrumb[‘text’];
<?php } ?>
</ul>
<div class=»row»><?php echo $column_left;
<?php if ($column_left && $column_right) { ?>
<?php $class = ‘col-sm-6’;
<?php } elseif ($column_left || $column_right) { ?>
<?php $class = ‘col-sm-9’;
<?php } else { ?>
<?php $class = ‘col-sm-12’;
<?php } ?>
<div id=»content» class=»<?php echo $class; ?>»><?php echo $content_top;
<h2><?php echo $heading_title;
<fieldset id=»account»>
<div>
<label class=»col-sm-2 control-label» for=»product»><?php echo $text_product_dropdown_label;
<div class=»col-sm-10″>
<select name=»product» class=»form-control» id=»product»>
<option>— <?php echo $text_product_dropdown_label;
<?php foreach ($products as $product) { ?>
<option value=»<?php echo $product[‘product_id’]; ?>»><?php echo $product[‘name’];
<?php } ?>
</select>
</div>
</div>
</fieldset>
<div id=»product_summary»></div>
<?php echo $content_bottom;
<?php echo $column_right;
</div>
<?php echo $footer;
<script type=»text/javascript»>
$(‘#product’).on(‘change’, function() {
$.ajax({
url: ‘index.php?route=ajax/index/ajaxGetProduct&product_id=’ + this.value,
dataType: ‘html’,
success: function(htmlText) {
$(‘#product_summary’).html(htmlText);
},
error: function(xhr, ajaxOptions, thrownError) {
alert(thrownError + «\r\n» + xhr.statusText + «\r\n» + xhr.responseText);
}
});
});
</script>
|
Интересующий нас фрагмент находится в конце index.tpl
, кода JavaScript, который использует методы jQuery для привязки изменений и событий Ajax. Когда пользователь выбирает продукт из выпадающего списка, запускается событие изменения, которое в конечном итоге вызывает Ajax. В вызове Ajax мы отправляем product_id
добавленный как переменная строки запроса GET.
С другой стороны, как мы уже обсуждали при настройке контроллера, ajaxGetProduct
отправляет XHTML сводного блока продукта на основе переменной строки запроса product_id
. В методе успеха мы добавляем ответ XHTML к тегу div, для атрибута id которого установлено значение product_summary.
Наконец, продолжайте и создайте файл шаблона catalog/view/theme/default/template/ajax/product.tpl
со следующим содержимым для вызова Ajax.
1
2
3
4
5
6
7
|
<!— catalog/view/theme/default/template/ajax/product.tpl —>
<div style=»border: 1px solid #CCC;padding:10px;margin:10px;»>
<h3><?php echo $product[‘name’];
<p><img src=»<?php echo $thumb; ?>»/></p>
<p><b><?php echo $text_manufacturer;
<p><b><?php echo $text_model;
</div>
|
Ничего особенного здесь — мы только что включили базовый блок сводки продукта XHTML.
Итак, вот и все, что касается настройки файла. В нашем следующем разделе мы рассмотрим интерфейс, чтобы протестировать то, что мы создали до сих пор.
Front-End Тестирование
Итак, мы проделали всю тяжелую работу, и теперь пришло время для некоторых испытаний! Перейдите в интерфейс OpenCart и перейдите по адресу http://www.yourstore.com/index.php?route=ajax/index . Он должен отображать красивый интерфейс, как показано на следующем скриншоте.
Это наша пользовательская страница, и она отображает раскрывающийся список со списком всех продуктов. Теперь давайте попробуем выбрать продукт из поля выбора, и он будет выполнять Ajax-вызов в фоновом режиме.
В результате вы должны увидеть симпатичный сводный блок продукта, отображаемый прямо под раскрывающимся списком, как показано на следующем снимке экрана.
Если вы следовали этому руководству и внедрили все файлы, как описано, оно должно работать для вас так же хорошо, как и для меня! Конечно, это была довольно простая демонстрация того, как Ajax работает в OpenCart, но вы можете расширить его до следующего уровня в соответствии с вашими требованиями.
Продолжайте играть с ним и попробуйте сделать некоторые интерактивные вещи, используя Ajax, так как это лучший способ учиться. Итак, на сегодня все, и я скоро вернусь с более захватывающими вещами.
Вывод
Именно Ajax с OpenCart был главной достопримечательностью сегодняшней статьи. Как обычно, мы использовали индивидуальный модульный подход, чтобы продемонстрировать это, и создали простой, но эффективный вариант использования.
Как всегда, если вы ищете дополнительные инструменты OpenCart, утилиты, расширения и т. Д., Которые вы можете использовать в своих собственных проектах или для собственного образования, не забудьте посмотреть, что у нас есть на рынке .
Я надеюсь, что это было информативно и полезно, и не стесняйтесь оставлять свои вопросы и комментарии!