Перейти к содержимому


Фото
- - - - -

Дублируются заказы


  • Чтобы отвечать, сперва войдите на форум
20 ответов в теме

#1 catdontes

catdontes
  • Пользователь
  • 12 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:москва

Опубликовано 10.01.2017 - 19:03

Здравствуйте.

Подскажите, пожалуйста, в чем может быть проблема:

При оформлении заказа после ввода всех необходимых полей заказ отправляется в систему, поля остаются заполненными, и требуется еще раз нажать оформить заказ после чего формируется еще один такой же заказ и переходит в пустую корзину.

 

файл cart.tpl

{* Шаблон корзины *}

{$meta_title = "Корзина" scope=parent}

<section class="titlebar">
	<div class="container">
		<div class="sixteen columns">
			<h2 id="cart_title">{include file="cart_title.tpl"}</h2>
			
			<nav id="breadcrumbs">
				<ul>
					<li><a href="./">Главная</a></li>
					<li>Корзина</li>
				</ul>
			</nav>
		</div>
	</div>
</section>

{if $cart->purchases}
<form method="post" name="cart" id="purchases">
	<div class="container cart">
		<div class="sixteen columns">
			{if $error}
			<div class="notification error">
				<p>
					{if $error == 'empty_name'}Введите имя{/if}
					{if $error == 'empty_email'}Введите email{/if}{$error}
				</p>
			</div>
			{/if}
				
			{if $coupon_error}
				{if $coupon_error == 'invalid'}
				<div class="notification error">
					<p>Купон недействителен</p>
				</div>
				{/if}
			{/if}
			<!-- Cart -->
			<table class="cart-table responsive-table" >
				<tr>
					<th>&nbsp;</th>
					<th>Товар</th>
					<th>Цена</th>
					<th>Количество</th>
					<th>Итого</th>
					<th>&nbsp;</th>
				</tr>
						
				{foreach from=$cart->purchases item=purchase}
				<tr id="cart_item_{$purchase->variant->id}">
					<td>
						{$image = $purchase->product->images|first}
						{if $image}
						<a href="products/{$purchase->product->url}">
							<img src="{$image->filename|resize:80:80}" alt="{$product->name|escape}">
						</a>
						{/if}
					</td>
					
	
					<td class="cart-title">
						<a href="products/{$purchase->product->url}">{$purchase->product->name|escape}</a>
						<div>{$purchase->variant->name|escape}</div>
					</td>
					
					<td>{($purchase->variant->price)|string_format:"%.2f"|replace:' ':'&nbsp;'}&nbsp;{$currency->sign}</td>
					
					<td>
						<div class="qtyminus"></div>
						<input type="text" name="amounts[{$purchase->variant->id}]" value="{$purchase->amount}" class="qty qty-{$purchase->variant->id}" data-id="{$purchase->variant->id}" autocomplete="off">
						<div class="qtyplus"></div>
					</td>
					
					<td><strong class="cart_item_total_{$purchase->variant->id}">{($purchase->variant->price*$purchase->amount)|string_format:"%.2f"|replace:' ':'&nbsp;'}&nbsp;{$currency->sign}</strong></td>
					
					<td><a href="cart/remove/{$purchase->variant->id}" class="cart-remove" data-id="{$purchase->variant->id}"></a></td>
				</tr>
				{/foreach}
			</table>

			<!-- Apply Coupon Code / Buttons -->
			{if $coupon_request}
			<table class="cart-table bottom">
				<tr>
					<th>
						<div class="apply-coupon">
							<input class="search-field" type="text" name="coupon_code" placeholder="Код купона" value="{$cart->coupon->code|escape}"/>
							<a href="#" class="button gray" id="coupon_apply" >Применить купон</a>
							<span class="pull-left" id="coupon_result"></span>
						</div>
					</th>
				</tr>
			</table>
			{/if}
		</div>

		<div class="eight columns cart-delivery">
			{* Доставка *}
			{if $deliveries}
			<h3 class="headline">Выберите способ доставки</h3><span class="line"></span><div class="clearfix"></div>
			<div id="accordion">
				{include file="delivery.tpl"}
			</div>
			{/if}
		</div>
		
		<!-- Cart Totals -->
		<div class="eight columns cart-totals">
			<h3 class="headline">Итого</h3><span class="line"></span><div class="clearfix"></div>

			<table class="cart-table margin-bottom-45">
				<tr>
					<th>Стоимость заказа</th>
					<td id="cart_items_total">{include file="cart_items_total.tpl"}</td>
				</tr>

				{if $user->discount}
				<tr>
					<th>Cкидка</th>
					<td>{$user->discount}&nbsp;%</td>
				</tr>
				{/if}

				<tr id="coupon" {if !$cart->coupon || ($cart->coupon->min_order_price > $cart->total_price)}class="hidden"{/if}>
					<th>Купон</th>
					<td >{include file="cart_coupon.tpl"}</td>
				</tr>
				
				<tr>
					<th>Доставка</th>
					<td id="delivery_cost">{include file="delivery_cost.tpl"}</td>
				</tr>

				<tr>
					<th>Итого</th>
					<td><strong id="cart_total">{include file="cart_total.tpl"}</strong></td>
				</tr>
			</table>
			
			<h3 class="headline">Адрес получателя</h3><span class="line"></span><div class="clearfix"></div>

			<div class="checkout-content">
				<div class="fullwidth">
					<label for="cart_name">Имя, фамилия: <abbr>*</abbr></label>
					<input type="text" name="name" id="cart_name" value="{$name|escape}" required/>
				</div>

				<div class="half first">
					<label for="cart_email">Email: <abbr>*</abbr></label>
					<input type="email" name="email" id="cart_email" value="{$email|escape}" required/>
				</div>
				
				<div class="half">
					<label for="cart_phone">Телефон:</label>
					<input type="text" name="phone" id="cart_phone" value="{$phone|escape}">
				</div>

				<div class="clearfix"></div>
				
				<div class="fullwidth">
					<label for="cart_address">Адрес доставки:</label>
					<input type="text" name="address" id="cart_address" value="{$address|escape}" />
				</div>
				
				<div class="fullwidth">
					<label for="cart_comment">Комментарий к&nbsp;заказу:</label>
					<textarea name="comment" id="cart_comment" cols="40" rows="4">{$comment|escape}</textarea>
				</div>
				
				<div class="clearfix"></div>
			</div>

			<input type="submit" name="checkout" class="button cart-order" value="Оформить заказ" />
		</div>
	</div>
</form>
{else}
<div class="container">
	<div class="sixteen columns">
		<div class="notification notice margin-bottom-50">
			<p>В корзине нет товаров.</p>
		</div>
	</div>
</div>
{/if}

Файл cart_items_total.tpl

{$cart->cart_price|string_format:"%.2f"|replace:' ':'&nbsp;'}&nbsp;{$currency->sign}

Файл cart_total.tpl

{if $delivery} 
	{if $cart->total_price < $delivery->free_from && $delivery->price > 0}
		{($cart->total_price + $delivery->price)|string_format:"%.2f"|replace:' ':'&nbsp;'}&nbsp;{$currency->sign}
	{elseif $cart->total_price >= $delivery->free_from}
		{$cart->total_price|string_format:"%.2f"|replace:' ':'&nbsp;'}&nbsp;{$currency->sign}
	{/if}
{else}
	{if $cart->total_price < $deliveries[0]->free_from && $deliveries[0]->price > 0}
		{($cart->total_price + $deliveries[0]->price)|string_format:"%.2f"|replace:' ':'&nbsp;'}&nbsp;{$currency->sign}
	{elseif $cart->total_price >= $deliveries[0]->free_from}
		{$cart->total_price|string_format:"%.2f"|replace:' ':'&nbsp;'}&nbsp;{$currency->sign}
	{/if}
{/if}

Файл cart_item_total.tpl

{($variant->price*$amount)|string_format:"%.2f"|replace:' ':'&nbsp;'}&nbsp;{$currency->sign}

 

файл cart_title.tpl

{if $cart->purchases}В корзине {$cart->total_products} {$cart->total_products|plural:'товар':'товаров':'товара'}{else}Корзина пуста{/if}

 



#2 Noxter

Noxter
  • Фрилансер
  • 4 896 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 10.01.2017 - 19:15

Не стоило использовать ворованный шаблон, а нужно было покупать его у автора, тогда бы и получили техподдержку.

#3 catdontes

catdontes
  • Пользователь
  • 12 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:москва

Опубликовано 10.01.2017 - 19:22

Не стоило использовать ворованный шаблон, а нужно было покупать его у автора, тогда бы и получили техподдержку.

Очень ценный ответ. Только это вопросы не ко мне. Меня попросили помочь с сайтом. Самостоятельно не нашел проблемы, по этому обратился за помощью



#4 mishanya

mishanya
  • Фрилансер
  • 2 058 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 10.01.2017 - 19:23

Очень ценный ответ. Только это вопросы не ко мне. Меня попросили помочь с сайтом. Самостоятельно не нашел проблемы, по этому обратился за помощью

 

такая проблема может возникнуть когда жмешь пару раз на кнопку оформить. нужно блокировать форму через js например



#5 catdontes

catdontes
  • Пользователь
  • 12 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:москва

Опубликовано 10.01.2017 - 19:25

такая проблема может возникнуть когда жмешь пару раз на кнопку оформить. нужно блокировать форму через js например

я сначала тоже так подумал, но проблема не в двойном нажатии, так как форма просто остается заполненной, перехода никуда не происходит, а заказ формируется сразу же. И только при повторном нажатии корзина становиться пустой, но при этом формируется такой же заказ. 



#6 mishanya

mishanya
  • Фрилансер
  • 2 058 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 10.01.2017 - 19:27

тогда проблема может быть в контролере view/CartView.php 

либо какая-то то ошибка мешает редиректу смотрите есть ли все поля, капча и тд


Изменено: mishanya, 10.01.2017 - 19:33


#7 catdontes

catdontes
  • Пользователь
  • 12 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:москва

Опубликовано 10.01.2017 - 19:40

думал использовать модуль заказа на одной странице решил сравнить cartview.php и вот что получилось - https://www.diffchec...r.com/OFlcDzgQ

Изменено: catdontes, 10.01.2017 - 19:41


#8 catdontes

catdontes
  • Пользователь
  • 12 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:москва

Опубликовано 10.01.2017 - 19:42

думаю различия в 176 строке

надо использовать

 

if($this->user)

        {
            $last_order = reset($this->orders->get_orders(array('user_id'=>$this->user->id, 'limit'=>1)));
вместо
 
   if($this->user)
        {
            $last_order = $this->orders->get_orders(array('user_id'=>$this->user->id, 'limit'=>1));
            $last_order = reset($last_order);


#9 catdontes

catdontes
  • Пользователь
  • 12 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:москва

Опубликовано 10.01.2017 - 20:02

это проблему не решило(( 



#10 mishanya

mishanya
  • Фрилансер
  • 2 058 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 10.01.2017 - 20:15

это проблему не решило(( 

 

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


Изменено: mishanya, 10.01.2017 - 20:16


#11 catdontes

catdontes
  • Пользователь
  • 12 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:москва

Опубликовано 11.01.2017 - 00:34

В чем может быть проблема, я что-то все проглядел, ничего не вижу.

Дело в не в теме, так как какую бы не ставил на всех одна и та же проблема

Файл view/CartView.php 

<?PHP

/**
 * Simpla CMS
 *
 * @copyright 	2009 Denis Pikusov
 * @link 		http://simp.la
 * @author 		Denis Pikusov
 *
 * Корзина покупок
 * Этот класс использует шаблон cart.tpl
 *
 */
 
require_once('View.php');

class CartView extends View
{
  //////////////////////////////////////////
  // Изменения товаров в корзине
  //////////////////////////////////////////
  public function __construct()
  {
	parent::__construct();

    // Если передан id варианта, добавим его в корзину
    if($variant_id = $this->request->get('variant', 'integer'))
    {
		$this->cart->add_item($variant_id, $this->request->get('amount', 'integer'));
	    header('location: '.$this->config->root_url.'/cart/');
		
    }

    // Удаление товара из корзины
    if($delete_variant_id = intval($this->request->get('delete_variant')))
    {
      $this->cart->delete_item($delete_variant_id);
      if(!isset($_POST['submit_order']) || $_POST['submit_order']!=1)
			header('location: '.$this->config->root_url.'/cart/');
	}
	
    // Если нажали оформить заказ
    if(isset($_POST['checkout']))
    {
    	$order = new stdClass;
    	
    	$order->delivery_id = $this->request->post('delivery_id', 'integer');
    	$order->name        = $this->request->post('name');
    	$order->email       = $this->request->post('email');
    	$order->address     = $this->request->post('address');
    	$order->phone       = $this->request->post('phone');
    	$order->comment     = $this->request->post('comment');
    	$order->ip      	= $_SERVER['REMOTE_ADDR'];
    	
		$this->design->assign('delivery_id', $order->delivery_id);
		$this->design->assign('name', $order->name);
		$this->design->assign('email', $order->email);
		$this->design->assign('phone', $order->phone);
		$this->design->assign('address', $order->address);


		// Скидка
		$cart = $this->cart->get_cart();
		$order->discount = $cart->discount;
		
		if($cart->coupon)
		{
			$order->coupon_discount = $cart->coupon_discount;
			$order->coupon_code = $cart->coupon->code;
		}
		//
    	
    	if(!empty($this->user->id))
	    	$order->user_id = $this->user->id;
    	
    	if(empty($order->name))
    	{
    		$this->design->assign('error', 'empty_name');
    	}
    	elseif(empty($order->email))
    	{
    		$this->design->assign('error', 'empty_email');
    	}
    	else
    	{
	    	// Добавляем заказ в базу
	    	$order_id = $this->orders->add_order($order);
	    	$_SESSION['order_id'] = $order_id;
	    	
	    	// Если использовали купон, увеличим количество его использований
	    	if($cart->coupon)
	    		$this->coupons->update_coupon($cart->coupon->id, array('usages'=>$cart->coupon->usages+1));
	    	
	    	// Добавляем товары к заказу
	    	foreach($this->request->post('amounts') as $variant_id=>$amount)
	    	{
	    		$this->orders->add_purchase(array('order_id'=>$order_id, 'variant_id'=>intval($variant_id), 'amount'=>intval($amount)));
	    	}
	    	$order = $this->orders->get_order($order_id);
	    	
	    	// Стоимость доставки
			$delivery = $this->delivery->get_delivery($order->delivery_id);
	    	if(!empty($delivery) && $delivery->free_from > $order->total_price)
	    	{
	    		$this->orders->update_order($order->id, array('delivery_price'=>$delivery->price, 'separate_delivery'=>$delivery->separate_payment));
	    	}
			
			// Отправляем письмо пользователю
			$this->notify->email_order_user($order->id);
	    	
			// Отправляем письмо администратору
			$this->notify->email_order_admin($order->id);
			
			//Уведомим в Telegram
			if($this->settings->tg_notify==1)
			$this->tgnotify->message($order->id);
			
	    	
	    	// Очищаем корзину (сессию)
			$this->cart->empty_cart();
						
			// Перенаправляем на страницу заказа
			header('Location: '.$this->config->root_url.'/order/'.$order->url);
		}
    }   
    else
    {

	    // Если нам запостили amounts, обновляем их
	    if($amounts = $this->request->post('amounts'))
	    {
			foreach($amounts as $variant_id=>$amount)
			{
				$this->cart->update_item($variant_id, $amount);         
			}

	    	$coupon_code = trim($this->request->post('coupon_code', 'string'));
	    	if(empty($coupon_code))
	    	{
	    		$this->cart->apply_coupon('');
				header('location: '.$this->config->root_url.'/cart/');	    		
	    	}
	    	else
	    	{
				$coupon = $this->coupons->get_coupon((string)$coupon_code);

				if(empty($coupon) || !$coupon->valid)
				{
		    		$this->cart->apply_coupon($coupon_code);
					$this->design->assign('coupon_error', 'invalid');
				}
				else
				{
					$this->cart->apply_coupon($coupon_code);
					header('location: '.$this->config->root_url.'/cart/');
				}
	    	}
		}
	    
	}
              
  }

  
	//////////////////////////////////////////
	// Основная функция
	//////////////////////////////////////////
	function fetch()
	{  
		// Способы доставки
		$deliveries = $this->delivery->get_deliveries(array('enabled'=>1));
		$this->design->assign('deliveries', $deliveries);
		
		
		// Данные пользователя
		if($this->user)
        {
            $last_order = $this->orders->get_orders(array('user_id'=>$this->user->id, 'limit'=>1));
            $last_order = reset($last_order);
   			if($last_order)
			{
				$this->design->assign('name', $last_order->name);
				$this->design->assign('email', $last_order->email);
				$this->design->assign('phone', $last_order->phone);
				$this->design->assign('address', $last_order->address);
			}
			else
			{
				$this->design->assign('name', $this->user->name);
				$this->design->assign('email', $this->user->email);			
			}
		}
		
		// Если существуют валидные купоны, нужно вывести инпут для купона
		if($this->coupons->count_coupons(array('valid'=>1))>0)
			$this->design->assign('coupon_request', true);

		// Выводим корзину
		return $this->design->fetch('cart.tpl');
	}
	
}


#12 mishanya

mishanya
  • Фрилансер
  • 2 058 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 11.01.2017 - 10:14

возможно это как-то связано с уведомлениями в телеграм, закомментируйте эти строки

if($this->settings->tg_notify==1)
$this->tgnotify->message($order->id);

если нет, смотрите еще логи ошибок, может там что-то есть



#13 catdontes

catdontes
  • Пользователь
  • 12 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:москва

Опубликовано 11.01.2017 - 13:29

возможно это как-то связано с уведомлениями в телеграм, закомментируйте эти строки

if($this->settings->tg_notify==1)
$this->tgnotify->message($order->id);

если нет, смотрите еще логи ошибок, может там что-то есть

Это не связано с уведомлением в телеграмм.



#14 Kosjak76

Kosjak76
  • Модератор
  • 3 347 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 11.01.2017 - 13:33

Вы это проверили?

Код комментировали?



#15 catdontes

catdontes
  • Пользователь
  • 12 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:москва

Опубликовано 11.01.2017 - 13:35

Вы это проверили?

Код комментировали?

да, закомментировал и сделал заказ



#16 Kosjak76

Kosjak76
  • Модератор
  • 3 347 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 11.01.2017 - 13:41

У вас похоже неработает вот этот код

	    	// Очищаем корзину (сессию)
			$this->cart->empty_cart();
						
			// Перенаправляем на страницу заказа
			header('Location: '.$this->config->root_url.'/order/'.$order->url);

Почему - непонятно.

Возможно, header не работает, потому, что какие-то заголовки отдаются ранее.

Встречал такое на одном сайте. Так и не разобрался, почему. Пришлось делать костыльный редирект через джаваскрипт.



#17 catdontes

catdontes
  • Пользователь
  • 12 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:москва

Опубликовано 11.01.2017 - 14:25

У вас похоже неработает вот этот код

	    	// Очищаем корзину (сессию)
			$this->cart->empty_cart();
						
			// Перенаправляем на страницу заказа
			header('Location: '.$this->config->root_url.'/order/'.$order->url);

Почему - непонятно.

Возможно, header не работает, потому, что какие-то заголовки отдаются ранее.

Встречал такое на одном сайте. Так и не разобрался, почему. Пришлось делать костыльный редирект через джаваскрипт.

Возможно, по идее при формировании письма пользователю, генерируется ссылка на заказ. Но при переходе не отображается просто заказ, а отображается последний этап заказа, отображаются детали и выбор способа оплаты и активная кнопка "Закончить заказ", а это должно отображаться ранее перед тем как чиститься корзина. 
Как это можно исправить и как такое вообще могло получиться?


Изменено: catdontes, 11.01.2017 - 14:30


#18 Kosjak76

Kosjak76
  • Модератор
  • 3 347 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 11.01.2017 - 14:30

Это нормально, так и должно быть



#19 catdontes

catdontes
  • Пользователь
  • 12 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:москва

Опубликовано 11.01.2017 - 16:00

Протестировал на другом магазине, после нажатия оформить заказ, переходит на выбор способа оплаты, и там отображается страница с деталями заказа и выбор оплаты и только потом закончить заказ. 



#20 Kosjak76

Kosjak76
  • Модератор
  • 3 347 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 11.01.2017 - 16:05

Да, ВСЕ ПРАВИЛЬНО!!!

ТАК И ДОЛЖНО БЫТЬ!!!

Как вам еще обьяснить?

После нажатия ОФОРМИТЬ - вы попадаете на страницу ЗАКАЗА, где его можно ОПЛАТИТЬ

Что тут непонятного???






0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых