Сохранить
Сохраняем
  • E
    e.a.novgorodov

    @Andchir спасибо тебе мужик, уже сколько лет помогаешь ))

    написал в MODX - Вопросы и обсуждения Читать далее
  • E
    e.a.novgorodov

    Проблема по-ходу реально в плагине этом, который за пользователем сохраняет корзину в БД. (НЕ ИСПОЛЬЗУЙТЕ ДАННЫЙ ПЛАГИН)

    <?php
    switch($modx->event->name) { 
    	# Добавление или удаление товара, расчёт полной цены
    	case 'OnSHKbeforeCartLoad': # Перед загрузкой корзины, чтобы отследить изменение количества товара, события далее их не могут уловить (:
    	case 'OnSHKaddProduct': # Добавление товара
    	case 'OnSHKAfterRemoveProduct': # Удаление товара
    		# Если пользователь залогинен
    		
    		$iId = $modx->user->get('id');
    		if ($iId > 0) {
    			# Собираем данные
    			foreach ($_SESSION as $key => $value)
    				if (strripos($key, 'shk_') === 0)
    					$arrCart[$key] = $value;
    
    			# Перегоняем в данные json
    			$jsCart = json_encode($arrCart, JSON_UNESCAPED_UNICODE);
    
    			# Проверяем есть ли корзина у этого пользователя в базе
    			$result = $modx->query("SELECT `cart_data` FROM users_cart WHERE user_id=" . $iId);
    			$arrUsers_cart = $result->fetchAll(PDO::FETCH_ASSOC);
    			if (count($arrUsers_cart))
    				# Есть, обновляем
    				$modx->exec("UPDATE users_cart SET cart_data='".$jsCart."' WHERE user_id=" . $iId);
    			else
    				# Нет, добавляем
    				$modx->exec("INSERT users_cart SET cart_data='".$jsCart."', user_id=" . $iId);
    		}
    
    		break;
    
    	# Чистим базу после оформления заказа или чистки корзины
    	case 'OnSHKsaveOrder':
    	case 'OnSHKAfterClearCart':
    
    		# Если пользователь залогинен, чистим его корзину в базе
    		$iId = $modx->user->get('id');
    		if ($iId > 0)
    			$modx->exec("UPDATE users_cart SET cart_data='' WHERE user_id=" . $iId);
    
    		break;
    
    	# Наполняем корзину из базы при входе пользователя
    	case 'OnWebLogin':
    
    		# Если пользователь залогинен
    		$iId = $modx->event->params['user']->id;
    		if ($iId) {
    			# Берём значение из базы и декодируем в массив
    			foreach ($modx->query("SELECT cart_data FROM users_cart WHERE user_id=" . $iId) as $key => $value)
    				$arrBaseCart = json_decode($value[0],true);
    
    			# Были ли в аккаунте пользователя товары
    			if (count($arrBaseCart['shk_order'])){
    
    				# Если в корзине до авторизации тоже были товары
    				if (count($_SESSION['shk_order'])) {
    
    					$arrBaseCartCount = count($arrBaseCart['shk_order']); // Всего товаров в базе, для счётчика
    					$arrNewsCart = []; // Сюда товары которых в базе
    
    					# Перебираем корзину новую корзину из сессии
    					foreach ($_SESSION['shk_order'] as $arrSessionCartItem){
    						$index = 0;
    						# Сравниваем с той что была в аккаунте
    						foreach ($arrBaseCart['shk_order'] as &$arrBaseCartItem) {
    							$index++;
    							if ($arrBaseCartItem['id'] == $arrSessionCartItem['id']){
    								# Нашли копию, теперь проверяем опции
    								if (count(array_intersect($arrBaseCartItem['options'], $arrSessionCartItem['options'])) > 1)
    									# Опции различаются, добавляем товар
    									$arrNewsCart[] = $arrSessionCartItem;
    								else
    									# Не различаются, суммируем колличество
    									$arrBaseCartItem['count'] = $arrBaseCartItem['count'] + $arrSessionCartItem['count'];
    
    								break;
    							}else
    							# Не нашли, добавляем
    							if ($index == $arrBaseCartCount)
    								$arrNewsCart[] = $arrSessionCartItem;
    						}
    					}
    					# Склеиваем все корзины
    					$arrBaseCart['shk_order'] = array_merge($arrBaseCart['shk_order'], $arrNewsCart);
    				}
    
    				# Пихаем в сессию то что получилось
    				foreach ($arrBaseCart as $key => $value)
    					$_SESSION[$key] = $value;
    			}
    		}
    
    		break;
    		
    		
    }
    

    Ну либо еще 30304934 вариантов того, что я делал за все это время ;D

    написал в MODX - Вопросы и обсуждения Читать далее
  • E
    e.a.novgorodov

    @Andchir
    В общем вот наглядный пример, причем количество "очисток" не поддается логике - бывает с первого раза, бывает с 10-го...
    Видео

    на системные события никаких больше плагинов не влияет:
    0_1589973034996_de8eb058-8768-457f-ae6b-4ec296c74443-image.png image url)

    когда-то стоял плагин newprice:

    <?php
    $output = 0;
            if(!empty($_POST['newprice'])){
                $output = $_POST['newprice'];
            } else {
                $price_tv_name = 'price';
                $p_id = isset($purchaseArray['shk-id']) && is_numeric($purchaseArray['shk-id']) ? $purchaseArray['shk-id'] : 0;
                if($p_id){
                    $price_tv = $modx->getObject('modTemplateVar',array('name'=>$price_tv_name));
                    $output = $price_tv->renderOutput($p_id);
                }
            }
            $modx->event->_output = '';
            $modx->event->output($output);
            return '';
    

    но сейчас я его отключил, цена осталась одна.
    В формах товара оправил все input обратно:

    <input type="hidden" name="shk-id" value="[[+id]]" />
                                <input type="hidden" name="shk-name" value="[[+pagetitle]]" />
                                <input type="hidden" name="shk-count" value="1" />
                                <input type="hidden" name="shk-price" value="[[+price]]"/>
    

    вроде ничего кроме этого не изменялось с ценой товара

    написал в MODX - Вопросы и обсуждения Читать далее
  • E
    e.a.novgorodov

    Когда то делал через плачин newprice что-то но все поменял обратно.. может есть вариант добить какой-нибудь функцией другой методо пересчета суммы заказа в корзине?

    написал в MODX - Вопросы и обсуждения Читать далее
  • E
    e.a.novgorodov

    @Andchir В общем пробовал заново ставить платформу, пробовал деинсталировать shopkeeper и заново все устанавливать - все равно время от времени price_total становится нулем... ((( причем итоговое количество товаров и позиций работает всегда... Подскажите, возможно есть другой способ загрузки price_total ? может можно поправить итоговый подсчет количества товара.. перенаправить его на цену ;D

    написал в MODX - Вопросы и обсуждения Читать далее
  • E
    e.a.novgorodov

    @Andchir

    Плагин работает на ура.

    Пробовал анонимом, админом и веб пользователем (*по отдельности). Проблема у всех.

    Если я правильно понял какая таблица - то она пуста, думаю у меня выключена эта функция либо оч быстро обнуляется.
    0_1589610123152_f9e57147-9408-41ec-b4f0-75e4e61eae72-image.png

    На 95% уверен, что дело в ModX, возможно у меня как то коряво встала последняя версия...потому что я могу раз 10 очистить кэш из панели управления и в какой нибудь из них сумма в корзине станет 0 (у всех пользователей/анонимов кто будет на сайте). Потом !не удаляя! позиции из корзины еще 1-3 раза очищаешь - обновляешь страницу - появляется сумма)))) после если не трогать очистку кэша (при сохранении/обновлении ресурса в том числе) ВСЕ работает как надо.

    Буду ждать новую версию Modx))) Спасибо! Как решится проблема - напишу, не забуду

    написал в MODX - Вопросы и обсуждения Читать далее
  • E
    e.a.novgorodov

    @Andchir
    В общем обновил шопкипер до последней 3 версии - не помогло.

    Проблема с админкой, возможно в последнем обновлении что-то. Очистка кэша при сохранении ресурса, либо из панели управления приводит к этой шляпе (с какой периодичностью сложно сказать, иногра сразу, иногда раза с 10го)...

    видимо буду ждать обновления modx, до след версии

    написал в MODX - Вопросы и обсуждения Читать далее
  • E
    e.a.novgorodov

    спасибо! в ближайшие дни попробую обновиться
    А по ошибкам, проверял, когда это происходит - ошибок не кажет.
    Всегда были только типа:

    [2020-05-15 05:45:02] (ERROR @ /home/u43076/xn--h1aaakjcx8iae.xn--p1ai/www/core/model/modx/modx.class.php : 1031) `[[+id]]` is not a valid integer and may not be passed to makeUrl()
    [2020-05-15 05:45:02] (ERROR in resource 27323 @ /home/u43076/xn--h1aaakjcx8iae.xn--p1ai/www/core/model/modx/modparser.class.php : 1373) Bad link tag `[[~[[+id]]]]` encountered
    

    Все таблицы шопкипера в Form, если не ошибаюсь прописывается [[~[[+id]]]] по документации. Я на нее не обращаю внимания

    Записи типа:

    <form method="post" action="[[~[[*id]]]]" id="shopOrderForm">
    

    ПО ПЛАГИНАМ:
    У меня все почти через mFilter2, может он лагает, хотя рыньше я такого не наблюдал..

    в корзине плагин на сохранение позиций за пользователем и все, вот он:

    <?php
    switch($modx->event->name) { 
    	# Добавление или удаление товара, расчёт полной цены
    	case 'OnSHKbeforeCartLoad': # Перед загрузкой корзины, чтобы отследить изменение количества товара, события далее их не могут уловить (:
    	case 'OnSHKaddProduct': # Добавление товара
    	case 'OnSHKAfterRemoveProduct': # Удаление товара
    		# Если пользователь залогинен
    		
    		$iId = $modx->user->get('id');
    		if ($iId > 0) {
    			# Собираем данные
    			foreach ($_SESSION as $key => $value)
    				if (strripos($key, 'shk_') === 0)
    					$arrCart[$key] = $value;
    
    			# Перегоняем в данные json
    			$jsCart = json_encode($arrCart, JSON_UNESCAPED_UNICODE);
    
    			# Проверяем есть ли корзина у этого пользователя в базе
    			$result = $modx->query("SELECT `cart_data` FROM users_cart WHERE user_id=" . $iId);
    			$arrUsers_cart = $result->fetchAll(PDO::FETCH_ASSOC);
    			if (count($arrUsers_cart))
    				# Есть, обновляем
    				$modx->exec("UPDATE users_cart SET cart_data='".$jsCart."' WHERE user_id=" . $iId);
    			else
    				# Нет, добавляем
    				$modx->exec("INSERT users_cart SET cart_data='".$jsCart."', user_id=" . $iId);
    		}
    
    		break;
    
    	# Чистим базу после оформления заказа или чистки корзины
    	case 'OnSHKsaveOrder':
    	case 'OnSHKAfterClearCart':
    
    		# Если пользователь залогинен, чистим его корзину в базе
    		$iId = $modx->user->get('id');
    		if ($iId > 0)
    			$modx->exec("UPDATE users_cart SET cart_data='' WHERE user_id=" . $iId);
    
    		break;
    
    	# Наполняем корзину из базы при входе пользователя
    	case 'OnWebLogin':
    
    		# Если пользователь залогинен
    		$iId = $modx->event->params['user']->id;
    		if ($iId) {
    			# Берём значение из базы и декодируем в массив
    			foreach ($modx->query("SELECT cart_data FROM users_cart WHERE user_id=" . $iId) as $key => $value)
    				$arrBaseCart = json_decode($value[0],true);
    
    			# Были ли в аккаунте пользователя товары
    			if (count($arrBaseCart['shk_order'])){
    
    				# Если в корзине до авторизации тоже были товары
    				if (count($_SESSION['shk_order'])) {
    
    					$arrBaseCartCount = count($arrBaseCart['shk_order']); // Всего товаров в базе, для счётчика
    					$arrNewsCart = []; // Сюда товары которых в базе
    
    					# Перебираем корзину новую корзину из сессии
    					foreach ($_SESSION['shk_order'] as $arrSessionCartItem){
    						$index = 0;
    						# Сравниваем с той что была в аккаунте
    						foreach ($arrBaseCart['shk_order'] as &$arrBaseCartItem) {
    							$index++;
    							if ($arrBaseCartItem['id'] == $arrSessionCartItem['id']){
    								# Нашли копию, теперь проверяем опции
    								if (count(array_intersect($arrBaseCartItem['options'], $arrSessionCartItem['options'])) > 1)
    									# Опции различаются, добавляем товар
    									$arrNewsCart[] = $arrSessionCartItem;
    								else
    									# Не различаются, суммируем колличество
    									$arrBaseCartItem['count'] = $arrBaseCartItem['count'] + $arrSessionCartItem['count'];
    
    								break;
    							}else
    							# Не нашли, добавляем
    							if ($index == $arrBaseCartCount)
    								$arrNewsCart[] = $arrSessionCartItem;
    						}
    					}
    					# Склеиваем все корзины
    					$arrBaseCart['shk_order'] = array_merge($arrBaseCart['shk_order'], $arrNewsCart);
    				}
    
    				# Пихаем в сессию то что получилось
    				foreach ($arrBaseCart as $key => $value)
    					$_SESSION[$key] = $value;
    			}
    		}
    
    		break;
    		
    		
    }
    

    В общем думаю баг какой-то мною сделанный криворуким) Обновлюсь - расскажу че кого, поменяется нет)

    написал в MODX - Вопросы и обсуждения Читать далее
  • E
    e.a.novgorodov

    В мини корзине тоже. В общем следил два дня, единственное что понял, когда кто-то в админке чет меняет/сохраняет с очисткой кэша время от времени цена становится нулевой. Убирается это обычно очисткой кэша через панель управления. Если не трогать внутри ничего - все ок.

    форма заказа в корзине, т.к. почему то при смене количества (юзая сайт с телефона) она пропадает без обновления страницы. Внес внутрь - с тарабарщиной, но остается)

    Чанк на форму:

    [[shkOptions?
    &get=`delivery,payments`
    &post_name=`shk_delivery,payment`
    &toPlaceholders=`1`
    &tpl=`select_option`
    ]]
    
    <form method="post" action="[[~[[*id]]]]" id="shopOrderForm">
    
    [[$form_zakaz_obshaya]]
    </form>
    

    Чанк на form_zakaz_obshaya:

    <fieldset>
    
    <input type="text" name="nospam:blank" value="" style="display:none;" />
    <input type="hidden" name="order" value="1" />
    <table cellpadding="3">
        <tr>
            <td>Ф.И.О.:<b style="color: #ff0000;"> *</b></td>
            <td>
                <input name="fullname" size="30" class="textfield form-control" required="required" type="text" value="[[+fi.fullname:default=`[[!+modx.user.id:userinfo=`fullname`]]`:ne=`0`:show]]" />
                <div>[[!+fi.error.fullname]]</div>
            </td>
        </tr>
        <tr>
            <td>E-mail:<b style="color: #ff0000;"> *</b></td>
            <td>
                <input name="email" size="30" class="textfield form-control" required="required" type="email" value="[[!+fi.email:default=`[[!+modx.user.id:userinfo=`email`]]`:ne=`0`:show]]" />
                <div>[[!+fi.error.email]]</div>
            </td>
        </tr>
        <tr>
            <td>Телефон:<b style="color: #ff0000;"> *</b></td>
            <td>
                <input name="phone" id="shest" size="30" class="textfield form-control" required="required" type="tel" value="[[!+fi.phone:default=`[[!+modx.user.id:userinfo=`phone`]]`:ne=`0`:show]]" />
                <div>[[!+fi.error.phone]]</div>
            </td>
        </tr>
        <tr>
            <td>Адрес:</td>
            <td>
                  <input name="address" size="30" class="textfield form-control" type="text" value="[[!+fi.address:default=`[[!+modx.user.id:userinfo=`address`]]`:ne=`0`:show]]" />
            </td>
        </tr>
        <tr>
            <td>Способ доставки:</td>
            <td>
                <select name="shk_delivery" class="form-control">
                    <option value="Самовывоз (ул. Сулимова, 4)">Самовывоз (ул. Сулимова, 4)</option>
                	<option value="Курьерская доставка по г. Екатеринбургу">Курьерская доставка по г. Екатеринбургу</option>
                	<option value="Доставка до отделения «Почта России» | Екатеринбург">Доставка до отделения «Почта России» | Екатеринбург</option>
                	<option value="Доставка до терминала «ПЭК» | Екатеринбург">Доставка до терминала «ПЭК» | Екатеринбург</option>
                	<option value="Доставка другой транспортной компанией">Доставка другой транспортной компанией</option>
                </select>
                <p style="font-size: 12px;"><b>ВНИМАНИЕ!</b> Доставка по г. Екатеринбургу, до ТК и «Почты России» при сумме заказа свыше 2000 руб. <b>БЕСПЛАТНО!</b>
                <p style="font-size: 12px;">При заказе <b>менее 2000 руб.</b> стоимость доставки по г. Екатеринбургу, до ТК и «Почты России» будет составлять <b>250 руб.</b></p>
            </td>
        </tr>
        <tr>
            <td>Способ оплаты:</td>
            <td>
                <select name="payment" class="form-control">
                    <option value="Наличный расчет">Наличный расчет</option>
                	<option value="Банковской картой (только Самовывоз)">Банковской картой (только Самовывоз)</option>
                	<option value="Безналичный расчет">Безналичный расчет</option>
                </select>
            </td>
        </tr>
        <tr>
            <td>Комментарий:</td>
            <td>
                <textarea name="message" class="textfield" rows="4" cols="30">[[!+fi.message]]</textarea>
            </td>
        </tr>
                    <tr>
                    <td></td>
                    <td>
                    <p style="font-size: 12px;">Нажимая кнопку «Отправить заказ», Вы соглашаетесь с условиями <a style="font-size: 12px;" href="[[~34069]]"><b>политики конфиденциальности</b></a> и <a style="font-size: 12px;" href="[[~16236]]"><b>публичной оферты</b></a>.</p>
                    </td>
                </tr>
                <tr>
                    <td></td>
                    <td class="proverka"><input type="submit" onclick="yaCounter28980395.reachGoal('zakaz'); return true;" name="order" class="button btn btn-default check_out" value="Отправить заказ" /></td>
                </tr>
    </table>
    </fieldset>
    <script type="text/javascript">
    $(document).bind('ready',function(){
      var br = SHK.data.price_total - SHK.data.delivery_price;
      if (br<500) {$('.proverka').append('<p style="font-size:22px; color: red;"><b>Минимальная сумма заказа 500 руб.</b></p>'); $('input[type="submit"]').prop('disabled', true);}
    	         else{ $('input[type="submit"]').prop('disabled', false);};
    });
    </script>
    

    написал в MODX - Вопросы и обсуждения Читать далее
  • E
    e.a.novgorodov

    @Andchir

    вызов корзины:

    
    [[!Shopkeeper3@cart?
    &TVsaveList=`image,title,chek_sale,kod,article,red_price,price,money,price2,price3`
    &savePurchasesFields=`image,title,chek_sale,kod,article,red_price,price,money,price2,price3`
    ]]
       
    

    вызов миникорзины:

    <div style="position: fixed; right: 7px; bottom: 75px;opacity: 0.9;">
        [[!Shopkeeper3@cart_small_new?
    &TVsaveList=`image,title,pagetitle,chek_sale,kod,article,red_price,price,money`
    &savePurchasesFields=`image,title,pagetitle,chek_sale,kod,article,red_price,price,money`
        ]]
        </div>
    

    Если надо могу параметры скинуть..
    Получается когда пропадает сумма все остальное остается, как только почистишь кэш - обновляешь страницу и вуаля, сумма появляется на неопределенный срок

    написал в MODX - Вопросы и обсуждения Читать далее