wdrożenia PrestaShop

[PS.1.6]Ile pozostało do darmowej przesyłki

  • 7 Odpowiedzi
  • 3443 Wyświetleń

0 użytkowników i 1 Gość przegląda ten wątek.

*

Offline suriq

  • Nowy
  • *
  • 3
  • 0
  • PrestaShop: 1.5.6
  • Status: forum
[PS.1.6]Ile pozostało do darmowej przesyłki
« dnia: Luty 03, 2015, 02:47:22 am »
Witam,


Poszukuje rozwiązania, które pozwoli mi wyświetlić w koszyku informację, ile pozostało do darmowej przesyłki, nie wliczając kosztów przesyłki.
Dokładne działanie jakie chce osiągnąć jest następujące:
  • [size=78%]jeśli w koszyku nie ma żadnych produktów, informacja jest ukryta[/size]
  • jeśli do koszyka zostanie dodany produkt, informacja jest wyświetlana i automatycznie przeliczana
  • po przekroczeniu kwoty darmowej przesyłki, informacja jest ukrywana
Przeanalizowałem sobie rozwiązanie opisane tutaj
Opisana tam zmienna $cart->getOrderTotal(true) podaje pełną kwotę koszyka z wliczoną kwotą dostawy.
Więc nie o to chodzi.


Znalazłem również takie rozwiązanie ale nie wiem dlaczego {math} nie wylicza mi kwot.


Napisałem więc po swojemu w blockcart.tpl:


{assign var='freeshipping_price' value=Configuration::get('PS_SHIPPING_FREE_PRICE')}
<span>pozostało: {$freeshipping_price-$total+$shipping_cost}</span>



Niby liczy, ale:


1. Jest bardzo brzydko (cóż początkujący jestem, ale na pewno da sie jakoś ładniej)
2. Odświeża wartość tylko po odświeżeniu strony


Zacząłem więc szukać innego rozwiązania:
W pliku blockcart-jason.tpl znalazłem zmienną freeShipping, która dokładnie podaje mi od razu informację której potrzebuję, ale niestety nie przekazuje jej pomiędzy stronami (?). Albo nie wiem po prostu gdzie prawidłowo tego użyć - w tej chwili przekopiowuje tą wartość w funkcji odświeżającej koszyk:
$('.qfree-left-value').text(jsonData.freeShipping);
niestety nie działa to poprawnie.

Gdzieś dzwoni, ale nie wiadomo, w którym kościele.
Pomóżcie proszę, w jaki sposób najlepiej skonstruować takie rozwiązanie?


*

Offline west

  • Administrator
  • Mieszkaniec
  • *****
  • 5,292
  • 106
  • Płeć: Mężczyzna
  • Europasaz.pl
    • PrestaShop, Wordpress, SMF, Woocomerce
  • PrestaShop: 8.0
  • Status: Programista
Odp: [PS.1.6]Ile pozostało do darmowej przesyłki
« Odpowiedź #1 dnia: Luty 03, 2015, 07:32:25 am »
musisz wykorzystac ajax do aktualizacji wartości - czyli pliki js tematu zobacz np trena.pl
MODUŁY | https://europasaz.pl |  SKLEPY INTERNETOWE | WSPARCIE TECHNICZNE | HOSTING | https://europasaz.pl 

*

Offline suriq

  • Nowy
  • *
  • 3
  • 0
  • PrestaShop: 1.5.6
  • Status: forum
Odp: [PS.1.6]Ile pozostało do darmowej przesyłki
« Odpowiedź #2 dnia: Luty 15, 2015, 11:13:40 pm »
A czy mógłbyś troszkę to rozwinąć?
Walczyłem długo i intensywnie ale nie potrafię tego zrobić

*

Offline west

  • Administrator
  • Mieszkaniec
  • *****
  • 5,292
  • 106
  • Płeć: Mężczyzna
  • Europasaz.pl
    • PrestaShop, Wordpress, SMF, Woocomerce
  • PrestaShop: 8.0
  • Status: Programista
Odp: [PS.1.6]Ile pozostało do darmowej przesyłki
« Odpowiedź #3 dnia: Luty 16, 2015, 10:09:02 am »
zmienne do dodania / zmiany w blockcart.json
"freeShipping": {displayWtPrice|json_encode p=$free_shipping},
"freeShippingFloat": {$free_shipping|json_encode},
"amount_until_free_shipping" : "{$amount_until_free_shipping|html_entity_decode:2:'UTF-8'}",
"product_total": "{$product_total|html_entity_decode:2:'UTF-8'}",
"shipping_free_price": "{$shipping_free_price|html_entity_decode:2:'UTF-8'}",


blockcart.tpl
<p id="amount_fee_shipping">
  <span class = "ajax_shipping_free_price_span {if ($amount_until_free_shipping) le 0} hidden{/if}">{l s="Do darmowej dostawy pozostało:" mod="blockcart"}</span>
   <span class="ajax_shipping_free_price {if ($amount_until_free_shipping) le 0} hidden{/if}">{$amount_until_free_shipping} zł</span>
  <span class = "ajax_shipping_free_price_free_span {if ($amount_until_free_shipping) > 0} hidden {/if}">{l s="Darmowa dostawa za kwotę: " mod="blockcart"}</span> <span class="ajax_shipping_free_price_free {if ($amount_until_free_shipping) > 0} hidden {/if}">{$shipping_free_price} zł</span>
 </p>


ajaxcart.js
//update general cart informations everywhere in the page
updateCartEverywhere : function(jsonData){
$('.ajax_cart_total').text($.trim(jsonData.productTotal));
$('.ajax_shipping_free_price').text(jsonData.amount_until_free_shipping);
          if (parseFloat(jsonData.amount_until_free_shipping) > 0)
          {
               $('.ajax_shipping_free_price_span').each( function() {
                    $(this).removeClass('hidden');
               });


               $('.ajax_shipping_free_price_free_span').each( function() {
                    $(this).addClass('hidden');
               });
          }
          else
          {
               $('.ajax_shipping_free_price_span').each( function() {
                    $(this).addClass('hidden');
               });


               $('.ajax_shipping_free_price_free_span').each( function() {
                    $(this).removeClass('hidden');
               });
          }
if (parseFloat(jsonData.freeShippingFloat) > 0)
{
$('.ajax_cart_free_shipping').html(jsonData.freeShipping);
$('.freeshipping').removeClass('hidden');
}
else if (parseFloat(jsonData.freeShippingFloat) == 0)
$('.freeshipping').addClass('hidden');


blockcart.php
$shipping_free_price= Tools::convertPrice((float)(Configuration::get('PS_SHIPPING_FREE_PRICE')), $currency);


'shipping_free_price' => $shipping_free_price,
            'amount_until_free_shipping' => ($shipping_free_price - $params['cart']->getOrderTotal($useTax, Cart::BOTH_WITHOUT_SHIPPING)),
'free_shipping' => $total_free_shipping
MODUŁY | https://europasaz.pl |  SKLEPY INTERNETOWE | WSPARCIE TECHNICZNE | HOSTING | https://europasaz.pl 

*

Offline Seagarden

  • Nowy
  • *
  • 1
  • 0
  • prestashop
  • PrestaShop: 1.6
  • Status: forum
Odp: [PS.1.6]Ile pozostało do darmowej przesyłki
« Odpowiedź #4 dnia: Maj 20, 2015, 12:03:45 pm »
Witam

Chciałbym skorzystać z powyższych kodów niestety jest to trochę magia dla mnie. Czy mogę prosić o info w których wierszach dodać kod a w których podmienić.

*

Offline west

  • Administrator
  • Mieszkaniec
  • *****
  • 5,292
  • 106
  • Płeć: Mężczyzna
  • Europasaz.pl
    • PrestaShop, Wordpress, SMF, Woocomerce
  • PrestaShop: 8.0
  • Status: Programista
Odp: [PS.1.6]Ile pozostało do darmowej przesyłki
« Odpowiedź #5 dnia: Czerwiec 05, 2015, 06:37:51 pm »
nazwy plików są podane powyżej kodu do zamiany
lokalizacja plików
/modules/blockcart
themes/twojtemat/blockcart
MODUŁY | https://europasaz.pl |  SKLEPY INTERNETOWE | WSPARCIE TECHNICZNE | HOSTING | https://europasaz.pl 

*

Offline sasasa

  • Nowy
  • *
  • 19
  • 0
  • prestashop
  • PrestaShop: 1.6
  • Status: Programista
Odp: [PS.1.6]Ile pozostało do darmowej przesyłki
« Odpowiedź #6 dnia: Sierpień 11, 2015, 08:49:13 pm »
Witam,

W ostatnim etapie po zmianach w pliku "blockcart.php" strona mi się "psuje" i dostajemy biały ekran. Wersja presty 1.6.0


Podsyłam kod mojego pliku blockcart.php:

<?php
/*
* 2007-2014 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author PrestaShop SA <contact@prestashop.com>
*  @copyright  2007-2014 PrestaShop SA
*  @license    http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

if (!defined('_PS_VERSION_'))
    exit;

class 
BlockCart extends Module
{
    public function 
__construct()
    {
        
$this->name 'blockcart';
        
$this->tab 'front_office_features';
        
$this->version '1.5.7';
        
$this->author 'PrestaShop';
        
$this->need_instance 0;

        
$this->bootstrap true;
        
parent::__construct();

        
$this->displayName $this->l('Cart block');
        
$this->description $this->l('Adds a block containing the customer\'s shopping cart.');
        
$this->ps_versions_compliancy = array('min' => '1.6''max' => _PS_VERSION_);
    }

    public function 
assignContentVars($params)
    {
        global 
$errors;

        
// Set currency
        
if ((int)$params['cart']->id_currency && (int)$params['cart']->id_currency != $this->context->currency->id)
            
$currency = new Currency((int)$params['cart']->id_currency);
        else
            
$currency $this->context->currency;

        
$taxCalculationMethod Group::getPriceDisplayMethod((int)Group::getCurrent()->id);

        
$useTax = !($taxCalculationMethod == PS_TAX_EXC);

        
$products $params['cart']->getProducts(true);
        
$nbTotalProducts 0;
        foreach (
$products as $product)
            
$nbTotalProducts += (int)$product['cart_quantity'];
        
$cart_rules $params['cart']->getCartRules();

        if (empty(
$cart_rules))
            
$base_shipping $params['cart']->getOrderTotal($useTaxCart::ONLY_SHIPPING);
        else
        {
            
$base_shipping_with_tax    $params['cart']->getOrderTotal(trueCart::ONLY_SHIPPING);
            
$base_shipping_without_tax $params['cart']->getOrderTotal(falseCart::ONLY_SHIPPING);
            if (
$useTax)
                
$base_shipping $base_shipping_with_tax;
            else
                
$base_shipping $base_shipping_without_tax;
        }
        
$shipping_cost Tools::displayPrice($base_shipping$currency);
        
$shipping_cost_float Tools::convertPrice($base_shipping$currency);
        
$wrappingCost = (float)($params['cart']->getOrderTotal($useTaxCart::ONLY_WRAPPING));
        
$totalToPay $params['cart']->getOrderTotal($useTax);

        if (
$useTax && Configuration::get('PS_TAX_DISPLAY') == 1)
        {
            
$totalToPayWithoutTaxes $params['cart']->getOrderTotal(false);
            
$this->smarty->assign('tax_cost'Tools::displayPrice($totalToPay $totalToPayWithoutTaxes$currency));
        }

        
// The cart content is altered for display
        
foreach ($cart_rules as &$cart_rule)
        {
            if (
$cart_rule['free_shipping'])
            {
                
$shipping_cost Tools::displayPrice(0$currency);
                
$shipping_cost_float 0;
                
$cart_rule['value_real'] -= Tools::convertPrice($base_shipping_with_tax$currency);
                
$cart_rule['value_tax_exc'] = Tools::convertPrice($base_shipping_without_tax$currency);
            }
            if (
$cart_rule['gift_product'])
            {
                foreach (
$products as &$product)
                    if (
$product['id_product'] == $cart_rule['gift_product']
                        && 
$product['id_product_attribute'] == $cart_rule['gift_product_attribute'])
                    {
                        
$product['is_gift'] = 1;
                        
$product['total_wt'] = Tools::ps_round($product['total_wt'] - $product['price_wt'],
                            (int)
$currency->decimals _PS_PRICE_DISPLAY_PRECISION_);
                        
$product['total'] = Tools::ps_round($product['total'] - $product['price'],
                            (int)
$currency->decimals _PS_PRICE_DISPLAY_PRECISION_);
                        
$cart_rule['value_real'] = Tools::ps_round($cart_rule['value_real'] - $product['price_wt'],
                            (int)
$currency->decimals _PS_PRICE_DISPLAY_PRECISION_);
                        
$cart_rule['value_tax_exc'] = Tools::ps_round($cart_rule['value_tax_exc'] - $product['price'],
                            (int)
$currency->decimals _PS_PRICE_DISPLAY_PRECISION_);
                    }
            }
            
        }

    
        
        
        
        
$total_free_shipping 0;
        if (
$free_shipping Tools::convertPrice(floatval(Configuration::get('PS_SHIPPING_FREE_PRICE')), $currency))
        {
            
$total_free_shipping =  floatval($free_shipping - ($params['cart']->getOrderTotal(trueCart::ONLY_PRODUCTS) +
                
$params['cart']->getOrderTotal(trueCart::ONLY_DISCOUNTS)));
            
$discounts $params['cart']->getCartRules(CartRule::FILTER_ACTION_SHIPPING);
            if (
$total_free_shipping 0)
                
$total_free_shipping 0;
            if (
is_array($discounts) && count($discounts))
                
$total_free_shipping 0;
        }
        
        
        
        
        
        

        
$this->smarty->assign(array(
            
'products' => $products,
            
'customizedDatas' => Product::getAllCustomizedDatas((int)($params['cart']->id)),
            
'CUSTOMIZE_FILE' => Product::CUSTOMIZE_FILE,
            
'CUSTOMIZE_TEXTFIELD' => Product::CUSTOMIZE_TEXTFIELD,
            
'discounts' => $cart_rules,
            
'nb_total_products' => (int)($nbTotalProducts),
            
'shipping_cost' => $shipping_cost,
            
'shipping_cost_float' => $shipping_cost_float,
            
'show_wrapping' => $wrappingCost true false,
            
'show_tax' => (int)(Configuration::get('PS_TAX_DISPLAY') == && (int)Configuration::get('PS_TAX')),
            
'wrapping_cost' => Tools::displayPrice($wrappingCost$currency),
            
'product_total' => Tools::displayPrice($params['cart']->getOrderTotal($useTaxCart::BOTH_WITHOUT_SHIPPING), $currency),
            
'total' => Tools::displayPrice($totalToPay$currency),
            
'order_process' => Configuration::get('PS_ORDER_PROCESS_TYPE') ? 'order-opc' 'order',
            
'ajax_allowed' => (int)(Configuration::get('PS_BLOCK_CART_AJAX')) == true false,
            
'static_token' => Tools::getToken(false),
            
'free_shipping' => $total_free_shipping
        
));
        if (
count($errors))
            
$this->smarty->assign('errors'$errors);
        if (isset(
$this->context->cookie->ajax_blockcart_display))
            
$this->smarty->assign('colapseExpandStatus'$this->context->cookie->ajax_blockcart_display);
    }

    public function 
getContent()
    {
        
$output '';
        if (
Tools::isSubmit('submitBlockCart'))
        {
            
$ajax Tools::getValue('PS_BLOCK_CART_AJAX');
            if (
$ajax != && $ajax != 1)
                
$output .= $this->displayError($this->l('Ajax: Invalid choice.'));
            else
                
Configuration::updateValue('PS_BLOCK_CART_AJAX', (int)($ajax));

            if ((
$productNbr = (int)Tools::getValue('PS_BLOCK_CART_XSELL_LIMIT') < 0))
                
$output .= $this->displayError($this->l('Please complete the "Products to display" field.'));
            else
            {
                
Configuration::updateValue('PS_BLOCK_CART_XSELL_LIMIT', (int)(Tools::getValue('PS_BLOCK_CART_XSELL_LIMIT')));
                
$output .= $this->displayConfirmation($this->l('Settings updated'));
            }

            
Configuration::updateValue('PS_BLOCK_CART_SHOW_CROSSSELLING', (int)(Tools::getValue('PS_BLOCK_CART_SHOW_CROSSSELLING')));
        }
        return 
$output.$this->renderForm();
    }

    public function 
install()
    {
        if (
            
parent::install() == false
            
|| $this->registerHook('top') == false
            
|| $this->registerHook('header') == false
            
|| $this->registerHook('actionCartListOverride') == false
            
|| Configuration::updateValue('PS_BLOCK_CART_AJAX'1) == false
            
|| Configuration::updateValue('PS_BLOCK_CART_XSELL_LIMIT'12) == false
            
|| Configuration::updateValue('PS_BLOCK_CART_SHOW_CROSSSELLING'1) == false)
            return 
false;
        return 
true;
    }

    public function 
hookRightColumn($params)
    {
        if (
Configuration::get('PS_CATALOG_MODE'))
            return;

        
// @todo this variable seems not used
        
$this->smarty->assign(array(
            
'order_page' => (strpos($_SERVER['PHP_SELF'], 'order') !== false),
            
'blockcart_top' => (isset($params['blockcart_top']) && $params['blockcart_top']) ? true false,
        ));
        
$this->assignContentVars($params);
        return 
$this->display(__FILE__'blockcart.tpl');
    }

    public function 
hookLeftColumn($params)
    {
        return 
$this->hookRightColumn($params);
    }

    public function 
hookAjaxCall($params)
    {
        if (
Configuration::get('PS_CATALOG_MODE'))
            return;

        
$this->assignContentVars($params);
        
$res Tools::jsonDecode($this->display(__FILE__'blockcart-json.tpl'), true);

        if (
is_array($res) && ($id_product Tools::getValue('id_product')) && Configuration::get('PS_BLOCK_CART_SHOW_CROSSSELLING'))
        {
            
$this->smarty->assign('orderProducts'OrderDetail::getCrossSells($id_product$this->context->language->id,
                
Configuration::get('PS_BLOCK_CART_XSELL_LIMIT')));
            
$res['crossSelling'] = $this->display(__FILE__'crossselling.tpl');
        }

        
$res Tools::jsonEncode($res);
        return 
$res;
    }

    public function 
hookActionCartListOverride($params)
    {
        if (!
Configuration::get('PS_BLOCK_CART_AJAX'))
            return;

        
$this->assignContentVars(array('cookie' => $this->context->cookie'cart' => $this->context->cart));
        
$params['json'] = $this->display(__FILE__'blockcart-json.tpl');
    }

    public function 
hookHeader()
    {
        if (
Configuration::get('PS_CATALOG_MODE'))
            return;

        
$this->context->controller->addCSS(($this->_path).'blockcart.css''all');
        if ((int)(
Configuration::get('PS_BLOCK_CART_AJAX')))
        {
            
$this->context->controller->addJS(($this->_path).'ajax-cart.js');
            
$this->context->controller->addJqueryPlugin(array('scrollTo''serialScroll''bxslider'));
        }
    }

    public function 
hookTop($params)
    {
        
$params['blockcart_top'] = true;
        return 
$this->hookRightColumn($params);
    }

    public function 
hookDisplayNav($params)
    {
        
$params['blockcart_top'] = true;
        return 
$this->hookTop($params);
    }

    public function 
renderForm()
    {
        
$fields_form = array(
            
'form' => array(
                
'legend' => array(
                    
'title' => $this->l('Settings'),
                    
'icon' => 'icon-cogs'
                
),
                
'input' => array(
                    array(
                        
'type' => 'switch',
                        
'label' => $this->l('Ajax cart'),
                        
'name' => 'PS_BLOCK_CART_AJAX',
                        
'is_bool' => true,
                        
'desc' => $this->l('Activate Ajax mode for the cart (compatible with the default theme).'),
                        
'values' => array(
                                array(
                                    
'id' => 'active_on',
                                    
'value' => 1,
                                    
'label' => $this->l('Enabled')
                                ),
                                array(
                                    
'id' => 'active_off',
                                    
'value' => 0,
                                    
'label' => $this->l('Disabled')
                                )
                            ),
                        ),
                    array(
                        
'type' => 'switch',
                        
'label' => $this->l('Show cross-selling'),
                        
'name' => 'PS_BLOCK_CART_SHOW_CROSSSELLING',
                        
'is_bool' => true,
                        
'desc' => $this->l('Activate cross-selling display for the cart.'),
                        
'values' => array(
                                array(
                                    
'id' => 'active_on',
                                    
'value' => 1,
                                    
'label' => $this->l('Enabled')
                                ),
                                array(
                                    
'id' => 'active_off',
                                    
'value' => 0,
                                    
'label' => $this->l('Disabled')
                                )
                            ),
                        ),
                    array(
                        
'type' => 'text',
                        
'label' => $this->l('Products to display in cross-selling'),
                        
'name' => 'PS_BLOCK_CART_XSELL_LIMIT',
                        
'class' => 'fixed-width-xs',
                        
'desc' => $this->l('Define the number of products to be displayed in the cross-selling block.')
                    ),
                ),
                
'submit' => array(
                    
'title' => $this->l('Save')
                )
            ),
        );

        
$helper = new HelperForm();
        
$helper->show_toolbar false;
        
$helper->table =  $this->table;
        
$lang = new Language((int)Configuration::get('PS_LANG_DEFAULT'));
        
$helper->default_form_language $lang->id;
        
$helper->allow_employee_form_lang Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;
        
$this->fields_form = array();

        
$helper->identifier $this->identifier;
        
$helper->submit_action 'submitBlockCart';
        
$helper->currentIndex $this->context->link->getAdminLink('AdminModules'false).'&configure='.$this->name.'&tab_module='.$this->tab
        
.'&module_name='.$this->name;
        
$helper->token Tools::getAdminTokenLite('AdminModules');
        
$helper->tpl_vars = array(
            
'fields_value' => $this->getConfigFieldsValues(),
            
'languages' => $this->context->controller->getLanguages(),
            
'id_language' => $this->context->language->id
        
);

        return 
$helper->generateForm(array($fields_form));
    }

    public function 
getConfigFieldsValues()
    {
        return array(
            
'PS_BLOCK_CART_AJAX' => (bool)Tools::getValue('PS_BLOCK_CART_AJAX'Configuration::get('PS_BLOCK_CART_AJAX')),
            
'PS_BLOCK_CART_SHOW_CROSSSELLING' => (bool)Tools::getValue('PS_BLOCK_CART_SHOW_CROSSSELLING'Configuration::get('PS_BLOCK_CART_SHOW_CROSSSELLING')),
            
'PS_BLOCK_CART_XSELL_LIMIT' => (int)Tools::getValue('PS_BLOCK_CART_XSELL_LIMIT'Configuration::get('PS_BLOCK_CART_XSELL_LIMIT'))
        );
    }
}


 oraz proszę o poradę w którym miejscu umieścić wyżej wspomniany kod:


$shipping_free_price= Tools::convertPrice((float)(Configuration::get('PS_SHIPPING_FREE_PRICE')), $currency);

'shipping_free_price' => $shipping_free_price,
            'amount_until_free_shipping' => ($shipping_free_price - $params['cart']->getOrderTotal($useTax, Cart::BOTH_WITHOUT_SHIPPING)),
'free_shipping' => $total_free_shipping


Dziękuje bardzo za pomoc.

*

Offline mudol

  • Nowy
  • *
  • 6
  • 0
  • prestashop
  • PrestaShop: 1.6.1
  • Status: forum
Odp: [PS.1.6]Ile pozostało do darmowej przesyłki
« Odpowiedź #7 dnia: Wrzesień 30, 2015, 11:58:01 am »
Witam

@West, mógłbyś dokładniej opisać w którym miejscu gdzie co wstawić?

W ps1.6 nie widzę pliku blockcart.json, jest blockcart.json.tpl, ale co z resztą?