CMS Drupal

Особо с доставкой никогда не заморачивался и думал, что если понадобится, то уберкарт своими силами все это разрулит. Видел что в стандартный модуль входят подмодули отвечающие за это. Но на практике оказалось, что с этим есть проблемы.

Доставка в моем случае расчитывалась исходя из общего веса заказанных товаров, при чем не зависимо от адреса доставки. Стоимость высчитывалась не за каждый килограмм, а по таблице, т.е. если общий вес от 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.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <1c7>, <drupal5>, <drupal6>, <javascript>, <php>. Beside the tag style "<foo>" it is also possible to use "[foo]".