grayling Posted March 23, 2019 Share Posted March 23, 2019 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&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&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 More sharing options...
endriu107 Posted March 24, 2019 Share Posted March 24, 2019 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 More sharing options...
grayling Posted March 24, 2019 Author Share Posted March 24, 2019 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&id_product={$product.id_product|intval}{if isset($product.id_product_attribute) && $product.id_product_attribute}&ipa={$product.id_product_attribute|intval}{/if}{if isset($static_token)}&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&id_product={$product.id_product|intval}{if isset($product.id_product_attribute) && $product.id_product_attribute}&ipa={$product.id_product_attribute|intval}{/if}{if isset($static_token)}&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 More sharing options...
endriu107 Posted March 24, 2019 Share Posted March 24, 2019 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 More sharing options...
grayling Posted March 24, 2019 Author Share Posted March 24, 2019 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now