Доставка только для определенной группы пользователей

2014-01-20
4.7 / 5 (6 votes)

Сегодня дорабатываем магазин на joomla + virtruemart. 

Задача: Требуется, чтобы при оформлении заказа пункт доставки "самовывоз" был доступен только пользователям со статусом GOLD. Ну что ж приступим :)

 

Редактироваться будут файлы:

administrator\components\com_virtuemart\html\shipping.rate_form.php
administrator\components\com_virtuemart\classes\ps_shipping.php
administrator\components\com_virtuemart\classes\shipping\standard_shipping.php

1. Редактируем административную часть

1.1 Добавляем новое поле в базу данных

ALTER TABLE `defis_vm_shipping_rate` ADD `shopper_group_id` INT NOT NULL ;

1.2 Добавляем выпадающий select с группой покупателей в тариф доставки, файл shipping.rate_form.php

  <tr class="row1">
		<td><div align="right"><strong>Группа покупателей: </strong><?php  echo vmToolTip('Если выбрать группу покупателей Gold, то данный вариант доставки будет достпен только пользователям GOLD и тем, кто выше GOLD, например Wholesale'); ?></div></td>
		<td>
    <?php
            include_class('shopper');
            $sg_id = $ps_shopper_group->get_shoppergroup_by_id($db->f("user_id"));
            echo ps_shopper_group::list_shopper_groups("shopper_group_id",$db->f("shopper_group_id"));?>
    </td>
	</tr>

 1.3 Добавляем обработку данного поля в момент создания, редактирования тарифа доставки, файл ps_shipping.php (функции rate_add, rate_update)

	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_desc' => vmRequest::getVar('shipping_rate_desc', '', 'default', '', VMREQUEST_ALLOWHTML),
									'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_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'),
									'shopper_group_id' => (int)vmGet($d, 'shopper_group_id'));
		$db->buildQuery('INSERT', '#__{vm}_shipping_rate', $fields );
		$db->query();
		$_REQUEST['shipping_rate_id'] = $db->last_insert_id();
		return True;
	}

	/**************************************************************************
	* name: rate_update()
	* created by: Ekkehard Domning
	* description: updates a rate entry
	* parameters:
	* returns:
	**************************************************************************/
	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_desc' => vmRequest::getVar('shipping_rate_desc', '', 'default', '', VMREQUEST_ALLOWHTML),
									'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_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'),
                  'shopper_group_id' => (int)vmGet($d, 'shopper_group_id'));
							
		$db->buildQuery('UPDATE', '#__{vm}_shipping_rate', $fields, ' WHERE shipping_rate_id=' .(int)$d["shipping_rate_id"] );
		$db->query();
		
		return True;
	}

 2. Редактируем пользовательскую часть, файл standard_shipping.php

// THE ORDER OF THOSE VALUES IS IMPORTANT:
				// ShippingClassName|carrier_name|rate_name|totalshippingcosts|rate_id
				$shipping_rate_id = urlencode( __CLASS__ . "|" . $dbc->f( "shipping_carrier_name" ) . "|" . $dbr->f( "shipping_rate_name" ) . "|" . number_format( $total_shipping_handling, 2, '.', '' ) . "|" . $dbr->f( "shipping_rate_id" ) ) ;
				
				$_SESSION[$shipping_rate_id] = 1 ;
        
				if ($_SESSION['auth']['shopper_group_id'] >= $dbr->f( "shopper_group_id" )) {
          $html .= "<li>
                    <input type=\"radio\" id=\"shipping_rate_id_ss_" . $dbr->f( "shipping_rate_id" ) . "\" name=\"shipping_rate_id\" value=\"" . $shipping_rate_id . "\" " ;
          
          if( ! $selected ) {
            $selected = True ;
            $html .= "checked=\"checked\"" ;
          }
          $html .= " />" ;
          $html .= "<label for=\"shipping_rate_id_ss_" . $dbr->f( "shipping_rate_id" ) . "\">" . $dbr->f( "shipping_rate_name" ) ;
          $html .= ' &mdash; <strong>'.$show_shipping_handling . '</strong></label>';
          $html .= '<div class="vm-method-shipping-d">'.$dbr->f( "shipping_rate_desc" ).'</div>';
          $html .= '</li>'."\n";
        } //end add

 Ниже представлены отредактированные файлы, а также принтскрины.

Read 1981 times Last modified on 2019-07-21

Leave a comment

Make sure you enter the (*) required information where indicated. HTML code is not allowed.