Формирование нескольких заказов в miniShop2

Всем привет.

Помогите пожалуйста, мне необходимо формировать несколько заказов. На сайте есть партнеры (использую производителей) Мне нужно, когда пользователь покупает услуги/товары у разных партнеров, то это разные заказы. Каждому партнеру по заказу.

Например:
Товар1 — Партнер1
товар2 — партнер2
Товар3 — Партнер1
Будет два заказа:
Партнер1 — Товар1 и Товар3
Партнер2 — Товар2

Я добавил свой класс и делаю extend msOrderHandler. Использую метод submit.
Мой код сейчас формирует несколько заказов, НО приходится нажимать оформить заказ 2 раза (если 2 партнера)
Вот код, но там пока не реализована сумма заказа.
P.S. в PHP я не профи, но стараюсь :)
Здесь был код :)
Спасибо!
Игорь Игамов
19 апреля 2017, 13:51
modx.pro
2
2 558
0

Комментарии: 6

Игорь Игамов
19 апреля 2017, 22:38
0
Никто не знает? (
    Наумов Алексей
    20 апреля 2017, 12:05
    +2
    Ну принцип верный (расширение msOrderHandler), но изучать портянку кода и искать в ней проблемы желания нет, наверное поэтому и «никто не знает» =)
      Игорь Игамов
      20 апреля 2017, 12:34
      0
      Ахах ну хорошо, буду думать дальше))

      Пока понял только то, что я
      return $this->success();
      в цикле, а не после его выполнения, из-за этого приходится несколько раз нажимать оформить заказ.
      Воеводский Михаил
      20 апреля 2017, 13:26
      1
      +2
      Алексей абсолютно прав — большую портянку кода никто не хочет изучать, тк это бесполезная трата времени.

      На одном из проектов решена подобная задача. Алгоритм вкратце:
      1) Расширен класс заказа
      2) Родной submit() переименован в _submit()
      3) Создан новый submit(), который разделяет корзину на несколько по необходимой логике (cart->get(), затем разбиение на несколько разных массивов, после чего в цикле cart->set() для каждого)
      4) В цикле для каждого полученного массива корзины вызывается _submit().
      Игорь Игамов
      02 мая 2017, 16:08
      +2
      PS Совсем забыл выложить готовый код. Сейчас пользователя не перекидывает на оплату, а просто выводиться страница с его оформленными заказами и там уже ссылки на оплату. А как это сделать, уже совсем другая история :)
      Сейчас после оформления заказов формируются след. вида ссылки: 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();
      		}
      }
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        6