Перейти к содержанию
Официальный форум поддержки Simpla

Рекомендуемые сообщения

 Обычно мы выбираем в корзине доставку и заполняем свои данные. Потом переход идёт на страницу УЖЕ заказа и там выбирается оплата. Можно ли убрать этап перехода на страницу заказа и завершить заказ в корзине, выбрав в ней способ оплаты? другими словами не делать 1 лишний переход на новую страницу

Ссылка на сообщение
Поделиться на другие сайты

в view/CartView.php после (строка 45):

    if(isset($_POST['checkout']))
    {

добавляем:

$order->payment_method_id=$this->request->post('payment_method_id', 'integer');	

после (строка 172):

		// Способы доставки
		$deliveries = $this->delivery->get_deliveries(array('enabled'=>1));

добавляем выбор методов оплаты:

foreach($deliveries as $delivery)
      $delivery->payment_methods = $this->payment->get_payment_methods(array('delivery_id'=>$delivery->id, 'enabled'=>1));

 

в /design/themes/cart.tpl добавляем после доставки:

{if $deliveries}
    {foreach $deliveries as $delivery}
        {if $delivery->payment_methods} 
            <div class="delivery_payment {if $delivery@first}first{/if}" id="delivery_payment_{$delivery->id}" style="display:none"  >             
                <h2>Выберите способ оплаты</h2>
                <ul id="deliveries">
                    {foreach  $delivery->payment_methods as $payment_method}
                        <li>
                                <div class="checkbox">
                                        <input class="{if $payment_method@first}payment_first{/if}" type=radio name=payment_method_id value='{$payment_method->id}' {if $payment_method@first}checked{/if} id=payment_{$payment_method->id}>
                                </div>			
                                        {$total_price_with_delivery = $cart->total_price}
                                        {if !$delivery->separate_payment}
                                            {$total_price_with_delivery = $cart->total_price + $delivery->price}
                                        {/if}
                                        <h3><label for=payment_{$payment_method->id}>	{$payment_method->name}, к оплате {$total_price_with_delivery|convert:$payment_method->currency_id} {$all_currencies[$payment_method->currency_id]->sign}</label></h3>
                                        <div class="description">
                                        {$payment_method->description}
                                        </div>
                        </li>
                    {/foreach}
                </ul>
            </div>
        {/if}
    {/foreach}
{/if}

также в самый конец добавить скрипт переключения оплаты в зависимости от выбранного способа доставки

 

<script>
    $(document).ready(function(){
      $("#deliveries .first").click();
    });    

  function change_payment_method($id) {
      $("#delivery_payment_"+$id+" .payment_first").attr('checked','checked');   
      $(".delivery_payment").css("display","none");
      $("#delivery_payment_"+$id).css("display","block");
  }
</script>
Ссылка на сообщение
Поделиться на другие сайты

не очень понял по поводу добавить после доставки. Раздел доставки у меня выглядит так 

{* Доставка *}
{if $deliveries}                
                
                    <div class="profile_block_head back3">Выберите способ доставки:
                    </div>
                    <div class="profile_block_body clearfix">
<ul id="deliveries" class="no">
	{foreach $deliveries as $delivery}
	<li>
		<div class="checkbox">
			<input type="radio" name="delivery_id" value="{$delivery->id}" {if $delivery_id==$delivery->id}checked{elseif $delivery@first}checked{/if} id="deliveries_{$delivery->id}">
		</div>
		
			<h3>
			<label for="deliveries_{$delivery->id}">
			{$delivery->name}
			{if $cart->total_price < $delivery->free_from && $delivery->price>0}
				({$delivery->price|convert} {$currency->sign})
			{elseif $cart->total_price >= $delivery->free_from}
				(бесплатно)
			{/if}
			</label>
			</h3>
			<div class="description">
			{$delivery->description}
			</div>
	</li>
	{/foreach}
</ul>
                    </div>
                  </div>

и вот после этого я добавил то, что Вы указали. Фик. ничего не изменилось вообще

Ссылка на сообщение
Поделиться на другие сайты

нужно немного изменить еще саму доставку, чтобы в итоге вышло так:

 

{* Доставка *}
{if $deliveries}
<h2>Выберите способ доставки:</h2>
<ul id="deliveries">
	{foreach $deliveries as $delivery}
	<li>
		<div class="checkbox">
			<input {if $delivery@first}class="first"{/if} onclick="change_payment_method({$delivery->id})"{*/*/order-on-one-page*/*} type="radio" name="delivery_id" value="{$delivery->id}" {if $delivery_id==$delivery->id}checked{elseif $delivery@first}checked{/if} id="deliveries_{$delivery->id}">
		</div>
		
			<h3>
			<label for="deliveries_{$delivery->id}">
			{$delivery->name}
			{if $cart->total_price < $delivery->free_from && $delivery->price>0}
				({$delivery->price|convert} {$currency->sign})
			{elseif $cart->total_price >= $delivery->free_from}
				(бесплатно)
			{/if}
			</label>
			</h3>
			<div class="description">
			{$delivery->description}
			</div>
	</li>
	{/foreach}
</ul>
{/if}

{* Оплата *}
{if $deliveries}
    {foreach $deliveries as $delivery}
        {if $delivery->payment_methods} 
            <div class="delivery_payment {if $delivery@first}first{/if}" id="delivery_payment_{$delivery->id}" style="display:none"  >             
                <h2>Выберите способ оплаты</h2>
                <ul id="deliveries">
                    {foreach  $delivery->payment_methods as $payment_method}
                        <li>
                                <div class="checkbox">
                                        <input class="{if $payment_method@first}payment_first{/if}" type=radio name=payment_method_id value='{$payment_method->id}' {if $payment_method@first}checked{/if} id=payment_{$payment_method->id}>
                                </div>			
                                        {$total_price_with_delivery = $cart->total_price}
                                        {if !$delivery->separate_payment}
                                            {$total_price_with_delivery = $cart->total_price + $delivery->price}
                                        {/if}
                                        <h3><label for=payment_{$payment_method->id}>	{$payment_method->name}, к оплате {$total_price_with_delivery|convert:$payment_method->currency_id} {$all_currencies[$payment_method->currency_id]->sign}</label></h3>
                                        <div class="description">
                                        {$payment_method->description}
                                        </div>
                        </li>
                    {/foreach}
                </ul>
            </div>
        {/if}
    {/foreach}
{/if}
Ссылка на сообщение
Поделиться на другие сайты

Ошибку выдает в view/CartView.php

 

$order->payment_method_id=$this->request->post('payment_method_id', 'integer');

и

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

Ссылка на сообщение
Поделиться на другие сайты

Warning: Creating default object from empty value in C:\OpenServer\domains\localhost\view\CartView.php on line 45

Warning: Cannot modify header information - headers already sent by (output started at
C:\OpenServer\domains\localhost\view\CartView.php:45) in C:\OpenServer\domains\localhost\view\CartView.php on line 126

Warning: Cannot modify header information - headers already sent by (output started at
C:\OpenServer\domains\localhost\view\CartView.php:45) in C:\OpenServer\domains\localhost\index.php on line 65

Изменено пользователем drakulitkas
Ссылка на сообщение
Поделиться на другие сайты

 

Ошибку выдает в view/CartView.php

 

$order->payment_method_id=$this->request->post('payment_method_id', 'integer');

и

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

 

поставьте 

$order->payment_method_id=$this->request->post('payment_method_id', 'integer');

после 

$order = new stdClass;

Ссылка на сообщение
Поделиться на другие сайты

итак в итоге:

 

в view/CartView.php после (строка 45):

if(isset($_POST['checkout']))
{
   $order = new stdClass;

добавляем:

$order->payment_method_id=$this->request->post('payment_method_id', 'integer');     

после (строка 172):

// Способы доставки
$deliveries = $this->delivery->get_deliveries(array('enabled'=>1));

добавляем выбор методов оплаты:

foreach($deliveries as $delivery)
      $delivery->payment_methods = $this->payment->get_payment_methods(array('delivery_id'=>$delivery->id, 'enabled'=>1));

в /design/themes/cart.tpl меняем:

{if $deliveries}
    {foreach $deliveries as $delivery}
        {if $delivery->payment_methods} 
            <div class="delivery_payment {if $delivery@first}first{/if}" id="delivery_payment_{$delivery->id}" style="display:none"  >             
                <h2>Выберите способ оплаты</h2>
                <ul id="deliveries">
                    {foreach  $delivery->payment_methods as $payment_method}
                        <li>
                                <div class="checkbox">
                                        <input class="{if $payment_method@first}payment_first{/if}" type=radio name=payment_method_id value='{$payment_method->id}' {if $payment_method@first}checked{/if} id=payment_{$payment_method->id}>
                                </div>			
                                        {$total_price_with_delivery = $cart->total_price}
                                        {if !$delivery->separate_payment}
                                            {$total_price_with_delivery = $cart->total_price + $delivery->price}
                                        {/if}
                                        <h3><label for=payment_{$payment_method->id}>	{$payment_method->name}, к оплате {$total_price_with_delivery|convert:$payment_method->currency_id} {$all_currencies[$payment_method->currency_id]->sign}</label></h3>
                                        <div class="description">
                                        {$payment_method->description}
                                        </div>
                        </li>
                    {/foreach}
                </ul>
            </div>
        {/if}
    {/foreach}
{/if}

на:

{* Доставка *}
{if $deliveries}
<h2>Выберите способ доставки:</h2>
<ul id="deliveries">
	{foreach $deliveries as $delivery}
	<li>
		<div class="checkbox">
			<input {if $delivery@first}class="first"{/if} onclick="change_payment_method({$delivery->id})"{*/*/order-on-one-page*/*} type="radio" name="delivery_id" value="{$delivery->id}" {if $delivery_id==$delivery->id}checked{elseif $delivery@first}checked{/if} id="deliveries_{$delivery->id}">
		</div>
		
			<h3>
			<label for="deliveries_{$delivery->id}">
			{$delivery->name}
			{if $cart->total_price < $delivery->free_from && $delivery->price>0}
				({$delivery->price|convert} {$currency->sign})
			{elseif $cart->total_price >= $delivery->free_from}
				(бесплатно)
			{/if}
			</label>
			</h3>
			<div class="description">
			{$delivery->description}
			</div>
	</li>
	{/foreach}
</ul>
{/if}

{* Оплата *}
{if $deliveries}
    {foreach $deliveries as $delivery}
        {if $delivery->payment_methods} 
            <div class="delivery_payment {if $delivery@first}first{/if}" id="delivery_payment_{$delivery->id}" style="display:none"  >             
                <h2>Выберите способ оплаты</h2>
                <ul id="deliveries">
                    {foreach  $delivery->payment_methods as $payment_method}
                        <li>
                                <div class="checkbox">
                                        <input class="{if $payment_method@first}payment_first{/if}" type=radio name=payment_method_id value='{$payment_method->id}' {if $payment_method@first}checked{/if} id=payment_{$payment_method->id}>
                                </div>			
                                        {$total_price_with_delivery = $cart->total_price}
                                        {if !$delivery->separate_payment}
                                            {$total_price_with_delivery = $cart->total_price + $delivery->price}
                                        {/if}
                                        <h3><label for=payment_{$payment_method->id}>	{$payment_method->name}, к оплате {$total_price_with_delivery|convert:$payment_method->currency_id} {$all_currencies[$payment_method->currency_id]->sign}</label></h3>
                                        <div class="description">
                                        {$payment_method->description}
                                        </div>
                        </li>
                    {/foreach}
                </ul>
            </div>
        {/if}
    {/foreach}
{/if}

в самый конец этого файла добавляем скрипт для переключения оплаты в зависимости от доставки:

<script>
    $(document).ready(function(){
      $("#deliveries .first").click();
    });    

  function change_payment_method($id) {
      $("#delivery_payment_"+$id+" .payment_first").attr('checked','checked');   
      $(".delivery_payment").css("display","none");
      $("#delivery_payment_"+$id).css("display","block");
  }
</script>
Ссылка на сообщение
Поделиться на другие сайты

а вот есть одна проблема. к примеру при заказе на сумму от 3000 рублей - доставка бесплатна. если меньше, то 300 рублей. и какую бы сумму заказа не набрал - доставка на странице заказа учитывается +300. а когда оформил, то уже идёт правильный пересчёт на следующей странице и там уже корректно. просто сбивает покупателя с толку сумма к оплате (3000+ сумма заказа)+300 за доставку. а в итоге просто 3000+

Ссылка на сообщение
Поделиться на другие сайты

а вот есть одна проблема. к примеру при заказе на сумму от 3000 рублей - доставка бесплатна. если меньше, то 300 рублей. и какую бы сумму заказа не набрал - доставка на странице заказа учитывается +300. а когда оформил, то уже идёт правильный пересчёт на следующей странице и там уже корректно. просто сбивает покупателя с толку сумма к оплате (3000+ сумма заказа)+300 за доставку. а в итоге просто 3000+

 

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

Ссылка на сообщение
Поделиться на другие сайты

Граждане, у меня смежный вопрос, хотел сделать при клике на "закончить заказ" чтобы ajax ом подгружало страничку с вариантами оплаты, но чего то не пойму почему не обрабатывает данные в POST

 

$('body').on('submit', 'form[name=cart]', function(){
    var form = $(this);
    var item_cart = $('#cart-in #item-content');
    var data = form.serialize();
    $.ajax({
        url: '/order/',
        type: 'POST',
        dataType: 'html',
        data: data,
    
    success: function(data){
                var cut_data = $(data).find('#qvw').html();
                item_cart.html(cut_data);

            }
    });
    return false;
    
});
Ссылка на сообщение
Поделиться на другие сайты
  • 1 год спустя...

Попробовал воспользоваться предложенным методом.

Работает.

 

Но обнаружились недостатки:

 

1. Методы оплаты извлекаются в цикле, по каждому методу доставки отдельно. Это создает излишнюю нагрузку на базу.

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

 

В итоге - весьма нерационально...

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...