Формирование нескольких заказов в 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();
}
}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.