Все началось с того, что достало грузить ворох js скриптов для одной функции добавления в корзину товара.
Как известно, чтобы реализовать это средствами HostCMS нам нужны 4-ре файла:
<script type="text/javascript" src="/templates/template1/hostcms.js"></script>
<script type="text/javascript" src="/hostcmsfiles/ajax/JsHttpRequest.js"></script>
<script type="text/javascript" src="/hostcmsfiles/ajax/ajax.js"></script>
<script type="text/javascript" src="/hostcmsfiles/main.js"></script>
Общий вес - 54кб (17.8кб gzip).
При распространенности использования jquery мы имеем еще плюс 70кб (24кб gzip).
Итого:
124кб скриптов + 5 запросов - что весьма плачевно сказывается на загрузке.
В целях оптимизации загрузки страницы и кол-ва запросов было решено переделать все на jquery.
Теория
Чтобы добавить товар в корзину нам надо знать Id и количество. Количество необязательный параметр - HostCMS подставит 1 шт если в запросе не передается количество, однако во избежание проблем в скрипте указано явно передавать кол-во равное 1 штуке.
Остается передать только Id. Id - это уникальный номер и не может повторяться - значит удобнее всего прописать id как есть в аттрибуты ссылки "купить".
Чтобы олегчить работу Jquery в плане выборки интересующих ссылок добавим к каждой ссылке "купить" class="buy".
Теперь, используя Jquery можно выбрать все такие ссылки и для каждой получить Id. Затем передать Ajax запрос типовой динамической странице - Интернет-магазин Корзина и обновить Краткую корзину на странице.
Практика
Нам понадобятся:
Типовая динамическая страница - Интернет-магазин корзина. (Отдельный вопрос к разработчикам, почему $_GET??)
Jquery (для удобства я использую CDN от яндекса, что дает и gzip/deflate и правильное кеширование клиентом)
Блок CSS - для отображения действия.
Сам скрипт в теле шаблона.
XSL-шаблон товара или каталога - там где нужна кнопка купить/в корзину.
HTML:
<div class="loading"><img src="/hostcmsfiles/images/ajax_loader.gif" alt=""/></div>
<script type="text/javascript" src="http://yandex.st/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
var lcart = $('#little_cart');
$("a.buy").click( function(e) {
ShowLoadingScreen();
e.preventDefault();
var item = this.id;
$.ajax({
type: "POST",
url: "/catalog/cart/",
data: "ajax_add_item_id="+ item +"&count=1",
success: function(msg){
lcart.html(msg);
HideLoadingScreen();
}
});
});
var loader = $(".loading");
function ShowLoadingScreen()
{
loader.toggle();
}
function HideLoadingScreen()
{
loader.toggle();
}
</script>
CSS:
.loading { display: none; position: absolute; top: 50%; left: 50%;}
Тип. динамическая страница - Интернет-магазин Корзина:
/* AJAX добавление товара в корзину */
if (isset($_REQUEST['ajax_add_item_id']))
{
$param = array();
$param['shop_id'] = $shop_id;
$param['item_id'] = to_int($_REQUEST['ajax_add_item_id']);
$param['user_id'] = $site_users_id;
if (isset($_REQUEST['count']))
{
$item_add_count = $_REQUEST['count'];
}
else
{
$item_add_count = 1;
}
$shop_order_items_quantity = $shop->ConvertPrice($item_add_count);
// Число товаров передаем, если посетитель кладет в корзину больше 0 товара
if ($shop_order_items_quantity > 0)
{
$param['count'] = $shop_order_items_quantity;
}
// Добавляем товар в корзину
$shop->AddIntoCart($param);
$shop->ShowCart($shop_id, $site_users_id, to_str($GLOBALS['LA']['xsl_little_cart']));
exit();
}
XSL-шаблон товара:
<a id="{@id}" class="buy" href="{/shop/path}cart/?action=add&item_id={@id}" title=" {name}">купить →</a>
Таким образом, мы избавились от 4х запросов к серверу и 54кб лишнего мусора.
Стоит отметить, что решение легко допиливается для обновления 2х и более Кратких корзин на странице, что нельзя сделать используя стоковые скрипты.
PS Интересна ли тема оптимизации сайтов с использованием HostCMS? Или модернизация скриптов - оформление заказа в 2 клика.