02 июня 2023, 13:33 Здравствуйте. Подскажите, как можно получить название или id зон доставки. Т.е. планируется при оформлении заказа, в зависимости от выбранной зоны делать то или иное действие. Новые дополнения и их версии / [msDeliveryOnMap] Выбор адреса и подсчёт стоимости доставки одним кликом по карте 40 0
29 мая 2023, 09:45 Здравствуйте. У Тинькофф есть новый способ оплаты «Оплата долями» www.tinkoff.ru/dolyame/. Ваш компонент не поддерживает такое пока? Новые дополнения и их версии / [mspTinkoff] 1.0.2 — Новое API + ККТ 57 0
24 мая 2023, 08:59 Здравствуйте. Хочу уточнить: для товаров без свойств и модификаций Ваш компонент будет работать? Новые дополнения и их версии / [msProductRemains] Компонент учёта остатков товара 179 0
24 мая 2023, 08:55 Ну да, поле-то создать не проблема (хоть кастомное, хоть tv)… Загвоздка именно в функционале: чтобы остатки уменьшались при заказе, например… Вопросы / Minishop2 Остатки товаров 3 0
31 марта 2023, 11:55 сейчас еще раз попробовал обновить minishop — вроде всё заработало (а в прошлый раз нет: и кэш чистил и т.д.)… странно, но будем надеяться на лучшее)) Вопросы / Сломался Minoshop 1 0
14 февраля 2023, 18:23 вроде, немного разобрался: ошибка появляется, если способ доставки добавлять в товары — возможно, я что-то недопонял в инструкции… ну а без этого работает (особенно, если, опять же, по ссылке на модернизированную версию в файле iiko.class.php заменить config['token'] на просто переменную $token), правда без стоимости доставки… буду благодарен за любую помощь Пошаговые инструкции / Небольшая интеграция miniShop2 с сервисом iiko 5 0
13 февраля 2023, 17:34 Здравствуйте. Что-то у меня ничего не получается с этой интеграцией… в ответе «creationStatus»: «InProgress» и заказа нет в программе — похоже каких-то параметров не хватает в запросе… (( Никто не разобрался? Пошаговые инструкции / Небольшая интеграция miniShop2 с сервисом iiko 5 0
22 ноября 2022, 14:33 Похоже конфликт с модулем промокодов msPromoCode2 — это он цены подтягивает Вопросы / Minishop2 сломалась кастомная стоимость в заказе 15 0
22 ноября 2022, 11:09 да я уже понял, что дело не в Minishop, а в моих кривых руках… но разобраться пока не получилось… Подскажите, как удалить кастомный класс. Я сделал следующее: 1. В консоли запустил if ($miniShop2 = $modx->getService('miniShop2')) { $miniShop2->removeService('order', 'myOrderHandler'); }2. В системных настройках поменял класс на msOrderHandler. 3. Очистил кэш Но в логах все равно пишет: " Could not load custom class at… /httpdocs/core/components/minishop2/custom/order/myorderhandler.class.php" Вопросы / Minishop2 сломалась кастомная стоимость в заказе 15 0
21 ноября 2022, 19:36 да глюк какой-то похоже… Вот сумма на странице оформления заказа: pastenow.ru/e315b9fa2f337af9beee35e031351122 А вот уже сам заказ: pastenow.ru/c558a65674b10de60bead6ca71073c15 (цена по умолчанию из карточки товара)… самое интересное, что есть более ранняя копия сайта, уже с обновленным minishop и там нормально цены цепляются Вопросы / Minishop2 сломалась кастомная стоимость в заказе 15 0
21 ноября 2022, 18:25 отключил кастомный класс через консоль: if ($miniShop2 = $modx->getService('miniShop2')) { $miniShop2->removeService('order', 'myOrderHandler'); }ну и в системных настройках тоже указал стандартный класс msOrderHandler всё равно работает не правильно, цена берется из карточки товара по умолчанию… хотя на более ранней версии того же сайта, уже с обновленным minishop все ok — ничего не могу понять ( Вопросы / Minishop2 сломалась кастомная стоимость в заказе 15 0
20 ноября 2022, 20:29 /core/components/minishop2/model/minishop2/msorderaddress.class.php — такой файл тоже есть, он как раз ссылается на то что выше написал: <?php if (!empty($this->modx->getOption('log_deprecated'))) { $this->modx->log( xPDO::LOG_LEVEL_ERROR, 'Deprecated: use handlers from catalog core/components/minishop2/handlers/' ); } require_once dirname(__FILE__, 3) . '/handlers/msorderhandler.class.php';… мне кажется, тут дело в самом минишопе — что-то перемудрили, что стоимость берется не из корзины, а из карточки товара ( Вопросы / Minishop2 сломалась кастомная стоимость в заказе 15 0
20 ноября 2022, 20:23 /httpdocs/core/components/minishop2/handlers/msorderhandler.class.php до этого стоял minishop 2.5.0 — всё работало как часы, пришлось обновить версию до 3.0.7 ради модуля подарков modstore.pro/packages/integration/msgiftcart — в результате всё плохо ( Вопросы / Minishop2 сломалась кастомная стоимость в заказе 15 0
20 ноября 2022, 14:28 да, точно подключен (когда я вне что-то пытаюсь поменять — сайт падает… :)… ) myorderhandler.class.php <?php if(!class_exists('msOrderInterface')) { require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/msorderhandler.class.php'; } class myOrderHandler extends msOrderHandler { public function getCost($with_cart = true, $only_cost = false) { $response = $this->ms2->invokeEvent('msOnBeforeGetOrderCost', array( 'order' => $this, 'cart' => $this->ms2->cart, 'with_cart' => $with_cart, 'only_cost' => $only_cost, )); if (!$response['success']) { return $this->error($response['message']); } $cart = $this->ms2->cart->status(); $cost = $with_cart ? $cart['total_cost'] : 0; /** @var msDelivery $delivery */ if (!empty($this->order['delivery']) && $delivery = $this->modx->getObject('msDelivery', $this->order['delivery']) ) { $cost = $delivery->getCost($this, $cost); $deliveryCost = $delivery->getCost($this, 0);//Добавил переменную где получаем price доставки } /** @var msPayment $payment */ if (!empty($this->order['payment']) && $payment = $this->modx->getObject('msPayment', $this->order['payment']) ) { $cost = $payment->getCost($this, $cost); } $response = $this->ms2->invokeEvent('msOnGetOrderCost', array( 'order' => $this, 'cart' => $this->ms2->cart, 'with_cart' => $with_cart, 'only_cost' => $only_cost, 'cost' => $cost, )); if (!$response['success']) { return $this->error($response['message']); } $cost = $response['data']['cost']; return $only_cost ? $cost : $this->success('', array('cost' => $cost, 'delivery_cost'=>$deliveryCost)); } /** * Returns id for current customer. If customer is not exists, registers him and returns id. * * @return integer $id */ public function getCustomerId() { //эту функцию переписываем частично $customer = null; $response = $this->ms2->invokeEvent('msOnBeforeGetOrderCustomer', array( 'order' => $this->ms2->order, 'customer' => &$customer, )); if (!$response['success']) { return $response['message']; } if (!$customer) { $data = $this->ms2->order->get(); $email = isset($data['email']) ? $data['email'] : ''; $receiver = isset($data['receiver']) ? $data['receiver'] : ''; $phone = isset($data['phone']) ? $data['phone'] : ''; $user_group = isset($data['group']) ? $data['group'] : '111'; //$this->modx->log(modX::LOG_LEVEL_ERROR, $user_group); if (empty($receiver)) { $receiver = $email ? substr($email, 0, strpos($email, '@')) : ($phone ? preg_replace('#[^0-9]#', '', $phone) : uniqid('user_', false)); } if (empty($email)) { $email = $receiver . '@' . $this->modx->getOption('http_host'); } if ($this->modx->user->isAuthenticated()) { $profile = $this->modx->user->Profile; if (!$profile->get('email')) { $profile->set('email', $email); $profile->save(); } $customer = $this->modx->user; } else { $c = $this->modx->newQuery('modUser'); $c->leftJoin('modUserProfile', 'Profile'); $filter = array('username' => $email, 'OR:Profile.email:=' => $email); if (!empty($phone)) { $filter['OR:Profile.phone:='] = $phone; } $c->where($filter); $c->select('modUser.id'); if (!$customer = $this->modx->getObject('modUser', $c)) { $pass=md5(rand()); $customer = $this->modx->newObject('modUser', array('username' => $email, 'password' => $pass)); $profile = $this->modx->newObject('modUserProfile', array( 'email' => $email, 'fullname' => $receiver, 'phone' => $phone )); $customer->addOne($profile); /** @var modUserSetting $setting */ $setting = $this->modx->newObject('modUserSetting'); $setting->fromArray(array( 'key' => 'cultureKey', 'area' => 'language', 'value' => $this->modx->getOption('cultureKey', null, 'en', true), ), '', true); $customer->addMany($setting); if (!$customer->save()) { $customer = null; }else if (!empty($user_group) && !empty($_POST['group'])){ if($customer->joinGroup('Users')){ $url=$this->modx->getOption('site_url'); $name=$this->modx->getOption('site_name'); $subjectTheme='Вы зарегистрировались на сайте '.$name; $bodyTheme='<html><body><p>Здравствуйте, '.$data['receiver'].'!</p><p>Сделав заказ, вы зарегистрировались на сайте <a href="'.$url.'">'.$name.'</a>. Ваши данные для входа:</p><p>Логин: '.$email.'</p><p>Пароль: '.$pass.'</p><p>Изменить пароль можно в личном кабинете</p></body></html>'; //$sent = $customer->sendEmail($bodyTheme, array('subject' => $subjectTheme)); $sent = $this->ms2->sendEmail($email,$subjectTheme,$bodyTheme); if ($sent){ $this->modx->log(modX::LOG_LEVEL_ERROR, $sent); } }else{ $this->modx->log(modX::LOG_LEVEL_ERROR, 'Какая та ошибка с добавлением в группу, письмо не отправлено'); } }else if ($groups = $this->modx->getOption('ms2_order_user_groups', null, false)) { $groups = array_map('trim', explode(',', $groups)); foreach ($groups as $group) { $customer->joinGroup($group); } } }else if (!empty($user_group) && !empty($_POST['group'])){ $profile=$customer->getOne('Profile'); if ($profile->get('logincount') > 0){ $length = 8; $olduser = $customer; $pass=$olduser->generatePassword($length); $olduser->toArray(); $olduser->set('password',$pass); $olduser->save(); if ($olduser->joinGroup('Users')){ $url=$this->modx->getOption('site_url'); $name=$this->modx->getOption('site_name'); $subjectTheme='Вы зарегистрировались на сайте '.$name; $bodyTheme='<html><body><p>Здравствуйте, '.$data['receiver'].'!</p><p>Сделав очередной заказ, вы подвердили регистрацию на сайте <a href="'.$url.'">'.$name.'</a>. Ваши данные для входа:</p><p>Логин: '.$email.'</p><p>Пароль: '.$pass.'</p><p>Изменить пароль можно в личном кабинете</p></body></html>'; //$pdo = $this->modx->getService('pdoFetch'); // можно переделать на чанк при желании //$message = $pdo->getChunk('@FILE chunks/email/user.register.tpl', array('username' => $username, 'password' => $pass)); $sent = $this->ms2->sendEmail($email,$subjectTheme,$bodyTheme); //Мгновенная авторизация на сайте без набора пароля, кому надо раскомментируйте //$olduser->addSessionContext('web'); if ($sent){ $this->modx->log(modX::LOG_LEVEL_ERROR, $sent); } }else{ $this->modx->log(modX::LOG_LEVEL_ERROR, 'Какая та ошибка с добавлением в группу, письмо не отправлено'); } } } } } $response = $this->ms2->invokeEvent('msOnGetOrderCustomer', array( 'order' => $this->ms2->order, 'customer' => &$customer, )); if (!$response['success']) { return $response['message']; } return $customer instanceof modUser ? $customer->get('id') : 0; } public function submit($data = array()) { //в этой меняем вызов функции getCustomerId под свою, ранее исправленную $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); } if (!$response['success']) { return $this->error($response['message']); } $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); } $user_id = $this->getCustomerId(); if (empty($user_id) || !is_int($user_id)) { return $this->error(is_string($user_id) ? $user_id : 'ms2_err_user_nf'); } $cart_status = $this->ms2->cart->status(); $delivery_cost = $this->getCost(false, true); $cart_cost = $this->getCost(true, true) - $delivery_cost; $createdon = date('Y-m-d H:i:s'); /** @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' => $cart_status['total_weight'], 'delivery_cost' => $delivery_cost, 'cost' => $cart_cost + $delivery_cost, 'status' => 0, 'context' => $this->ms2->config['ctx'], )); // 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); // Adding products $cart = $this->ms2->cart->get(); $products = array(); foreach ($cart as $v) { if ($tmp = $this->modx->getObject('msProduct', array('id' => $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'], ))); $products[] = $product; } $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']); } $this->ms2->cart->clean(); $this->clean(); 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'))); } // Reload order object after changes in changeOrderStatus method $order = $this->modx->getObject('msOrder', array('id' => $order->get('id'))); /** @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' => $order->get('id'))); } else { $this->modx->sendRedirect( $this->modx->context->makeUrl( $this->modx->resource->id, array('msorder' => $response['data']['msorder']) ) ); return $this->success(); } } } return $this->error(); } } Вопросы / Minishop2 сломалась кастомная стоимость в заказе 15 0
20 ноября 2022, 14:07 сделал, не помогло ( Вопросы / Minishop2 сломалась кастомная стоимость в заказе 15 0
20 ноября 2022, 13:06 да, кастомный класс обработки заказа используется… а что значит «подключить заново»?… что-то в консоли прописать? Вопросы / Minishop2 сломалась кастомная стоимость в заказе 15 0
10 ноября 2022, 15:06 сообразил {var $phone1 = $_modx->getPlaceholder('sd.phone')} {if $phone1} <a class="phones__number" href="tel:{$phone1 | preg_replace : '/[^0-9+]/' : ''}">{$phone1}</a> {/if} Новые дополнения и их версии / [SEO Domains] Добавление доп. доменов и поддоменов для сайта, с добавлением в вебмастер 44 0
10 ноября 2022, 14:39 Здравствуйте. Подскажите, как выводить поля через fenom? Весь сайт на fenom сделан и как-то не хочется мешать со стандартным синтаксисом modx Новые дополнения и их версии / [SEO Domains] Добавление доп. доменов и поддоменов для сайта, с добавлением в вебмастер 44 0
08 ноября 2022, 12:28 есть подозрение, что там ничего и не передаётся… (( Вопросы / Tickets дополнительные поля в письме 2 0
18 августа 2022, 20:22 Пробовал — не помогает… Пришлось установить компонент RobotsBuilder, сделать чанк с кодом robots.txt, и сейчас вставляю его для каждого поддомена… Вопросы / robot.txt для подддоменов 8 0
gtsAPI 1.1.7 — таблицы на TanStack, инлайн-редактирование как в Excel Prime Vue datatable тупит на 200+ строк и в виртуальном скролинге высота полей фиксирована. Вот нам в итоге и не подошло. Директор сказал расчет должен сразу показываться без пагин...
mxApi — быстрый внешний API для MODX Revolution • зафиксировать публичный контракт EndpointInterface / метаданных по semver, чтобы наш провайдер не ломался на обновлениях;Фактически это уже так, beta стоит просто на всякий случа...
YaSmartCaptcha - защитите ваши формы от спама умной капчей от Яндекс Вообще не понял о чем речь) В системной настройке service_js сейчас указана ссылка smartcaptcha.cloud.yandex.ru/captcha.js Я предложил очистить эту настройку, тогда компонент н...
mxBackup — обезличенные копии MODX в пару кликов Ещё нет, я там разом почти полтора десятка пакетов выложил модератор, вероятно, а шоке.
Gallery3x 3.4.0 - вставка галерей прямо из визуального редактора (CKEditor и TinyMCE RTE) Здравствуйте. Есть консольный скрипт Вот почитайте: docs.ivan345.com/books/gallery3x/page/import-ms2galleryphp
[mSync] Новая версия синхронизации с 1С Всем привет. В какой то момент начали сыпаться ошибки: Error 23000 executing statement: INSERT INTO `modx_msync_products` (`product_id`, `uuid_1c`) VALUES ...
Подскажите, как можно получить название или id зон доставки. Т.е. планируется при оформлении заказа, в зависимости от выбранной зоны делать то или иное действие.
У Тинькофф есть новый способ оплаты «Оплата долями» www.tinkoff.ru/dolyame/. Ваш компонент не поддерживает такое пока?
Хочу уточнить: для товаров без свойств и модификаций Ваш компонент будет работать?
Что-то у меня ничего не получается с этой интеграцией… в ответе «creationStatus»: «InProgress» и заказа нет в программе — похоже каких-то параметров не хватает в запросе… ((
Никто не разобрался?
Подскажите, как удалить кастомный класс. Я сделал следующее:
1. В консоли запустил
2. В системных настройках поменял класс на msOrderHandler.
3. Очистил кэш
Но в логах все равно пишет: " Could not load custom class at… /httpdocs/core/components/minishop2/custom/order/myorderhandler.class.php"
Вот сумма на странице оформления заказа: pastenow.ru/e315b9fa2f337af9beee35e031351122
А вот уже сам заказ: pastenow.ru/c558a65674b10de60bead6ca71073c15 (цена по умолчанию из карточки товара)… самое интересное, что есть более ранняя копия сайта, уже с обновленным minishop и там нормально цены цепляются
ну и в системных настройках тоже указал стандартный класс msOrderHandler
всё равно работает не правильно, цена берется из карточки товара по умолчанию… хотя на более ранней версии того же сайта, уже с обновленным minishop все ok — ничего не могу понять (
… мне кажется, тут дело в самом минишопе — что-то перемудрили, что стоимость берется не из корзины, а из карточки товара (
до этого стоял minishop 2.5.0 — всё работало как часы, пришлось обновить версию до 3.0.7 ради модуля подарков modstore.pro/packages/integration/msgiftcart — в результате всё плохо (
myorderhandler.class.php
Подскажите, как выводить поля через fenom?
Весь сайт на fenom сделан и как-то не хочется мешать со стандартным синтаксисом modx
Пришлось установить компонент RobotsBuilder, сделать чанк с кодом robots.txt, и сейчас вставляю его для каждого поддомена…