Особо с доставкой никогда не заморачивался и думал, что если понадобится, то уберкарт своими силами все это разрулит. Видел что в стандартный модуль входят подмодули отвечающие за это. Но на практике оказалось, что с этим есть проблемы.
Доставка в моем случае расчитывалась исходя из общего веса заказанных товаров, при чем не зависимо от адреса доставки. Стоимость высчитывалась не за каждый килограмм, а по таблице, т.е. если общий вес от n до n1, то одна цена, если от n1 до n2, то другая и т.д. В стандартных модулях уберкарта такого нет, но есть модуль uc_tablequote, которым я и воспользовался. Установил, загрузил вес товаров в килограммах, задал диапазоны цен и стал смотреть что получается. Долго бился и никак не мог понять как же считается стоимость доставки. Полез в код и понял, что оказывается вес округляется до целых единиц, а у меня вес товара может быть меньше килограмма. Изрыл весь интернет и ничего толкового не нашел, как можно заставить любить не целые веса. Есть даже модуль для этого дела uc_decimal_quantities, но после его установки я сразу получил ошибку и не стал разбираться - удалил.
Пришлось перевести все в граммы:
function convert_weight() { db_query("UPDATE {uc_products} SET weight = weight*1000, weight_units = 'g' WHERE weight_units = 'kg'"); return "OK"; }
Дальше стал смотреть. Хотел, чтобы стоимость доставки была видна в корзине и при пересчете количества соответственно пересчитывалась и стоимость доставки. В настройках корзины конечно есть такая галка, но у меня использовался uc_ajax_cart и при пересчете та часть, которая отвечает за пересчет доставки просто исчезает. Пришлось отказаться от вывода стоимости доставки в корзине.
Теперь стоимость доставки видно при оформлении заказа и расчет происходит верно. Но хотелось бы увидеть общий вес заказа. С этим тоже проблема, нигде не нашел как можно это вывести. Пришлось хакать модуль uc_tablequote.
И еще мне не понравилась у этого же модуля табличка в которой вводится диапазон весов. Не совсем понятно что делать с граничными цифрами, они же не должны вроде как пересекаться, а тогда вбивать их не удобно. Поэтому пришлось внести еще небольшие поправки, чтобы диапазон можно было вводить n1-n2, n2-n3 не заморачиваясь над тем, что и в том и в другом случае есть n2. Взят будет первый минимальный диапазон, в котором встречается n2. Окончательный вариант исправлений uc_tablequote.module:
function uc_tablequote_quote($products, $details) { .... $rate = 0; $found = FALSE; $result = db_query("SELECT * FROM {uc_tablequote} ORDER BY min"); while ($r = db_fetch_object($result)) { if (($total >= $r->min) && ($total <= $r->max)) { $rate = $r->rate; $found = TRUE; break; } } $option_label = "Стоимость доставки за ".$total."г. товара"; $method = uc_tablequote_shipping_method(); $quotes = array(); if ($found) { $quotes[] = array('rate' => $rate, 'format' => uc_currency_format($rate), 'option_label' => $option_label); } return $quotes; }
Вот так более-менее получается то, что надо. Хотя если бы сумму доставки было видно в корзине, то было бы, конечно, удобнее. Но там сильнее надо репу чесать, особенно с учетом uc_ajax_cart.
Отправить комментарий