Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problem z wyborem banku z #332

Open
MajsterKlepka opened this issue Jul 24, 2024 · 9 comments
Open

Problem z wyborem banku z #332

MajsterKlepka opened this issue Jul 24, 2024 · 9 comments

Comments

@MajsterKlepka
Copy link

Wybór banku z poziomu checkoutu przestał działać.
Po kliknięciu w wybrany bank radio się zaznacza, ale nie dodaje się klasa "payMethodActive".

Do checkoutu używamy modułu "The Checkout" (https://addons.prestashop.com/en/express-checkout-process/42005-the-checkout.html)

image

Do zeszłego tygodnia ten problem nie występował, pojawił się po ostatniej awarii PayU.

PayU w wersji: 3.2.20
The Checkout: 3.3.10
Prestashop: 8.0.4
PHP: 7.4.33

@regdos
Copy link
Contributor

regdos commented Jul 30, 2024

Proszę o udostępnienie adresu sklepu.

@MajsterKlepka
Copy link
Author

https://feelgood.pl/

@regdos
Copy link
Contributor

regdos commented Jul 31, 2024

Tylko teraz chyba jest wyłączona lista banków więc nie można sprawdzić co się dzieje.

@MajsterKlepka
Copy link
Author

MajsterKlepka commented Jul 31, 2024 via email

@regdos
Copy link
Contributor

regdos commented Jul 31, 2024

W standardowym checkout Prestashop każde radio do wyboru metody płatności generowane jest następująco:

<input id="payment-option-Y" class="ps-shown-by-js " data-module-name="XXXX" name="payment-option" type="radio" required="">

gdzie zamiast XXXX wstawiana jest nazwa moduły czyli dla wszystkich metod PayU wygląda to:

<input id="payment-option-Y" class="ps-shown-by-js " data-module-name="payu" name="payment-option" type="radio" required="">

Natomiast w Waszym sklepie wygląda to tak:

<input id="payment-option-1" class="ps-shown-by-js " data-module-name="payu-8fd70" name="payment-option" type="radio" required="">​
<input id="payment-option-2" class="ps-shown-by-js " data-module-name="payu-f4dee" name="payment-option" type="radio" required="">​
<input id="payment-option-3" class="ps-shown-by-js " data-module-name="payu-0961b" name="payment-option" type="radio" required="">​
<input id="payment-option-4" class="ps-shown-by-js " data-module-name="payu-f9ef1" name="payment-option" type="radio" required="">​
<input id="payment-option-5" class="ps-shown-by-js " data-module-name="payu-f9ef1" name="payment-option" type="radio" required="">

W data-module-name do wartości payu dodawany jest losowy ciąg znaków i dlatego nie zapinają się akcje na kliknięcia.
Moje przypuszczenie jest takie, że The Checkout to robi ponieważ on zastępuje standardową stronę checkout w Prestasshop.

@MajsterKlepka
Copy link
Author

MajsterKlepka commented Aug 1, 2024

The Checkout dodaje do data-module-name MD5 z nazwy call to action:

// Some payment modules (e.g. paynow) do not always return same order of payment methods, so we need an ID that would be unique for every option
        foreach ($paymentMethods['payment_options'] as $modName => &$options) {
            foreach ($options as &$option) {
                // ps_checkout needs exact data-module-name attribute, it won't initialize widget otherwise

                if ($modName == 'ps_checkout' || (0 === strpos($modName, 'paypal')) || strpos($modName, 'przelewy-method') === 0 || strpos($modName, 'payu') === 0) {
                    $option['call_to_action_text_md5'] = '';
                } else {
                    $option['call_to_action_text_md5'] = '-' . substr(md5($option['call_to_action_text']), -5);
                }
            }
        }

Dodaliśmy PayU do wyjątków i obecnie wygląda to standardowo:

<input class="ps-shown-by-js " id="payment-option-3" data-module-name="payu" name="payment-option" type="radio" required="">

Nadal nie zapinają się akcje na kliknięcia

@regdos
Copy link
Contributor

regdos commented Aug 1, 2024

Zgada się, ponieważ najpierw jest wczytywany plik payu17.js a potem po wczytaniu ajax-em renderowana jest zawartość z listą bramek. W tym skrypcie jest kod zapinający listener na kliknięcia:

(function () {
    document.addEventListener("DOMContentLoaded", function () {
    .....
        document.querySelectorAll('[name=payment-option][data-module-name=payu]').forEach(function (element) {
            element.addEventListener('click', function (ev) {
    .....

a w momencie jego uruchomienia (zdarzenie DOMContentLoaded czyli gdy zostanie przeparsowany HTML i wszystkie skrypty deffer zostaną załadowane) nie ma jeszcze wczytanych i pokazanych ikon banków więc ten selektor przed forEach daje pustą listę.
Może da się jakoś przekonfigurować żeby The Checkout inaczej wczytywał metodę lub skrypt?
Można też spróbować zmienić listener DOMContentLoaded na load, który jest uruchamiany po wczytaniu wszystkich zasobów, choć w tym przypadku mam wątpliwość czy to pomoże.

@jjsfatllc
Copy link

Kliknąłem pełen nadziei na rozwiązanie problemu - skoro to temat jest z zeszłego roku, ale nie...
Sugerowane rozwiazania nie przyniosły efektu.
PS 8.1.7 , The Checkout 3.3.12, moduł 3.2.20

@regdos
Copy link
Contributor

regdos commented Jan 30, 2025

Bo problem jest po stronie The Checkout i do nich należy zgłosić problem.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants