Jump to content

Recommended Posts

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

Link to post
Share on other sites

в 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>
Link to post
Share on other sites

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

{* Доставка *}
{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>

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

Link to post
Share on other sites

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

 

{* Доставка *}
{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}
Link to post
Share on other sites

Ошибку выдает в 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);

Link to post
Share on other sites

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

Edited by drakulitkas
Link to post
Share on other sites

 

Ошибку выдает в 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;

Link to post
Share on other sites

итак в итоге:

 

в 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>
Link to post
Share on other sites

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

Link to post
Share on other sites

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

 

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

Link to post
Share on other sites

Граждане, у меня смежный вопрос, хотел сделать при клике на "закончить заказ" чтобы 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;
    
});
Link to post
Share on other sites
  • 1 year later...

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

Работает.

 

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

 

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

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

 

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

Link to post
Share on other sites

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...