Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Продажа товара оптом в пачках


Recommended Posts

Подскажите как реализовать такое:

Есть товар, который отпускается оптом в пачках. В пачке может быть 5, 10, 15 и 20 единиц продукции.

Цены по магазину указаны за единицу, дабы не шокировать клиентов :rolleyes:

Надо чтобы товар добавленный в корзину, автоматически считался как за пачку и умножался на 5, 10, 15 или 20.

При чем чтобы множитель пачки товара можно было задавать из админки в карточке товара.

Как такое сделать практически?

Link to comment
Share on other sites


если знаком с php/mysql/html то подскажу где что искать, если нет - то со столь специфичным заданием ответ лучше искать в разделе платных услуг)

Link to comment
Share on other sites


если знаком с php/mysql/html то подскажу где что искать, если нет - то со столь специфичным заданием ответ лучше искать в разделе платных услуг)

Знание на уровне основ есть.

Подскажите пожалуйста, только доходчиво :rolleyes:

Link to comment
Share on other sites


глянул сейчас свое старенькое решение которое делал на farmatek.ru (оказалось не так уж и сложно как показалось)

вообщем примерно так было дело:

чтоб не плодить лишних полей в базе я для определения количества в пачке использовал поле SKU (в редактировании товара оно есть) и на основе его собственно и делал

в ..\controller\product\product.php

добавил

$this->data['sku'] = $product_info['sku'];

в product.tpl

рядом со строчкой

<input type="text" name="quantity" size="3" value="1" />
добавил

<?php if ($sku) {echo ' x '.$sku;} ?>
так сказать для информативности

и чуть ниже

<input type="hidden" name="sku" value="<? echo $sku; ?>" />
будем передавать информацию при добавлении в корзину о том сколько в пачке штук

теперь идем в ..\controller\module\cart.php

в функции callback() меняем

$this->cart->add($this->request->post['product_id'], $this->request->post['quantity'], $option);
на

if ($this->request->post['sku']) {
	$sku = $this->request->post['sku'];
} else {
	$sku = 1;
}
$this->cart->add($this->request->post['product_id'], $this->request->post['quantity']*$sku, $option);

в ..\controller\checkout\cart.php

делаем тоже самое что и в предыдущем действии

вроде все.. теперь все товары будут улетать в корзину пачками по sku штук

здесь правда не учитывается что в корзине можно будет редактировать количество, но там дело за малым

Link to comment
Share on other sites


При добавлении товара на вкладке "Данные" есть опция "Минимальное количество".

Может быть её стоит использовать?

Link to comment
Share on other sites


Всё сделал как сказали, поле sku задействовалось - рядом с количеством значение sku выводится, но при добавлении в корзину умножение на sku не происходит... Может быть потому что у меня не стандартный модуль корзины?

Код модуль \module\cart.php в результате такой:

<?php 
class ControllerModuleCart extends Controller { 
protected function index() {
	$this->language->load('module/cart');

	$this->load->model('tool/seo_url');

   	$this->data['heading_title'] = $this->language->get('heading_title');

	$this->data['text_subtotal'] = $this->language->get('text_subtotal');
	$this->data['text_empty'] = $this->language->get('text_empty');
	$this->data['text_remove'] = $this->language->get('text_remove');
	$this->data['text_confirm'] = $this->language->get('text_confirm');
	$this->data['text_view'] = $this->language->get('text_view');
	$this->data['text_checkout'] = $this->language->get('text_checkout');

	$this->data['view'] = HTTP_SERVER . 'index.php?route=checkout/cart';
	$this->data['checkout'] = HTTPS_SERVER . 'index.php?route=checkout/shipping';

	$this->data['products'] = array();

   	foreach ($this->cart->getProducts() as $result) {
       	$option_data = array();

       	foreach ($result['option'] as $option) {
         		$option_data[] = array(
           		'name'  => $option['name'],
           		'value' => $option['value']
         		);
       	}

     		$this->data['products'][] = array(
       		'key' 		 => $result['key'],
       		'name'       => $result['name'],
			'option'     => $option_data,
       		'quantity'   => $result['quantity'],
			'stock'      => $result['stock'],
			'price'      => $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax'))),
			'href'       => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/product&product_id=' . $result['product_id']),
     		);
   	}

	if (!$this->config->get('config_customer_price')) {
		$this->data['display_price'] = TRUE;
	} elseif ($this->customer->isLogged()) {
		$this->data['display_price'] = TRUE;
	} else {
		$this->data['display_price'] = FALSE;
	}

	$total_data = array();
	$total = 0;
	$taxes = $this->cart->getTaxes();

	$this->load->model('checkout/extension');

	$sort_order = array(); 

	$results = $this->model_checkout_extension->getExtensions('total');

	foreach ($results as $key => $value) {
		$sort_order[$key] = $this->config->get($value['key'] . '_sort_order');
	}

	array_multisort($sort_order, SORT_ASC, $results);

	foreach ($results as $result) {
		$this->load->model('total/' . $result['key']);

		$this->{'model_total_' . $result['key']}->getTotal($total_data, $total, $taxes);
	}

	$sort_order = array(); 

	foreach ($total_data as $key => $value) {
     		$sort_order[$key] = $value['sort_order'];
   	}

   	array_multisort($sort_order, SORT_ASC, $total_data);

   	$this->data['totals'] = $total_data;

	$this->data['ajax'] = $this->config->get('cart_ajax');

	$this->id = 'cart';

	if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/module/cart.tpl')) {
		$this->template = $this->config->get('config_template') . '/template/module/cart.tpl';
	} else {
		$this->template = 'default/template/module/cart.tpl';
	}

	$this->render();
}

public function callback() {
	$this->language->load('module/cart');

	$this->load->model('tool/seo_url');

	unset($this->session->data['shipping_methods']);
	unset($this->session->data['shipping_method']);
	unset($this->session->data['payment_methods']);
	unset($this->session->data['payment_method']);	

	if ($this->request->server['REQUEST_METHOD'] == 'POST') {

		if (isset($this->request->post['remove'])) {
    		$result = explode('_', $this->request->post['remove']);
         		$this->cart->remove(trim($result[1]));
     		} else {
			if (isset($this->request->post['option'])) {
				$option = $this->request->post['option'];
			} else {
				$option = array();	
			}

     		if ($this->request->post['sku']) {
       $sku = $this->request->post['sku'];
} else {
       $sku = 1;
}
$this->cart->add($this->request->post['product_id'], $this->request->post['quantity']*$sku, $option);
		}
	}

	$output = '<table cellpadding="2" cellspacing="0" style="width: 100%;">';

	if ($this->cart->getProducts()) {

   		foreach ($this->cart->getProducts() as $product) {
     			$output .= '<tr>';
       		$output .= '<td width="1" valign="top" align="left"><span class="cart_remove" id="remove_ ' . $product['key'] . '" /> </span></td><td width="1" valign="top" align="right">' . $product['quantity'] . ' x </td>';
       		$output .= '<td align="left" valign="top"><a href="' . $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/product&product_id=' . $product['product_id']) . '">' . $product['name'] . '</a>';
         		$output .= '<div>';

			foreach ($product['option'] as $option) {
           		$output .= ' - <small style="color: #999;">' . $option['name'] . ' ' . $option['value'] . '</small><br />';
            }

			$output .= '</div></td>';
			$output .= '</tr>';
     		}

		$output .= '</table>';
   		$output .= '<br />';

   		$total = 0;
		$taxes = $this->cart->getTaxes();

		$this->load->model('checkout/extension');

		$sort_order = array(); 

		$view = HTTP_SERVER . 'index.php?route=checkout/cart';
		$checkout = HTTPS_SERVER . 'index.php?route=checkout/shipping';

		$results = $this->model_checkout_extension->getExtensions('total');

		foreach ($results as $key => $value) {
			$sort_order[$key] = $this->config->get($value['key'] . '_sort_order');
		}

		array_multisort($sort_order, SORT_ASC, $results);

		foreach ($results as $result) {
			$this->load->model('total/' . $result['key']);

			$this->{'model_total_' . $result['key']}->getTotal($total_data, $total, $taxes);
		}

		$sort_order = array(); 

		foreach ($total_data as $key => $value) {
     			$sort_order[$key] = $value['sort_order'];
   		}

   		array_multisort($sort_order, SORT_ASC, $total_data);

   		$output .= '<table cellpadding="0" cellspacing="0" align="right" style="display:inline-block;">';
     		foreach ($total_data as $total) {
     			$output .= '<tr>';
	        $output .= '<td align="right"><span class="cart_module_total"><b>' . $total['title'] . '</b></span></td>';
	        $output .= '<td align="right"><span class="cart_module_total">' . $total['text'] . '</span></td>';
     			$output .= '</tr>';
     		}
     		$output .= '</table>';
     		$output .= '<div style="padding-top:5px;text-align:center;clear:both;"><a href="' . $view . '">' . $this->language->get('text_view') . '</a> | <a href="' . $checkout . '">' . $this->language->get('text_checkout') . '</a></div>';
	} else {
		$output .= '<div style="text-align: center;">' . $this->language->get('text_empty') . '</div>';
	}

	$this->response->setOutput($output, $this->config->get('config_compression'));
} 	
	public function callbacktop() {
	$this->language->load('module/cart');

	$this->load->model('tool/seo_url');

	unset($this->session->data['shipping_methods']);
	unset($this->session->data['shipping_method']);
	unset($this->session->data['payment_methods']);
	unset($this->session->data['payment_method']);

	if ($this->request->server['REQUEST_METHOD'] == 'POST') {

	if (isset($this->request->post['remove'])) {
	$result = explode('_', $this->request->post['remove']);
	$this->cart->remove(trim($result[1]));
	} else {
	if (isset($this->request->post['option'])) {
	$option = $this->request->post['option'];
	} else {
	$option = array();
}

	$this->cart->add($this->request->post['product_id'], $this->request->post['quantity'], $option);
}
}

	if ($this->cart->getProducts()) {

	$total = 0;
	$taxes = $this->cart->getTaxes();

	$this->load->model('checkout/extension');

	$sort_order = array();

	$view = HTTP_SERVER . 'index.php?route=checkout/cart';
	$checkout = HTTPS_SERVER . 'index.php?route=checkout/shipping';

	$results = $this->model_checkout_extension->getExtensions('total');

	foreach ($results as $key => $value) {
	$sort_order[$key] = $this->config->get($value['key'] . '_sort_order');
}

	array_multisort($sort_order, SORT_ASC, $results);

	foreach ($results as $result) {
	$this->load->model('total/' . $result['key']);

	$this->{'model_total_' . $result['key']}->getTotal($total_data, $total, $taxes);
}

	$sort_order = array();

	foreach ($total_data as $key => $value) {
	$sort_order[$key] = $value['sort_order'];
}

	array_multisort($sort_order, SORT_ASC, $total_data);

	foreach ($total_data as $total) {}
}

	$output_mod = '<font class="top_cart_val">';
	$output_mod .= $total['text'];

	$output_mod .= '</font><br/>
	<font class="top_cart_count_text">'. $this->language->get('text_youhave_gkc') .' '.$this->cart->countProducts().' '. $this->language->get('text_items_gkc') .'.</font>';

	$this->response->setOutput($output_mod, $this->config->get('config_compression'));
	}

}
?>

А код checkout\cart.php такой:

<?php 
class ControllerCheckoutCart extends Controller {
private $error = array();

public function index() {
	$this->language->load('checkout/cart');

	if ($this->request->server['REQUEST_METHOD'] == 'GET' && isset($this->request->get['product_id'])) {

		if (isset($this->request->get['option'])) {
			$option = $this->request->get['option'];
		} else {
			$option = array();	
		}

		if (isset($this->request->get['quantity'])) {
			$quantity = $this->request->get['quantity'];
		} else {
			$quantity = 1;
		}

		unset($this->session->data['shipping_methods']);
		unset($this->session->data['shipping_method']);
		unset($this->session->data['payment_methods']);
		unset($this->session->data['payment_method']);

	if ($this->request->post['sku']) {
       $sku = $this->request->post['sku'];
} else {
       $sku = 1;
}
$this->cart->add($this->request->post['product_id'], $this->request->post['quantity']*$sku, $option);

		$this->redirect(HTTPS_SERVER . 'index.php?route=checkout/cart');

	} elseif ($this->request->server['REQUEST_METHOD'] == 'POST') {

     		if (isset($this->request->post['quantity'])) {
			if (!is_array($this->request->post['quantity'])) {
				if (isset($this->request->post['option'])) {
					$option = $this->request->post['option'];
				} else {
					$option = array();	
				}

     				$this->cart->add($this->request->post['product_id'], $this->request->post['quantity'], $option);
			} else {
				foreach ($this->request->post['quantity'] as $key => $value) {
      				$this->cart->update($key, $value);
				}
			}

			unset($this->session->data['shipping_methods']);
			unset($this->session->data['shipping_method']);
			unset($this->session->data['payment_methods']);
			unset($this->session->data['payment_method']);
     		}

     		if (isset($this->request->post['remove'])) {
    		foreach (array_keys($this->request->post['remove']) as $key) {
         			$this->cart->remove($key);
			}
     		}

		if (isset($this->request->post['redirect'])) {
			$this->session->data['redirect'] = $this->request->post['redirect'];
		}	

		if (isset($this->request->post['quantity']) || isset($this->request->post['remove'])) {
			unset($this->session->data['shipping_methods']);
			unset($this->session->data['shipping_method']);
			unset($this->session->data['payment_methods']);
			unset($this->session->data['payment_method']);	

			$this->redirect(HTTPS_SERVER . 'index.php?route=checkout/cart');
		}
   	}

   	$this->document->title = $this->language->get('heading_title');

     	$this->document->breadcrumbs = array();

     	$this->document->breadcrumbs[] = array(
       	'href'      => HTTP_SERVER . 'index.php?route=common/home',
       	'text'      => $this->language->get('text_home'),
       	'separator' => FALSE
     	); 

     	$this->document->breadcrumbs[] = array(
       	'href'      => HTTP_SERVER . 'index.php?route=checkout/cart',
       	'text'      => $this->language->get('text_basket'),
       	'separator' => $this->language->get('text_separator')
     	);

   	if ($this->cart->hasProducts()) {
     		$this->data['heading_title'] = $this->language->get('heading_title');

		$this->data['text_select'] = $this->language->get('text_select');
     		$this->data['text_sub_total'] = $this->language->get('text_sub_total');
		$this->data['text_discount'] = $this->language->get('text_discount');
		$this->data['text_weight'] = $this->language->get('text_weight');

    		$this->data['column_remove'] = $this->language->get('column_remove');
     		$this->data['column_image'] = $this->language->get('column_image');
     		$this->data['column_name'] = $this->language->get('column_name');
     		$this->data['column_model'] = $this->language->get('column_model');
     		$this->data['column_quantity'] = $this->language->get('column_quantity');
		$this->data['column_price'] = $this->language->get('column_price');
     		$this->data['column_total'] = $this->language->get('column_total');

     		$this->data['button_update'] = $this->language->get('button_update');
     		$this->data['button_shopping'] = $this->language->get('button_shopping');
     		$this->data['button_checkout'] = $this->language->get('button_checkout');

		if (isset($this->error['warning'])) {
			$this->data['error_warning'] = $this->error['warning'];			
		} elseif (!$this->cart->hasStock() && (!$this->config->get('config_stock_checkout') || $this->config->get('config_stock_warning'))) {
     			$this->data['error_warning'] = $this->language->get('error_stock');
		} else {
			$this->data['error_warning'] = '';
		}

		$this->data['action'] = HTTPS_SERVER . 'index.php?route=checkout/cart';

		$this->load->model('tool/seo_url'); 
		$this->load->model('tool/image');

     		$this->data['products'] = array();

     		foreach ($this->cart->getProducts() as $result) {
       		$option_data = array();

       		foreach ($result['option'] as $option) {
         			$option_data[] = array(
           			'name'  => $option['name'],
           			'value' => $option['value']
         			);
       		}

			if ($result['image']) {
				$image = $result['image'];
			} else {
				$image = 'no_image.jpg';
			}

       		$this->data['products'][] = array(
         			'key'      => $result['key'],
         			'name'     => $result['name'],
         			'model'    => $result['model'],
         			'thumb'    => $this->model_tool_image->resize($image, $this->config->get('config_image_cart_width'), $this->config->get('config_image_cart_height')),
         			'option'   => $option_data,
         			'quantity' => $result['quantity'],
         			'stock'    => $result['stock'],
				'price'    => $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax'))),
				'total'    => $this->currency->format($this->tax->calculate($result['total'], $result['tax_class_id'], $this->config->get('config_tax'))),
				'href'     => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/product&product_id=' . $result['product_id'])
       		);
     		}

		if (!$this->config->get('config_customer_price')) {
			$this->data['display_price'] = TRUE;
		} elseif ($this->customer->isLogged()) {
			$this->data['display_price'] = TRUE;
		} else {
			$this->data['display_price'] = FALSE;
		}

		if ($this->config->get('config_cart_weight')) {
			$this->data['weight'] = $this->weight->format($this->cart->getWeight(), $this->config->get('config_weight_class'));
		} else {
			$this->data['weight'] = FALSE;
		}

     		$total_data = array();
		$total = 0;
		$taxes = $this->cart->getTaxes();

		$this->load->model('checkout/extension');

		$sort_order = array(); 

		$results = $this->model_checkout_extension->getExtensions('total');

		foreach ($results as $key => $value) {
			$sort_order[$key] = $this->config->get($value['key'] . '_sort_order');
		}

		array_multisort($sort_order, SORT_ASC, $results);

		foreach ($results as $result) {
			$this->load->model('total/' . $result['key']);

			$this->{'model_total_' . $result['key']}->getTotal($total_data, $total, $taxes);
		}

		$sort_order = array(); 

		foreach ($total_data as $key => $value) {
     			$sort_order[$key] = $value['sort_order'];
   		}

   		array_multisort($sort_order, SORT_ASC, $total_data);

		$this->data['totals'] = $total_data;

		if (isset($this->session->data['redirect'])) {
     			$this->data['continue'] = $this->session->data['redirect'];

			unset($this->session->data['redirect']);
		} else {
			$this->data['continue'] = HTTP_SERVER . 'index.php?route=common/home';
		}

		$this->data['checkout'] = HTTPS_SERVER . 'index.php?route=checkout/shipping';

		if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/checkout/cart.tpl')) {
			$this->template = $this->config->get('config_template') . '/template/checkout/cart.tpl';
		} else {
			$this->template = 'default/template/checkout/cart.tpl';
		}

		$this->children = array(
			'common/column_right',
			'common/column_left',
			'common/footer',
			'common/header'
		);		

		$this->response->setOutput($this->render(TRUE), $this->config->get('config_compression'));					
   	} else {
     		$this->data['heading_title'] = $this->language->get('heading_title');

     		$this->data['text_error'] = $this->language->get('text_error');

     		$this->data['button_continue'] = $this->language->get('button_continue');

     		$this->data['continue'] = HTTP_SERVER . 'index.php?route=common/home';

		if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/error/not_found.tpl')) {
			$this->template = $this->config->get('config_template') . '/template/error/not_found.tpl';
		} else {
			$this->template = 'default/template/error/not_found.tpl';
		}

		$this->children = array(
			'common/column_right',
			'common/column_left',
			'common/footer',
			'common/header'
		);

		$this->response->setOutput($this->render(TRUE), $this->config->get('config_compression'));			
   	}
 	}
}
?>

Link to comment
Share on other sites


  • 1 year later...

В 1.5.3.1 функция изменилась и заменяемых строк нет (как и собственно функции callback()) может кто нибудь делал подобное для данной версии и подскажет как быть?

Похожая по смыслу строка выглядит так вот:

$this->cart->add($this->request->post['product_id'], $quantity, $option);

Менять в ней?

p.s. сделал: Прошелся поиском по $this->cart->add

и везде добавил условие вначале

if ($this->request->post['sku']) {

$sku = $this->request->post['sku'];

} else {

$sku = 1;

}

потом в этих строках ['quantity']*$sku сделал

В корзину добавляет теперь, а вот как сделать чтобы в корзине выводилось не количество штук а деленное на значение sku - чтобы менять можно было только количество упаковок

Edited by vorobey
Link to comment
Share on other sites


  • 2 weeks later...

В 1.5.х.х достаточно

в catalogcontrollercheckoutcart.php в районе 353 строки под

   if (!isset($json['error'])) {
Чтобы было так:

	if ($this->request->post['sku']) {
		$sku = $this->request->post['sku'];
} else {
		$sku = 1;
}
$this->cart->add($this->request->post['product_id'], $quantity*$sku, $option);

Кстати, лучше не sku использовать, а upc т.к. sku задействуется в 1.5.хх как артикул и выводится в документах

Link to comment
Share on other sites


В 1.5.х.х достаточно

в catalogcontrollercheckoutcart.php в районе 353 строки под

   if (!isset($json['error'])) {
Чтобы было так:

	if ($this->request->post['sku']) {
		$sku = $this->request->post['sku'];
} else {
		$sku = 1;
}
$this->cart->add($this->request->post['product_id'], $quantity*$sku, $option);

Кстати, лучше не sku использовать, а upc т.к. sku задействуется в 1.5.хх как артикул и выводится в документах

пытаюсь настроить данную фишку на версии 1.5.3.1 , но в районе

353 строки и вообще в данном файле нет нечего подобного...

Ребята, подскажите, как быть?

Edited by dfg
Link to comment
Share on other sites


пытаюсь настроить данную фишку на версии 1.5.3.1 , но в районе

353 строки и вообще в данном файле нет нечего подобного...

Ребята, подскажите, как быть?

В 1.5.3.1 - 541 строка

Вместо:

$this->cart->add($this->request->post['product_id'], $quantity, $option);

Поставить:

if ($this->request->post['sku']) {
				$sku = $this->request->post['sku'];
} else {
				$sku = 1;
}
$this->cart->add($this->request->post['product_id'], $quantity*$sku, $option);

Ctrl F тебе в помощь :-)

Link to comment
Share on other sites


  • 1 year later...
  • 9 years later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.