Формирование нескольких заказов в miniShop2
        Всем привет.
Помогите пожалуйста, мне необходимо формировать несколько заказов. На сайте есть партнеры (использую производителей) Мне нужно, когда пользователь покупает услуги/товары у разных партнеров, то это разные заказы. Каждому партнеру по заказу.
Например:
Товар1 — Партнер1
товар2 — партнер2
Товар3 — Партнер1
Будет два заказа:
Партнер1 — Товар1 и Товар3
Партнер2 — Товар2
Я добавил свой класс и делаю extend msOrderHandler. Использую метод submit.
Мой код сейчас формирует несколько заказов, НО приходится нажимать оформить заказ 2 раза (если 2 партнера)
Вот код, но там пока не реализована сумма заказа.
P.S. в PHP я не профи, но стараюсь :)
    
    
                                                                                
            Помогите пожалуйста, мне необходимо формировать несколько заказов. На сайте есть партнеры (использую производителей) Мне нужно, когда пользователь покупает услуги/товары у разных партнеров, то это разные заказы. Каждому партнеру по заказу.
Например:
Товар1 — Партнер1
товар2 — партнер2
Товар3 — Партнер1
Будет два заказа:
Партнер1 — Товар1 и Товар3
Партнер2 — Товар2
Я добавил свой класс и делаю extend msOrderHandler. Использую метод submit.
Мой код сейчас формирует несколько заказов, НО приходится нажимать оформить заказ 2 раза (если 2 партнера)
Вот код, но там пока не реализована сумма заказа.
P.S. в PHP я не профи, но стараюсь :)
Здесь был код :)Спасибо!    Комментарии: 6
                Никто не знает? (            
                    
                Ну принцип верный (расширение msOrderHandler), но изучать портянку кода и искать в ней проблемы желания нет, наверное поэтому и «никто не знает» =)            
                    
                Ахах ну хорошо, буду думать дальше))
Пока понял только то, что я
                    Пока понял только то, что я
return $this->success(); в цикле, а не после его выполнения, из-за этого приходится несколько раз нажимать оформить заказ.            
                Алексей абсолютно прав — большую портянку кода никто не хочет изучать, тк это бесполезная трата времени. 
На одном из проектов решена подобная задача. Алгоритм вкратце:
1) Расширен класс заказа
2) Родной submit() переименован в _submit()
3) Создан новый submit(), который разделяет корзину на несколько по необходимой логике (cart->get(), затем разбиение на несколько разных массивов, после чего в цикле cart->set() для каждого)
4) В цикле для каждого полученного массива корзины вызывается _submit().
                    На одном из проектов решена подобная задача. Алгоритм вкратце:
1) Расширен класс заказа
2) Родной submit() переименован в _submit()
3) Создан новый submit(), который разделяет корзину на несколько по необходимой логике (cart->get(), затем разбиение на несколько разных массивов, после чего в цикле cart->set() для каждого)
4) В цикле для каждого полученного массива корзины вызывается _submit().
                Спасибо большое за алгоритм!!!            
                    
                PS Совсем забыл выложить готовый код. Сейчас пользователя не перекидывает на оплату, а просто выводиться страница с его оформленными заказами и там уже ссылки на оплату. А как это сделать, уже совсем другая история :)
Сейчас после оформления заказов формируются след. вида ссылки: domain.ru/cart?msorder=23,24.
Просто нужно скопировать сниппет msGetOrder и немного его переделать :)
                    Сейчас после оформления заказов формируются след. вида ссылки: domain.ru/cart?msorder=23,24.
Просто нужно скопировать сниппет msGetOrder и немного его переделать :)
<?php
class msTest extends msOrderHandler {
	public function submit($data = array())
		{
			$response = $this->ms2->invokeEvent('msOnSubmitOrder', array(
				'data' => $data,
				'order' => $this,
			));
			if (!$response['success']) {
				return $this->error($response['message']);
			}
			if (!empty($response['data']['data'])) {
					$this->set($response['data']['data']);
			}
			$response = $this->getDeliveryRequiresFields();
			if ($this->ms2->config['json_response']) {
					$response = json_decode($response, true);
			}
			$requires = $response['data']['requires'];
			$errors = array();
			foreach ($requires as $v) {
					if (!empty($v) && empty($this->order[$v])) {
							$errors[] = $v;
					}
			}
			if (!empty($errors)) {
					return $this->error('ms2_order_err_requires', $errors);
			}
			$cart = $this->ms2->cart->get();
			$products = array();
			$partners = array();
			$idOrders = array();
			foreach ($cart as $v) {
			  if(!in_array($v['vendor'],$partners)){
				  $partners[] = $v['vendor'];
			  }
			}
			foreach ($partners as $partner){
				$user_id = $this->ms2->getCustomerId();
				$cart_status = $this->ms2->cart->status();
				$delivery_cost = $this->getCost(false, true);
				$createdon = date('Y-m-d H:i:s');
				$cart_cost = 0;
				$weight_cost = 0;
				// Adding products
				foreach ($this->ms2->cart->get() as $v) {
					if ($partner == $v['vendor']){
						if ($tmp = $this->modx->getObject('msProduct', $v['id'])) {
								$name = $tmp->get('pagetitle');
						} else {
								$name = '';
						}
						/** @var msOrderProduct $product */
						$product = $this->modx->newObject('msOrderProduct');
						$product->fromArray(array_merge($v, array(
								'product_id' => $v['id'],
								'name' => $name,
								'cost' => $v['price'] * $v['count'],
							)));
						$cart_cost = $cart_cost + ($v['price'] * $v['count']); //собираем стоимость заказа для партнера
						$weight_cost = $weight_cost + $v['weight'];
						$products[] = $product;
						$key = md5($v['id'] . $v['price'] . $v['weight'] . $v['vendor'] . (json_encode($v['options'])));
						$remove = $this->ms2->cart->remove($key); //Удаляем товар из корзины
					}
				}
				/** @var msOrder $order */
				$order = $this->modx->newObject('msOrder');
				$order->fromArray(array(
					'user_id' => $user_id,
					'createdon' => $createdon,
					'num' => $this->getNum(),
					'delivery' => $this->order['delivery'],
					'payment' => $this->order['payment'],
					'cart_cost' => $cart_cost,
					'weight' => $weight_cost,
					'delivery_cost' => $delivery_cost,
					'cost' => $cart_cost + $delivery_cost,
					'status' => 0,
					'context' => $this->ms2->config['ctx'],
					'partner' => $partner,
				));
				// Adding address
				/** @var msOrderAddress $address */
				$address = $this->modx->newObject('msOrderAddress');
				$address->fromArray(array_merge($this->order, array(
					'user_id' => $user_id,
					'createdon' => $createdon,
				)));
				$order->addOne($address);
				$order->addMany($products);
				$response = $this->ms2->invokeEvent('msOnBeforeCreateOrder', array(
					'msOrder' => $order,
					'order' => $this,
				));
				if (!$response['success']) {
					return $this->error($response['message']);
				}
				if ($order->save()) {
					$response = $this->ms2->invokeEvent('msOnCreateOrder', array(
						'msOrder' => $order,
						'order' => $this,
				));
				if (!$response['success']) {
					return $this->error($response['message']);
				}
				if (empty($_SESSION['minishop2']['orders'])) {
					$_SESSION['minishop2']['orders'] = array();
				}
				$_SESSION['minishop2']['orders'][] = $order->get('id');	
				// Trying to set status "new"
				$response = $this->ms2->changeOrderStatus($order->get('id'), 1);
				if ($response !== true) {
					return $this->error($response, array('msorder' => $order->get('id')));
				}
				unset($products);
				} else{
					$this->modx->log(1, 'Oh no, the wand failed to save!');
				}
				$idOrders[] = $order->get('id');
		}
			$this->ms2->cart->clean();
			$this->clean();
			/*$this->modx->sendRedirect(
												$this->modx->context->makeUrl(
														$this->modx->resource->id,
														array('msorder' => $response['data']['msorder'])
												)
										);*/
				
						/** @var msPayment $payment */
						/*if ($payment = $this->modx->getObject('msPayment',
								array('id' => $order->get('payment'), 'active' => 1))
						) {
								$response = $payment->send($order);
								if ($this->config['json_response']) {
										@session_write_close();
										exit(is_array($response) ? json_encode($response) : $response);
								} else {
										if (!empty($response['data']['redirect'])) {
												$this->modx->sendRedirect($response['data']['redirect']);
										} elseif (!empty($response['data']['msorder'])) {
												$this->modx->sendRedirect(
														$this->modx->context->makeUrl(
																$this->modx->resource->id,
																array('msorder' => $response['data']['msorder'])
														)
												);
										} else {
												$this->modx->sendRedirect($this->modx->context->makeUrl($this->modx->resource->id));
										}
										return $this->success();
								}
						} 
						else {*/
			if ($this->ms2->config['json_response']) {
				return $this->success('', array('msorder' => implode(",", $idOrders)));
			} else {
				$this->modx->sendRedirect(
					$this->modx->context->makeUrl(
						$this->modx->resource->id,
						array('msorder' => implode(",", $idOrders))
					)
				);
			}
			return $this->success();
			return $this->error();
		}
}            
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.