Понадобилось сделать корзину в commerce попроще.
Вид типа N товаров - N руб
В template.php
<?php
function simple_commerce_cart() {
global $user;
$order = commerce_cart_order_load($user->uid);
if(!empty($order)) {
$wrapper = entity_metadata_wrapper('commerce_order', $order);
$line_items = $wrapper->commerce_line_items;
$total = commerce_line_items_total($line_items);
$currency = commerce_currency_load($total['currency_code']);
$quantity = commerce_line_items_quantity($line_items, commerce_product_line_item_types());
$summ = commerce_currency_format($total['amount'], $total['currency_code']);
print
"{$quantity} товаров - {$summ}";
}
else {
print "Ваша корзина пуста";
}
}
?>
Вызываем где надо
<?php
// Вывод упрощенной корзины. template.php
print simple_commerce_cart();
?>
Собственно темезировать можно как надо. Это просто вывод текста.
Комментарии
а как бы потянуть в это поля из связанного товара?
был бы весьма признателен за небольшой пример.
мммм зачем? Если такое надо то проще стандартную корзиную юзать и через viwes тоскать поля.
и такое делаю))
вопрос был именно про кастомный блок,
если есть возможность - пните в нужную сторону)
иначе сам дойду))
Посути за это отвечает line_items, так что копать от него стоит. Ну он точно необходим для товаров в корзине и с ними связан.
там лайне итемз есть commerce_product_id. это ладно, а вот как потом получить дисплей продукта? ведь в товаре нет никакой информации о дисплее, только в дисплее есть информация о товаре. в общем, нужно сделать что-то типа рулезовского load entity by property, но как?
лучше смотреть в сторону API commerc'a
в общем не придумал ничего умнее чем следующий костыль:
сделал вьюху (не мудрствуя - клон от commerce_cart_form) обозвал small_cart_image_slider
в нее связями фото товара (оно у меня именно в ноде и именно оно было необходимо)
все остальное ->наф ))
сама вьюха - слайдшоу
и добавил эту радость:
.commerce_embed_view('small_cart_image_slider', 'default', array($order->order_id), 'cart');
к своему кастомному блоку корзины
в хуке block_view
к выводу после всего что там уже есть)) то бишь в
$block['content']
ибо не сниппет у меня а блок, однако логика работы весьма похожа.
Niklan, заметил, что если корзина пуста, то так и не выводится надпись "Ваша корзина пуста" (зарегенный юзверь). Глубже копнул - заметил, что с анонимусами она как раз только и выводит эту фразу, даже если в корзинке что-то лежит.
Так вроде работает как надо (только важно не забывать про t('')).
<?phpfunction simple_commerce_cart() {
global $user;
$order = commerce_cart_order_load($user->uid);
if (!$order || empty($order->commerce_line_items)) {
print 'Пусто';
}
else {
$wrapper = entity_metadata_wrapper('commerce_order', $order);
$line_items = $wrapper->commerce_line_items;
$total = commerce_line_items_total($line_items);
$currency = commerce_currency_load($total['currency_code']);
$quantity = commerce_line_items_quantity($line_items, commerce_product_line_item_types());
$summ = commerce_currency_format($total['amount'], $total['currency_code']);
print $quantity . ' товаров - ' . $summ;
}
}?>
а вообще это во вьюхе можно легко сделать из стандартной корзины, включив агрегацию
Немного допилил, чтобы воссияла сила русского языка.
<?phpfunction simple_commerce_cart() {
global $user;
$order = commerce_cart_order_load($user->uid);
if(!empty($order)) {
$wrapper = entity_metadata_wrapper('commerce_order', $order);
$line_items = $wrapper->commerce_line_items;
$total = commerce_line_items_total($line_items);
$currency = commerce_currency_load($total['currency_code']);
$quantity = commerce_line_items_quantity($line_items, commerce_product_line_item_types());
$summ = commerce_currency_format($total['amount'], $total['currency_code']);
static $prods=array(' товар на ', ' товара на ', ' товаров на ');
$numberLast=intval(substr(strval($quantity),-1,1));
$numberPreLast=intval(substr(strval($quantity),-2,2));
if(($numberLast==1) and ($numberPreLast!=11)){
$type=0;
}elseif((2<=$numberLast) and ($numberLast<=4)){
$type=1;
}elseif(($numberLast==0) or ((5<=$numberLast) and ($numberLast<=9)) or((11<=$numberPreLast) and ($numberPreLast<=19))){
$type=2;
}
print $quantity . $prods[$type] . $summ ;
}
else {
print "Ваша корзина пуста";
}
}?>
Добрый день. Воспользовались вашим решением по корзине. Спасибо.
Уточните, а нельзя ли переписать данный сниппет так, чтобы корзина обновлялась ajax сразу после добавления новых товаров?
Спасибо за сниппет!
Услуги по темизации и настройке commerce корзины, cart и checkout страниц
мгновенный пересчет и удаление товаров.