Как узнать количество товаров в корзине (Ubercart)?
Прислано: ddj
чт, 02/09/2010 - 13:46
Всех приветствую!
Решил поделиться одной мелкой премудростью, которую я постиг, копая Друпал методом "научного тыка".
Недавно делал интернет магазин, и передо мной стала задача: вывести в блок корзину. Фишка задачи в том, что стандартный блок корзины от Ubercart не подойдет (см. вложение).
Конечно, можно было создать отдельный файл шаблона, в котором темизировать стандартный блок корзины, но мне это было не нужно. Поступил проще: создал отдельный блок. Ну, реализация заголовка с нужным стилем не составила труда.
Чтобы вывести количество товаров в корзине, пришлось немного поворошить файл uc_cart.module (находится в modules/ubercart/uc_cart/ ). В итоге нашел выражение count(uc_cart_get_contents()), которое и помогло вычислить количество положенных в корзину товаров. Вставил в содержимое блока код:
<?php echo count(uc_cart_get_contents()) ?>
(не забываем элементарного - поставить "Формат ввода" в блоке на "PHP code")
Оформил сопутствующие детали, и получилось очень даже ничего ;-)
По поводу ссылки на страницу оформления заказа оказалось совсем просто: вот она http://сайт.ru/cart/checkout
Ну вот и все. Надеюсь, кому-нибудь этот пост пригодится.
Спасибо за внимание!
| Прикрепленный файл | Размер |
|---|---|
| korzina.jpg | 47.39 кб |
Register or login to poll
Results:
Да: 3 голоса
Немного: 5 голосов
Нет: 5 голосов
- ddj's blog
- Для комментирования войдите или зарегистрируйтесь
Ваше решение не учитывает того факта, что одного товара в корзине может быть несколько штук.
Правильнее было бы вот так:
<?php
$items = uc_cart_get_contents();
$item_count = 0;
foreach ($items as $item) $item_count += $item->qty;
?>- Для комментирования войдите или зарегистрируйтесь
uc_cart_get_contents() - это ПОЛНАЯ загрузка корзины, то естьв ыпоняется node_load для каждого продукта в корзине. А это десятки запростов.
Все можно сделать одним:
$cid = (string) uc_cart_get_id();
$count = db_result(db_query("SELECT SUM(qty) FROM {uc_cart_products} WHERE cart_id = '%s'", $cid);
- Для комментирования войдите или зарегистрируйтесь
О, я всегда пользовался способом с uc_cart_get_contents, но про кол-во запросов интересно
<?php
$cid = (string) uc_cart_get_id();
$count = db_result(db_query("SELECT SUM(qty) FROM {uc_cart_products} WHERE cart_id = '%s'", $cid);
?>Сюда бы ещё JOIN, чтобы брать сразу и сумму корзины :)
- Для комментирования войдите или зарегистрируйтесь
ну если есть атрибуты, влияющие на цену, то джойном не обойтись)
- Для комментирования войдите или зарегистрируйтесь
Подскажите, а если нет атрибутов у товара, как вывести итоговую сумму (цену)?
И еще один вопрос...как сделать если срабатывает свойство overflow у div, то ширина одна, а если не срабатывает, то другая!?
Извиняюсь за наглость...:)
- Для комментирования войдите или зарегистрируйтесь
и не только аттрибуты, а также модули-модификаторы цены
- Для комментирования войдите или зарегистрируйтесь
Уважаемые спецы, всем спасибо за советы. Как видим, возможностей тут куча ;-)
- Для комментирования войдите или зарегистрируйтесь
ну кто-нить подскажет???
- Для комментирования войдите или зарегистрируйтесь
подскажет что? надо пользоваться уберкартовскими функциями - тогда все будет правильно
- Для комментирования войдите или зарегистрируйтесь
я извиняюсь за наглость но ВЫ такой умный!! А если необходимо вывести в отдельный блок ( с помощью views) еще не завершенный заказ... а только то что покупатель заказал в корзине...на странице checkout! как раз там и нужно вывести общую сумму корзины...и цену каждой модели товара в отдельности (с учетом кол-ва)?? КАК ЭТО СДЕЛАТЬ ИСПОЛЬЗУЯ БАЗУ??
- Для комментирования войдите или зарегистрируйтесь
А если необходимо вывести в отдельный блок ( с помощью views)
Ответ в вопросе: это можно сделать видами, толь поставить ещё uc_views
- Для комментирования войдите или зарегистрируйтесь
uc_views - можно вывести законченные заказы...а заказы еще не законченные нельзя...ну или я чет не доглядел...но по мне так нельзя...а особенно с помощью views нельзя вывести кнопку checkout! Или я не прав?
- Для комментирования войдите или зарегистрируйтесь
что мешает открыть исходники uc_cart и посмотреть куда и как сохраняются выбранные товары?
точнее сохраняются то они в таблицу uc_cart_products, а вот идентификатор корзины крнкретного пользователя совпадает с uid для зарегестрированных пользователей (uc_cart_get_id)
но обращаться напряму к таблице - это неправильно, надо использовать функции. и пофик что оно там загружает ноды целиком.
саму кнопку checkout можно имитировать ссылкой + ccs, либо найти форму в которой есть только кнопка checkout (или взять другую форму и выкинуть все лишнее unset'ом) а потом вывести ее куда угодно через drupal_get_form()
- Для комментирования войдите или зарегистрируйтесь
а если заказ оформляет незарегистррированный пользователь?
на самом деле, хотел узнать...возможно ли вывести собственый расчет (если пользователь выбирает товар и кол-во, допустим, 2 шт., выводить цену товара помноженную на кол-во) и все это сделать с помощью views...т.е. выводить sell_price*qty? Это реально?
- Для комментирования войдите или зарегистрируйтесь
если незареганый пользователь то у него cart_id вычисляется как md5(ололо) и тоже сохраняется в таблицу
я честно говоря не понимаю зачем вам вообще views, вам же надо сделать где то в углу сайта типа "Вы выбрали товара уже на XXX рублей" ? ну так и сделайте php-блок например в котором считать как сказал Stutzer
- Для комментирования войдите или зарегистрируйтесь
там считает только кол-во товаров...а мне надо вывести сумму!!
- Для комментирования войдите или зарегистрируйтесь
ну так умножьте кол-во на цену
<?php
$items = uc_cart_get_contents();
$item_price = 0;
foreach ($items as $item) $item_price += ($item->qty * $item->price);
?>- Для комментирования войдите или зарегистрируйтесь
Спасибо! Я просто не особо php-развитый!:))
Подскажите, а как вывести цену отдельного товара...т.е. цену товара умноженную на кол-во!
Я просто пытаюсь использовать views на странице checkout вместо стандартного вывода уберкарта! Если использовать код выше то он просто выводит итоговую сумму...а как подогнать для отдельно взятого товара?
Спасибо!
- Для комментирования войдите или зарегистрируйтесь
uc_views - можно вывести законченные заказы...а заказы еще не законченные нельзя...
Ваша неправда. Выводит даже те товары, которые попали на страницу чекаута. Там есть поле "Состояние заказа"
- Для комментирования войдите или зарегистрируйтесь
Я проверил уже в пятый раз...выбрав поле в фильтрах order status: in checkout (состояние заказа: чекаут) - отображаються товары которые были завершенны (то есть пользователь их отправил админу грубо говоря), а так чтобы после корзины просмотреть свои заказы на странице checkout нельзя!!
Или есть другие способы?
- Для комментирования войдите или зарегистрируйтесь
Вот только что посмотрел свою вьюху. У меня фильтр развёрнутый, но я думаю не суть важно
Выводится корректно любое состояние и in checkout в том числе
Вы наверное несколько неправильно понимаете in checkout
Состояние in checkout наступает тогда, когда юзер заполнил свои данные и как минимум прошёл сюда cart/checkout/review
- Для комментирования войдите или зарегистрируйтесь
Я все прекрасно понимаю...но я делаю сайт без страницы ревью! Возможно можно как то обойти эти сложности....я использую также модуль uc_webform, который создает опросник на странице checkout!! Как сделать?? Извиняюсь если грубо пишу..:))
- Для комментирования войдите или зарегистрируйтесь
Есть модуль Microcart Block который выводит цену и количество в корзине.
Как в нем сделать, чтоы выводил русским словом "Количество", а не "Items"?
- Для комментирования войдите или зарегистрируйтесь
Есть модуль Microcart Block
Гы, модуль на такой чих. Куда катится мир
- Для комментирования войдите или зарегистрируйтесь
Есть модуль Microcart Block
Гы, модуль на такой чих. Куда катится мир
Ну не знаю я php и sql.
А какой тогда для меня выход?
- Для комментирования войдите или зарегистрируйтесь






Комментарии