Перейти к содержанию
Absolute

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

Рекомендуемые сообщения

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

глянул сейчас свое старенькое решение которое делал на 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 штук

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё сделал как сказали, поле 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'));			
   	}
 	}
}
?>

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в callbacktop попробуй тоже заменить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в callbacktop попробуй тоже заменить

Спасибо! Супер! Всё заработало :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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 - чтобы менять можно было только количество упаковок

Изменено пользователем vorobey

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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.х.х достаточно

в 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 строки и вообще в данном файле нет нечего подобного...

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

Изменено пользователем dfg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пытаюсь настроить данную фишку на версии 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 тебе в помощь :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть ли vqmod решение?

Попытался сделать по инструкции выше, не получилось - OpenCart 1.5.4.1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.