Virtuemart - Бесплатная доставка

Исходные условия:

  • Joomla 1.5.25
  • Virtuemart 1.1.7a (но и в 1.1.9 тоже самое)

Ну это просто. Идем в настройки: Администрирование ⇒ Магазин ⇒ Список модулей доставки. Интересует «shipvalue». Нажимаем «Настроить вариант доставки», заполняем поля «Стоимость заказа» и «Стоимость доставки».

Например: бесплатная доставка от 2200, иначе 299 руб.

Стоимость заказа Стоимость доставки
2199 299
2200 0

Далее необходимо включить этот вариант доставки: Администрирование ⇒ Настройки ⇒ Настройки ⇒ Доставка и ставим галочку на «Фиксированный тариф, на основе введенных данных.»

Все.

Нет такой возможности в штатной поставке Virtuemart. Надо пилить.

Администрирование ⇒ Магазин ⇒ Добавить способ оплаты. Создаем, задаем необходимые параметры.

Теперь нужно узнать идентификатор нашего способа оплаты (payment_method_id). Можно либо навести курсор мыши на ссылку и подсмотреть его, либо открыть наш созданный способ оплаты и посмотреть payment_method_id в адресной строке браузера.

Добавляем описание в языковой файл

Редактируем файл /administrator/components/com_virtuemart/languages/checkout/russian.php - добавляем строку

'PHPSHOP_CHECKOUT_PREDOPLATA' => 'Бесплатная доставка по предоплате',

Не забыть про запятую в конце строки!

Изменяем подсчет суммы доставки, заносимая в базу заказов

Редактируем файл /administrator/components/com_virtuemart/classes/ps_checkout.php

Заменяем строки

// Get the IP Address
		if (!empty($_SERVER['REMOTE_ADDR'])) {
			$ip = $_SERVER['REMOTE_ADDR'];
		}
		else {
			$ip = 'unknown';
		}
 
		// Collect all fields and values to store them!
		$fields = array(
			'user_id' => $auth["user_id"], 
			'vendor_id' => $ps_vendor_id,

на

// Get the IP Address
		if (!empty($_SERVER['REMOTE_ADDR'])) {
			$ip = $_SERVER['REMOTE_ADDR'];
		}
		else {
			$ip = 'unknown';
		}
 
		// Begin hack for prepaid
		if ( vmGet( $_REQUEST, 'payment_method_id') == NN && $order_subtotal > SUMMA ) {
		    $order_shipping = 0;
		    $order_total = $order_subtotal;
		}
		// End hack for prepaid
 
		// Collect all fields and values to store them!
		$fields = array(
			'user_id' => $auth["user_id"], 
			'vendor_id' => $ps_vendor_id,

Где NN - идентификатор нашего метода оплаты (payment_method_id), а SUMMA - сумма, выше которой посылка не будет оплачиваться покупателем.

Изменяем подсчет суммы доставки, отображающейся при оформлении заказа

Редактируем файл /administrator/components/com_virtuemart/html/ro_basket.php

После строк

else {
		$shipping_total = 0;
		$shipping_display = "";
	}

добавляем

// Begin hack for prepaid
if ( $payment_method_id == NN && $subtotal > SUMMA ) {
   $shipping_total = 0;
   $shipping_display = $GLOBALS['CURRENCY_DISPLAY']->getFullValue($shipping_total);
}
// End hack for prepaid

Где NN - идентификатор нашего метода оплаты (payment_method_id), а SUMMA - сумма, выше которой посылка не будет оплачиваться покупателем.

Изменяем уведомление пользователя о доставке

Редактируем файл шаблона /components/com_virtuemart/themes/default/templates/checkout/get_final_confirmation.tpl.php

Если шаблон не default - соответственно выбираем нужный.

Заменяем кусочек кода

// Print out the Selected Shipping Method
if(!ps_checkout::noShippingMethodNecessary()) {
 
	echo '<tr><td valign="top"><strong>'.$VM_LANG->_('PHPSHOP_INFO_MSG_SHIPPING_METHOD') . ":</strong></td>";
	$rate_details = explode( "|", urldecode(urldecode(vmGet($_REQUEST,'shipping_rate_id'))) );
	echo '<td>';
	foreach( $rate_details as $k => $v ) {
		// thepisu: old sample data cointaned "&gt;" instead of ">"... 
		// so we don't have to make safe if "&gt;" is found
		if (strpos($v,"&gt;")===false) {
			$v = shopMakeHtmlSafe($v);
		}
		if( $k == 3 ) {
			echo $CURRENCY_DISPLAY->getFullValue( $v )."; ";
		} elseif( $k > 0 && $k < 4) {
			echo $v.'; ';
		}
	}
	echo "</td></tr>";
}

на

// Print out the Selected Shipping Method
if(!ps_checkout::noShippingMethodNecessary()) {
 
	echo '<tr><td valign="top"><strong>'.$VM_LANG->_('PHPSHOP_INFO_MSG_SHIPPING_METHOD') . ": </strong></td>";
	$rate_details = explode( "|", urldecode(urldecode(vmGet($_REQUEST,'shipping_rate_id'))) );
	echo '<td>';
// Begin of hack for prepaid
	if ( $payment_method_id == NN && $GLOBALS['subtotal'] > SUMMA ) {
		echo $VM_LANG->_('PHPSHOP_CHECKOUT_PREDOPLATA');
	    }
	    else {
// end hack for prepaid
		foreach( $rate_details as $k => $v ) {
		    // thepisu: old sample data cointaned "&gt;" instead of ">"... 
		    // so we don't have to make safe if "&gt;" is found
		    if (strpos($v,"&gt;")===false) {
			$v = shopMakeHtmlSafe($v);
		    }
		    if( $k == 3 ) {
			echo $CURRENCY_DISPLAY->getFullValue( $v )."; ";
		    } elseif( $k > 0 && $k < 4) {
			echo $v.'; ';
		    }
		}
	    } // Needed for hack for prepaid
	echo "</td></tr>";
}

Где NN - идентификатор нашего метода оплаты (payment_method_id), а SUMMA - сумма, выше которой посылка не будет оплачиваться покупателем.

  • software/virtuemart/hacks/dostavka-feefree.txt
  • Последнее изменение: 2017/05/09 18:34
  • 127.0.0.1