Всего 125 335 комментариев

Игорь
20 ноября 2022, 14:28
0
да, точно подключен (когда я вне что-то пытаюсь поменять — сайт падает… :)… )
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();
    }
	
	
	
}
Артур Шевченко
20 ноября 2022, 14:23
0
А точно класс подключен, проверили?
Игорь
20 ноября 2022, 14:07
0
сделал, не помогло (
Игорь
20 ноября 2022, 13:06
0
да, кастомный класс обработки заказа используется… а что значит «подключить заново»?… что-то в консоли прописать?
Артур Шевченко
20 ноября 2022, 12:49
0
Если использовался кастомный класс обработки заказа, надо его подключить заново.
Stepan
19 ноября 2022, 17:07
+1
нашел ошибку
if (!in_array($sp['type'], ['user', 'admin'])) {
    return 'Bad type.';
}
тут admin нужно на manager поменять
Alexey
19 ноября 2022, 15:11
0
Привет! Та же проблема вылезла с кроном. Не подскажешь, как удалось решить? Родитель, разумеется, указан, из админки этот прайс-лист создаётся без проблем
voodoosystem
19 ноября 2022, 10:30
0
Не поверите, но проблема решилась сама собой каким-то «аномальным образом» :) попробовал загрузить/обновить плагины через несколько дней и все работает в данный момент… Но если кому пригодится, совпадение или нет — как раз-таки на тот момент от домена была отключена на время внешняя система доставки контента и видимо просто ДНС сервера которые кэшировали данные не успели «очиститься», но это только версия :)
Don
Don
18 ноября 2022, 23:11
0
Ребята, подтолкните, пожалуйста, хоть в какую сторону копать, я совсем в тупике.
Алексей
18 ноября 2022, 22:48
0
Спасибо большое, напишу через несколько дней.
Prihod
18 ноября 2022, 22:07
+1
Через личное сообщение (если нет возможности создать тикет в поддержке) скинь доступ в админку, тестовый файл импорта с 2 товарами и название настройки полей. Завтра посмотрю.
Roman
18 ноября 2022, 21:16
0
Не работает потому что в папку с субдоменом надо копировать файл:
1) config.core.php
2) index.php — в нем заменить $modx->initialize('Ваш context');
3) .htaccess

Пишу коммент для людей у которых возник вопрос на текущий момент и они не нашли решение. (его нет в инете, решил вопрос сам)
Алексей
18 ноября 2022, 20:32
0
В поиске по базе данных такой артикул только у 1 товара. Нет дублей. Я и все товары пробылал обновить, и этот, и другой, и разные. Проверил в поиске — в каталоге — 100% такой артикул всего 1, у 1 товара, в прайс листе тоже 1 такой артикул. И товаров штук 100, если артикулы у 1-2 товаров совпадали, раньше это не мешало импорту всех остальных товаров.

Если поможет обновление, можно купить компонент. Я его давно не обновляю. Сделал магаз, купил компонент на тестовый сайт, перенёс на основной домен, потом за 5 лет сменил 3 домена. Но других копий сайтов с этим компонентом 100% нету, максимум для теста, могу иногда клонировать сайт ненадолго, но не более.
Prihod
18 ноября 2022, 19:48
0
У тебя article = SBGS30 имеет дубликат из-за чего не происходит обновление в том товаре который ты смотришь так что для начала избавься от дублей
steve.kon
18 ноября 2022, 19:44
0
Ну действительно, всё оказалось проще, чем представлялось изначально:
[[msProducts?
 &parents=`97`
 &limit=`0`
 &tpl=`tpl.msProducts.SeriaProducts`
 &tplWrapper=`tplWrapper.msProducts.PodborSeria`
 &wrapIfEmpty=`0`
 &includeContent=`1`
 &sortby=`id`
 &sortdir=`ASC`
 &where = `{"menutitle":30}`
]]
В parents каталог с нужными категориями и &where отсекает ненужные литражи
Алексей
18 ноября 2022, 19:37
0
И еще проверил cvs файлом 1 строка, всего 2 ячейки, артикул и цена. Более актуальный лог.

[2022-11-18 19:31:52] (INFO @ */core/components/msimportexport/model/msimportexport/msie.class.php : 3343) max_execution_time:600
[2022-11-18 19:31:52] (INFO @ */core/components/msimportexport/model/msimportexport/msie.class.php : 3344) memory_limit:256M
[2022-11-18 19:31:52] (INFO @ */core/components/msimportexport/model/msimportexport/msie.class.php : 3345) Используется настройка для полей c ID: 63
[2022-11-18 19:31:52] (INFO @*/core/components/msimportexport/model/msimportexport/msie.class.php : 3423) Строка данных для импорта 
Array
(
    [0] => art123
    [1] => 125
)

[2022-11-18 19:31:52] (INFO @ */core/components/msimportexport/model/msimportexport/msie.class.php : 3516) SQL запросов для проверки на дублирование: 
SELECT msProduct.id FROM `modx_site_content` AS `msProduct` JOIN `modx_ms2_products` `Data` ON msProduct.id = Data.id WHERE  ( `msProduct`.`context_key` = 'web' AND `Data`.`article` = 'SBGS30' )  
[2022-11-18 19:31:52] (INFO @ */core/components/msimportexport/model/msimportexport/msie.class.php : 3520) Ключ article = SBGS30 имеет дубликат
[2022-11-18 19:31:52] (INFO @ */core/components/msimportexport/model/msimportexport/msie.class.php : 3536) Массив данных импортера: 
Array
(
    [article] => art123
    [price] => 125
    [class_key] => msProduct
    [context_key] => web
    [tvs] => 
    [pagetitle] => Зажигалка Bic
    [parent] => 442
    [id] => 967
)

[2022-11-18 19:31:52] (INFO @ */core/model/modx/registry/moddbregister.class.php : 160) Message was null or expired: stdClass Object
(
    [topic] => 2
    [id] => 6cfe0e6127fa25df2a0ef2ae1067d915
    [created] => 2022-11-17 13:46:10
    [valid] => 2022-11-17 13:46:10
    [accessed] => 2022-11-17 13:46:10
    [accesses] => 0
    [expires] => 1668682330
    [payload] => if (time() > 1668682330) return null;
return 1;

    [kill] => 0
)

[2022-11-18 19:31:52] (ERROR @ */core/components/msimportexport/model/msimportexport/msie.class.php : 3626) Ошибка для update: 
Array
(
    [0] => alias: Это поле обязательно для заполнения.
)

[2022-11-18 19:31:52] (INFO @ */core/components/msimportexport/model/msimportexport/msie.class.php : 3669) Вы в режиме отладки, поэтому мы обрабатывать только 1 строку. Время: 0.0919871 сек.
steve.kon
18 ноября 2022, 19:31
0

Вот что делается — нужно создавать страницы под Директ, например, Водонагреватели Thermex 30литров
— и показать все категории (серии), в которых есть 30л модели (товары) с ссылкой на модель

… хотя вот написал и понимаю, что серии (категории) именно в этом случае можно не выводить, т.к. товар (литраж) будет лишь 1 и можно сразу выводить модели (товары)
Алексей
18 ноября 2022, 19:29
0
Обрабатывает хоть 100 товаров, но не обновляет.
Screenshot-2
Алексей
18 ноября 2022, 19:27
0
На VDS PHP модуль Apache до 7.4.23 (alt).
Версия базы данных: 10.1.44-MariaDB-0+deb9u1
Включил отладку.

В журнале ошибок modx при загрузке прайс листа *.csv:

[2022-11-18 19:19:55] (ERROR @ ***/core/components/msimportexport/processors/mgr/import/upload.php : 39) PHP warning: Use of undefined constant strip_tags - assumed 'strip_tags' (this will throw an Error in a future version of PHP)
После нажатия кнопки импортировать график строится, работает но не обновляет остатки или цену. И Ошибки в журнале:
[2022-11-18 19:21:31] (INFO @ */core/components/msimportexport/model/msimportexport/msie.class.php : 3343) max_execution_time:600
[2022-11-18 19:21:31] (INFO @ */core/components/msimportexport/model/msimportexport/msie.class.php : 3344) memory_limit:256M
[2022-11-18 19:21:31] (INFO @ */core/components/msimportexport/model/msimportexport/msie.class.php : 3345) Используется настройка для полей c ID: 85
[2022-11-18 19:21:31] (INFO @ */core/components/msimportexport/model/msimportexport/msie.class.php : 3423) Строка данных для импорта 
Array
(
    [0] => Номенклатура
    [1] => Артикул
    [2] => Ед
    [3] => Цена
    [4] => Остатки1
    [5] => Остатки2
    [6] => СуммаОстатков
)
[2022-11-18 19:21:31] (INFO @ */core/components/msimportexport/model/msimportexport/msie.class.php : 3516) SQL запросов для проверки на дублирование: 
SELECT msProduct.id FROM `modx_site_content` AS `msProduct` JOIN `modx_ms2_products` `Data` ON msProduct.id = Data.id WHERE  ( `msProduct`.`context_key` = 'web' AND `Data`.`article` = 'Артикул' )  
[2022-11-18 19:21:31] (INFO @ */core/components/msimportexport/model/msimportexport/msie.class.php : 3536) Массив данных импортера: 
Array
(
    [article] => Артикул
    [options-availability_1] => Остатки1
    [options-availability_2] => Остатки2
    [availability] => СуммаОстатков
    [class_key] => msProduct
    [context_key] => web
    [tvs] => 
    [parent] => 2477
)