Долго искал решение этого вопроса, пробывал ставить по весу, то бишь цена = весу и в стандартном модуле доставки определять стоимость по весу, но эта связка как то не заработала.
Нашел решение на иностранном форуме вот прямая ссылка
http://forum.virtuemart.net/index.php?topic=43248.0 там написано как сделать для VirtueMart 1.0.15 и 1.1.2
У меня стоит Joomla 1.5.9 и VirtueMart 1.1.3 там несколько по-другому делается (различие только в редактировании одного файла ps_shipping.php).
Жирным выделены добавления!. Номер строки означает примерное место внесения изменений :
Перед проделыванием всех нижеперечисленных операций сделайте полный бекап сайта и базы!1. Делаем sql запрос в базе данных:
......................................................
ALTER TABLE `jos_vm_shipping_rate` ADD `shipping_rate_minimum_cost` DECIMAL( 10, 2 ) DEFAULT '0.00' NOT NULL AFTER `shipping_rate_weight_end` ;
ALTER TABLE `jos_vm_shipping_rate` ADD `shipping_rate_maximum_cost` DECIMAL( 10, 2 ) DEFAULT '0.00' NOT NULL AFTER `shipping_rate_minimum_cost` ;
......................................................
2. Добавляем значения в файле с русским языком
/administrator/components/com_virtuemart/languages/shipping/russian.php
......................................................
Строка 39
'PHPSHOP_RATE_FORM_WEIGHT_START' => 'Минимальный вес',
'PHPSHOP_RATE_FORM_WEIGHT_END' => 'Максимальный вес',
'PHPSHOP_RATE_FORM_MINIMUM_COST' => 'Минимальная стоимость для доставки',
'PHPSHOP_RATE_FORM_MAXIMUM_COST' => 'Максимальная стоимость для доставки',......................................................
3. Добавляем значения в файле с русским языком
/administrator/components/com_virtuemart/languages/common/russian.php
......................................................
Строка 287
'PHPSHOP_ERR_MSG_RATE_WEIGHT_START_REQ' => 'ОШИБКА: Не указан минимальный вес.',
'PHPSHOP_ERR_MSG_RATE_WEIGHT_END_REQ' => 'ОШИБКА: Не указан максимальный вес.',
'PHPSHOP_ERR_MSG_MINIMUM_COST' => 'ОШИБКА: Не указана минимальная сумма заказа.',
'PHPSHOP_ERR_MSG_MAXIMUM_COST' => 'ОШИБКА: Не указана максимальная сумма заказа.',
'PHPSHOP_ERR_MSG_COST_INV' => 'ОШИБКА: Минимальная сумма должена быть меньше, чем максимальная', 'PHPSHOP_ERR_MSG_RATE_WEIGHT_STARTEND_INV' => 'ОШИБКА: Минимальный вес должен быть меньше, чем максимальный',
......................................................
4. /administrator/components/com_virtuemart/html/shipping.rate_list.php
......................................................
Строка 61
"<input type=\"checkbox\" name=\"toggle\" value=\"\" onclick=\"checkAll(".$num_rows.")\" />" => "width=\"20\"",
$VM_LANG->_('PHPSHOP_SHIPPING_RATE_LIST_CARRIER_LBL') => '',
$VM_LANG->_('PHPSHOP_SHIPPING_RATE_LIST_RATE_NAME') => '',
$VM_LANG->_('PHPSHOP_SHIPPING_RATE_LIST_RATE_WSTART') => '',
$VM_LANG->_('PHPSHOP_SHIPPING_RATE_LIST_RATE_WEND') => '',
$VM_LANG->_('PHPSHOP_RATE_FORM_MINIMUM_COST') => '',
$VM_LANG->_('PHPSHOP_RATE_FORM_MAXIMUM_COST') => '', $VM_LANG->_('E_REMOVE') => "width=\"5%\""
......................................................
Строка 92
$tmp_cell = "<a href=\"" . $sess->url($url). "\">". $db->f("shipping_rate_name")."</a>";
$listObj->addCell( $tmp_cell );
$listObj->addCell( $db->f("shipping_rate_weight_start"));
$listObj->addCell( $db->f("shipping_rate_weight_end"));
$listObj->addCell( $db->f("shipping_rate_minimum_cost"));
$listObj->addCell( $db->f("shipping_rate_maximum_cost"));......................................................
5. /administrator/components/com_virtuemart/html/shipping.rate_form.php
......................................................
Строка 93
<tr>
<td width="21%" ><div align="right"><strong><?php echo $VM_LANG->_('PHPSHOP_RATE_FORM_PACKAGE_FEE')?>:</strong></div></td>
<td width="79%" >
<input type="text" class="inputbox" name="shipping_rate_package_fee" size="32" maxlength="255" value="<?php $db->sp("shipping_rate_package_fee")?>">
</td>
</tr>
<!-- // Added To Standard Shipping Module ######--->
<tr>
<td width="21%" ><div align="right"><strong><?php echo $VM_LANG->_('PHPSHOP_RATE_FORM_MINIMUM_COST')?>:</strong></div></td>
<td width="79%" >
<input type="text" class="inputbox" name="shipping_rate_minimum_cost" size="32" maxlength="255" value="<?php $db->sp("shipping_rate_minimum_cost")?>">
</td>
</tr>
<tr>
<td width="21%" ><div align="right"><strong><?php echo $VM_LANG->_('PHPSHOP_RATE_FORM_MAXIMUM_COST')?>:</strong></div></td>
<td width="79%" >
<input type="text" class="inputbox" name="shipping_rate_maximum_cost" size="32" maxlength="255" value="<?php $db->sp("shipping_rate_maximum_cost")?>">
</td>
</tr>
<!--// Added To Standard Shipping Module ######-->......................................................
6. /administrator/components/com_virtuemart/classes/ps_shipping.php
......................................................
Строка 289
if ($d["shipping_rate_weight_start"] == "") {
$d["error"] = $VM_LANG->_('PHPSHOP_ERR_MSG_RATE_WEIGHT_START_REQ');
return False;
}
if ($d["shipping_rate_weight_end"] == "") {
$d["error"] = $VM_LANG->_('PHPSHOP_ERR_MSG_RATE_WEIGHT_END_REQ');
return False;
}
if ($d["shipping_rate_minimum_cost"] == "") {
$d["error"] = $VM_LANG->_('PHPSHOP_ERR_MSG_MINIMUM_COST');
return False;
}
if ($d["shipping_rate_maximum_cost"] == "") {
$d["error"] = $VM_LANG->_('PHPSHOP_ERR_MSG_MAXIMUM_COST');
return False;
}…………………………………………………………………………………………………………
Строка 309
if ($d["shipping_rate_weight_start"] >= $d["shipping_rate_weight_end"]) {
$d["error"] = $VM_LANG->_('PHPSHOP_ERR_MSG_RATE_WEIGHT_STARTEND_INV');
return False;
}
if ($d["shipping_rate_minimum_cost"] >= $d["shipping_rate_maximum_cost"]) {
$d["error"] = $VM_LANG->_('PHPSHOP_ERR_MSG_COST_INV');
return False;
}............................................................
Строка 378
**************************************************************************/
function rate_add(&$d) {
$db = new ps_DB;
$timestamp = time();
if (!$this->validate_rate_add($d)) {
return False;
}
$country_str = "";
if(!empty($d["shipping_rate_country"])) {
for($i=0;$i<count($d["shipping_rate_country"]);$i++){
if ($d["shipping_rate_country"][$i] != "") {
$country_str .= $d["shipping_rate_country"][$i] . ";";
}
}
chop($country_str,";");
}
$fields = array('shipping_rate_name' => vmGet($d, 'shipping_rate_name'),
'shipping_rate_carrier_id' => (int) vmGet($d, 'shipping_rate_carrier_id'),
'shipping_rate_country' => $country_str,
'shipping_rate_zip_start' => vmGet($d, 'shipping_rate_zip_start'),
'shipping_rate_zip_end' => vmGet($d, 'shipping_rate_zip_end'),
'shipping_rate_weight_start' => vmGet($d, 'shipping_rate_weight_start'),
'shipping_rate_weight_end' => vmGet($d, 'shipping_rate_weight_end'),
'shipping_rate_minimum_cost' => vmGet($d, 'shipping_rate_minimum_cost'),
'shipping_rate_maximum_cost' => vmGet($d, 'shipping_rate_maximum_cost'), 'shipping_rate_value' => vmGet($d, 'shipping_rate_value'),
'shipping_rate_package_fee' => vmGet($d, 'shipping_rate_package_fee'),
'shipping_rate_currency_id' => vmGet($d, 'shipping_rate_currency_id'),
'shipping_rate_vat_id' => vmGet($d, 'shipping_rate_vat_id'),
'shipping_rate_list_order' => (int) vmGet($d, 'shipping_rate_list_order'));
$db->buildQuery('INSERT', '#__{vm}_shipping_rate', $fields );
.................................................................
Строка 420
function rate_update(&$d) {
$db = new ps_DB;
if( !$this->validate_rate_add($d)) return false;
$country_str = "";
if(!empty($d["shipping_rate_country"])) {
for($i=0;$i<count($d["shipping_rate_country"]);$i++){
if ($d["shipping_rate_country"][$i] != "") {
$country_str .= $d["shipping_rate_country"][$i] . ";";
}
}
chop($country_str,";");
}
$fields = array('shipping_rate_name' => vmGet($d, 'shipping_rate_name'),
'shipping_rate_carrier_id' => (int) vmGet($d, 'shipping_rate_carrier_id'),
'shipping_rate_country' => $country_str,
'shipping_rate_zip_start' => vmGet($d, 'shipping_rate_zip_start'),
'shipping_rate_zip_end' => vmGet($d, 'shipping_rate_zip_end'),
'shipping_rate_weight_start' => vmGet($d, 'shipping_rate_weight_start'),
'shipping_rate_weight_end' => vmGet($d, 'shipping_rate_weight_end'),
'shipping_rate_minimum_cost' => vmGet($d, 'shipping_rate_minimum_cost'),
'shipping_rate_maximum_cost' => vmGet($d, 'shipping_rate_maximum_cost'), 'shipping_rate_value' => vmGet($d, 'shipping_rate_value'),
'shipping_rate_package_fee' => vmGet($d, 'shipping_rate_package_fee'),
'shipping_rate_currency_id' => vmGet($d, 'shipping_rate_currency_id'),
'shipping_rate_vat_id' => vmGet($d, 'shipping_rate_vat_id'),
'shipping_rate_list_order' => (int) vmGet($d, 'shipping_rate_list_order'));
$db->buildQuery('UPDATE', '#__{vm}_shipping_rate', $fields, ' WHERE shipping_rate_id=' .(int)$d["shipping_rate_id"] );
......................................................
7. /administrator/components/com_virtuemart/classes/shipping/standard_shipping.php
......................................................
Строка 28
function list_rates( &$d ) {
global
$total, $tax_total, $VM_LANG, $CURRENCY_DISPLAY, $vmLogger ;
$auth = $_SESSION["auth"] ;
Строка 31
//GET PRICE
if ( $_SESSION['auth']['show_price_including_tax'] != 1 ) {
$taxrate = 1;
$order_total = $total + $tax_total;
}
else {
$taxrate = $this->get_tax_rate() + 1;
$order_total = $total;
}
//END GET PRICE………………………………………………………………………..
Строка 76
if( is_numeric( $zip ) ) {
$q .= "(shipping_rate_zip_start <= '" . $zip . "' OR LENGTH(shipping_rate_zip_start) = 0 ) AND " ;
$q .= "(shipping_rate_zip_end >= '" . $zip . "' OR LENGTH(shipping_rate_zip_end) = 0 ) AND " ;
}
$q .= "shipping_rate_minimum_cost <= '" . $order_total . "'AND ";
$q .= "shipping_rate_maximum_cost >= '" . $order_total . "'AND ";......................................................
После этого спокойно настраиваете стандартный модуль доставки по Вашим значениям (на всякий случай ставьте максимальный размер веса в тарифах жоставки, чтоб не было осложнений
)
Очень важна также правильная настройка тарифов. У меня работает при сумме заказа до 3000р и свыше 3000р. и ничего не исчезает.
Прилагаю скрин своих тарифов:
Доставка по Екатеринбургу (менее 3000 руб.)
Доставка по Екатеринбургу (свыше 3000 руб.) картинка posle_3000.JPG
К сожалению картинки не смог на форуме закрепить, пришлось использовать сторонний сервис. Надеюсь админы потом пересохранят.
Надеюсь всем помог.