Jump to content

Koszyk aktywny tylko dla zalogowanych - tylko jak?


grayling

Recommended Posts

             Witam.
Presta 1.6.1.23
Zamarzyła mi się rzecz następująca: ponieważ sklep prowadzi (głównie) sprzedaż hurtową, klienci niezarejestrowani nie powinni móc dokonywać zakupów. Widzą w sklepie wszystko, z cenami włącznie, ale koszyk ma pozostawać dla nich nieaktywny, aż do momentu zalogowania.
Można to niby zrobić z BO, stosując odpowiednie ustawienia dla grupy klientów niezalogowanych, ale to rozwiązanie jest raczej pozorne - zbyt dużo obejść. Jeżeli klient mniej więcej zna Prestę, kupi towar i tak, docierając do jego karty choćby po adresie. 
Czyli pozostaje zabawa z kodem. W product-list.tpl przycisk "Dodaj do koszyka" opatrzyłem warunkami, jak w kodzie poniżej. Zachowuje się to teraz "prawie" poprawnie - do momentu zalogowania klient zamiast "Dodaj do koszyka" widzi "Zaloguj się" ("Log In Please" dodane do tłumaczenia szablonu). Tyle tylko, że kiedy po zalogowaniu pokazuje się "Dodaj do koszyka", po kliknięciu przycisku jedyne, co się dzieje, to półprzezroczysta warstwa na całości strony (możliwa do usunięcia kliknięciem w dowolnym miejscu). Fragment program-list.tpl wygląda tak:

               <div class="button-container">
                            {if ($product.id_product_attribute == 0 || (isset($add_prod_display) && ($add_prod_display == 1))) && $product.available_for_order && !isset($restricted_country_mode) && $product.minimal_quantity <= 1 && $product.customizable != 2 && !$PS_CATALOG_MODE}
                                {if (!isset($product.customization_required) || !$product.customization_required) && ($product.allow_oosp || $product.quantity > 0)}
                                    {if isset($static_token)}
                       {if (!$cookie->isLogged())  }
                                   <a class="ajax_add_to_cart_button btn btn-default" href="https://domena_sklepu/logowanie?back=my-account" rel="follow" title="{l s='Log In Please'}" data-id-product="{$product.id_product|intval}">
                                            <span>{l s='Log In Please'}</span>
                                        </a>
                                   {else}
                                        <a class="ajax_add_to_cart_button btn btn-default" href="{$link->getPageLink('cart',false, NULL, 'add=1&amp;id_product={$product.id_product|intval}', false)|escape:'html':'UTF-8'}" rel="nofollow" title="{l s='Add to cart'}" data-id-product="{$product.id_product|intval}">
                                            <span>{l s='Add to cart'}</span>
                                        </a>
                                        {/if}
                                    {else}
                       {if (!$cookie->isLogged())  }
                                    
                                        <a class="ajax_add_to_cart_button btn btn-default" href="https://domena_sklepu/logowanie?back=my-account" rel="follow" title="{l s='Log In Please'}" data-id-product="{$product.id_product|intval}">
                                            <span>{l s='Log In Please'}</span>
                                        </a>
                                    (else}
                                         <a class="ajax_add_to_cart_button btn btn-default" href="{$link->getPageLink('cart',false, NULL, 'add=1&amp;id_product={$product.id_product|intval}', false)|escape:'html':'UTF-8'}" rel="nofollow" title="{l s='Add to cart'}" data-id-product="{$product.id_product|intval}">
                                            <span>{l s='Add to cart'}</span>
                                    {/if}
                                    {/if}                        
      
                                {else}
                       {if (!$cookie->isLogged())  }
                               <span class="ajax_add_to_cart_button btn btn-default disabled">
                               <span>{l s='Log In Please'}</span>
                                    </span>
                                    
                                    {else}
                                    <span class="ajax_add_to_cart_button btn btn-default disabled">
                                        <span>{l s='Add to cart'}</span>
                                    </span>
                                  {/if}
                            {/if}
                      {/if}

Czy błąd jest gdzieś w tym fragmencie? Czy też sterowanie przyciskiem "Dodaj do koszyka" wcale nie kończy się na tym tpl-u i należy wprowadzić zmiany w jeszcze innych plikach?
_PS_MODE_DEV_ ustawione na 'true', błędów żadnych nie wyrzuca, czyli jakiegoś typowego błędu składniowego nie ma. Wynika z tego, że źle myślę.
Znalazłby ktoś chwilkę, żeby mi to myślenie wyprostować?

Pozdrawiam,
Grayling

 

Link to comment
Share on other sites

Warunek sprawdzający czy klient jest zalogowany można pominąć sprawdzanie w cookies wystarczy użyć {if $is_logged} Zalogowany {else} Niezalogowany {/if} natomiast klasa ajax_add_to_cart za pewne odnosi się do funkcji w product.js więc nie jest Ci potrzebna w przycisku Zaloguj się ponieważ nie chcesz aby była wykonana jakaś akcja na koszyku. Generalnie dla niezalogowanych klientów dobrym pomysłem jest wyłączenie modułu koszyka.

Link to comment
Share on other sites

Endriu, bardzo dzięki za zainteresowanie.

Zmieniłem trochę w tym przycisku koszyka. Ajaxa wywołuje product-list.tpl z szablonu defaultowego i ze wszystkich możliwych innych szablonów (trochę tego przejrzałem) - czyli nie ma chyba co z tym wojować, zostawiłem w tym warunku. No i wygląda na to, że miesza chyba właśnie Ajax, bo wszystko zachowuje się dokładnie tak, jak poprzednio, czyli: przed zalogowaniem przycisk koszyka jest widoczny, tyle że ma napis "Zaloguj się" i linkuje do strony logowania albo zakładania konta. Po zalogowaniu przycisk ma już napis "Dodaj do koszyka", tyle że nie działa. Na ekran wywoływana jest z css klasa .layer_cart_overlay (przyszarzona całość strony). Tego .layer_cart_overlay na pewno nie wywołuje product-list.tpl. Czyli koszyk musi być blokowany w jakimś zupełnie innym miejscu. Obsługa przycisku wygląda teraz tak:

<div class="button-container">
					
					{if $is_logged}
					
						{if ($product.id_product_attribute == 0 || (isset($add_prod_display) && ($add_prod_display == 1))) && $product.available_for_order && !isset($restricted_country_mode) && $product.customizable != 2 && !$PS_CATALOG_MODE}
							{if (!isset($product.customization_required) || !$product.customization_required) && ($product.allow_oosp || $product.quantity > 0)}
								{capture}add=1&amp;id_product={$product.id_product|intval}{if isset($product.id_product_attribute) && $product.id_product_attribute}&amp;ipa={$product.id_product_attribute|intval}{/if}{if isset($static_token)}&amp;token={$static_token}{/if}{/capture}
								<a class="button ajax_add_to_cart_button btn btn-default" href="{$link->getPageLink('cart', true, NULL, $smarty.capture.default, false)|escape:'html':'UTF-8'}" rel="nofollow" title="{l s='Add to cart'}" data-id-product-attribute="{$product.id_product_attribute|intval}" data-id-product="{$product.id_product|intval}" data-minimal_quantity="{if isset($product.product_attribute_minimal_quantity) && $product.product_attribute_minimal_quantity >= 1}{$product.product_attribute_minimal_quantity|intval}{else}{$product.minimal_quantity|intval}{/if}">
									<span>{l s='Add to cart'}</span>
								</a>
							{else}
								<span class="button ajax_add_to_cart_button btn btn-default disabled">
									<span>{l s='Add to cart'}</span>
								</span>
							{/if}
						{/if}
			{else}
				
						{if ($product.id_product_attribute == 0 || (isset($add_prod_display) && ($add_prod_display == 1))) && $product.available_for_order && !isset($restricted_country_mode) && $product.customizable != 2 && !$PS_CATALOG_MODE}
							{if (!isset($product.customization_required) || !$product.customization_required) && ($product.allow_oosp || $product.quantity > 0)}
								{capture}add=1&amp;id_product={$product.id_product|intval}{if isset($product.id_product_attribute) && $product.id_product_attribute}&amp;ipa={$product.id_product_attribute|intval}{/if}{if isset($static_token)}&amp;token={$static_token}{/if}{/capture}
								<a class="button ajax_add_to_cart_button btn btn-default" href="http://domena_sklepu.net/hurt/logowanie?back=my-account" rel="nofollow" title="{l s='Log In Please'}" data-id-product-attribute="{$product.id_product_attribute|intval}" data-id-product="{$product.id_product|intval}" data-minimal_quantity="{if isset($product.product_attribute_minimal_quantity) && $product.product_attribute_minimal_quantity >= 1}{$product.product_attribute_minimal_quantity|intval}{else}{$product.minimal_quantity|intval}{/if}">
									<span>{l s='Log In Please'}</span>
								</a>
							{else}
								<span class="button ajax_add_to_cart_button btn btn-default disabled">
									<span>{l s='Log In Please'}</span>
								</span>
							{/if}
						{/if}
						{/if}

Tm razem jest to przerobiony kawałek z szablonu defaultowego. Nie różni się specjalnie od wersji poprzedniej - tak jak proponowałeś, zmieniona jest tylko kolejność sprawdzania, nie są też sprawdzane cookies. Czyli tak jak poprzednio: dzieje się to, co się dziać powinno, ale po zalogowaniu i uzyskaniu dostępu do koszyka nie daje się go użyć. Zaczynam po trochu wymiękać.

Jeszcze raz dzięki, pozdrawiam,
Grayling

Link to comment
Share on other sites

Czy po usunięciu zmian koszyk działa poprawnie?  W konsoli przeglądarki masz jakieś błędy? Overlay może być wywoływany przez css szablonu natomiast sam popup-owy koszyk powinien być wywołany z modułu koszyka, może on nie jest aktywny?

Link to comment
Share on other sites

Tak, po przywróceniu poprzedniej postaci product-list.tpl koszyk działa tak, jak powinien. Ta półprzezroczysta warstwa na całości okna ( .layer_cart_overlay, zdefiniowane w blockcart.css ) pojawia się tylko w sytuacji, kiedy do product-list.tpl jest wprowadzony któryś z opisanych wyżej wariantów zmiany, odwiedzający się loguje, uzyskuje dostęp do koszyka i naciska przycisk "Dodaj do koszyka". Po wycofaniu zmian i przywróceniu poprzedniej postaci product-list.tpl wszystko działa najzupełniej poprawnie. Definicja layer_cart_overlay istnieje też w stylu dla blockcart szablonu defaultowego i jest identyczna, jak w moim szablonie.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...