SUPEE-9767 Patch / CE 1.9.3.3 - Оформлення однієї сторінки - Реєстрація клієнта


19

На чистій, ванільній установці Magento 1.9.2.4, зафіксованої на SUPEE-8788, SUPEE-9652 та SUPEE-9767, та з новим налаштуванням "Увімкнути перевірку клавіш форми під час оформлення замовлення" після успішної нової реєстрації клієнта на реєстрації замовлення на одній сторінці за замовчуванням, новий клієнт не створюється і клієнт не входить у систему, хоча замовлення проходить непогано.

Якщо вимкнути параметр "Увімкнути перевірку клавіші форми на касі", це знову працює. Хтось ще мав це питання? Здається, не має значення, які способи доставки / оплати використовуються.

З тих пір я намагався це зробити зі свіжою, незмінною установкою Magento 1.9.3.3, і, схоже, це те саме питання. Під час реєстрації нового клієнта через одну сторінку оформлення замовлення жоден клієнт не створюється, навіть якщо замовлення проходить штраф, доки не буде включено налаштування "Увімкнути перевірку клавіш форми при оформленні замовлення".

Відповіді:


36

Добре ось справді виправлена ​​помилка, яку я придумав.

Відредагуйте /skin/frontend/base/default/js/opcheckout.jsта відредагуйте setMethod()метод, замінивши:

setMethod: function(){
    if ($('login:guest') && $('login:guest').checked) {
        this.method = 'guest';
        new Ajax.Request(
            this.saveMethodUrl,
            {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'guest'}}
        );
        Element.hide('register-customer-password');
        this.gotoSection('billing', true);
    }
    else if($('login:register') && ($('login:register').checked || $('login:register').type == 'hidden')) {
        this.method = 'register';
        new Ajax.Request(
            this.saveMethodUrl,
            {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'register'}}
        );
        Element.show('register-customer-password');
        this.gotoSection('billing', true);
    }
    else{
        alert(Translator.translate('Please choose to register or to checkout as a guest').stripTags());
        return false;
    }
    document.body.fire('login:setMethod', {method : this.method});
},

З:

setMethod: function(){
    var formKey = $('checkout-step-login').select('[name=form_key]')[0].value;
    if ($('login:guest') && $('login:guest').checked) {
        this.method = 'guest';
        new Ajax.Request(
            this.saveMethodUrl,
            {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'guest', form_key:formKey}}
        );
        Element.hide('register-customer-password');
        this.gotoSection('billing', true);
    }
    else if($('login:register') && ($('login:register').checked || $('login:register').type == 'hidden')) {
        this.method = 'register';
        new Ajax.Request(
            this.saveMethodUrl,
            {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'register', form_key:formKey}}
        );
        Element.show('register-customer-password');
        this.gotoSection('billing', true);
    }
    else{
        alert(Translator.translate('Please choose to register or to checkout as a guest').stripTags());
        return false;
    }
    document.body.fire('login:setMethod', {method : this.method});
},

Це зробимо, поки ми чекаємо v2 патча


Приємно. Мені було дуже лінь розробити прототип, щоб знайти відповідне поле введення.
Пітер О'Каллаган

@ PeterO'Callaghan Так, прототип працювати болісно, ​​коли ти звик до jQuery ^^
Рафаель у Digital Pianism

1
Що станеться, коли у вас в пункті замовлення немає елемента з назвою "form_key"? Наскільки великі шанси, що виникнуть?
Arjen Miedema

1
@paj дякую, що повідомили мені. Зараз впроваджено його для кількох магазинів без проблем
Arjen Miedema

1
@RaphaelatDigitalPianism: Я спробував твій шлях, але це мені не допомогло, будь-яка ідея?
Анураг Хандельваль

15

Коли ви вибираєте зареєструватися та продовжувати, виклик сценарію JS checkout.setMethod(), який знаходиться в skin/frontend/base/default/js/opcheckout.js. Звідси ми можемо бачити, що він робить запит AJAX POST this.saveMethodUrl, але єдиний параметр, який він передає, - це method. Якщо ми подивимось Mage_Checkout_OnepageController::saveMethodAction, яка ціль цього запиту AJAX, ми можемо побачити, що патч додав:

if ($this->isFormkeyValidationOnCheckoutEnabled() && !$this->_validateFormKey()) {
        return;
}

Оскільки _validateFormKeyшукає form_keyпараметр у запиті, а оскільки setMethodзапит JS не надсилає це, коли він зробив запит AJAX, він просто повертається рано та нічого не робить. Повернувшись до setMethodфункції, і ми можемо побачити, що оскільки вона не намагається зробити щось із зворотним значенням, нічого іншого не відбувається і JS продовжується. На даний момент СР встановив, this.method = 'register'але пропозиція не оновлювалася, тому checkout_methodза замовчуванням "гість".

Оскільки JS знає обраний клієнтом реєстр, він відображає поля паролів, тож на його обличчі це виглядає так, що ви реєструєтесь. Але що стосується сторони PHP, це замовлення гостей, тому воно не створює клієнта, коли оформлення замовлення завершено.

Редагувати: найпростіший виправлення - прокоментувати ці три рядки з SaveMethodAction. Більш правильне / складне рішення полягає в тому, що setMethodслід захопити form_key зі сторінки та надіслати її разом із запитом AJAX.


Надайте, будь ласка, шлях, де ми можемо знайти: this-> isFormkeyValidationOnCheckoutEnabled () &&! $ This -> _ validateFormKey
Ікона

skin / frontend / base / default / js / opcheckout.js не містить цю функцію.
Ікона

2
Фрагмент коду, що перевіряє form_key, звідки app/code/core/Mage/Checkout/controllers/OnepageController.php. Це викликано тим, що JS робить запит не надсилаючи form_key. Це помилка з пластиром. Я підозрюю, що там повинен бути v2.
Peter O'Callaghan

2
Або до виправлення v2, просто відключіть систему / конфігурацію / адміністратор -> безпеку -> "Увімкнути перевірку клавіші форми під час оформлення замовлення" на 0. Це призведе до повідомлення, але після патчу v2 ми можемо його знову включити
Jeroen

1
Дякую, що копали трохи глибше, Пітер. Сподіваємось, хтось із Magento підбере це або помітить звіт про помилку, і ми отримаємо v2.
RickyMage123

3

Повні кредити йдуть на Пітера за рішенням! Я хотів би вказати покрокову інструкцію, що потрібно змінити.

Йти до додаток / код / ​​core / Mage / Checkout / контролери / OnepageController.php

Знайдіть:

 public function saveMethodAction()
{
    if ($this->_expireAjax()) {
        return;
    }

    if ($this->isFormkeyValidationOnCheckoutEnabled() && !$this->_validateFormKey()) {
        return;
    }

Прокоментуйте рядок за допомогою тегів / * * /.

 public function saveMethodAction()
{
    if ($this->_expireAjax()) {
        return;
    }

    /*if ($this->isFormkeyValidationOnCheckoutEnabled() && !$this->_validateFormKey()) {
        return;
    }*/

2
Це неправильно, ви коментуєте той, який додав патч. Наскільки мені відомий цей патч, js запит повинен надіслати form keyзамість цього. Ми повинні повідомити про цю помилку (виправлення) основній команді magento.
Адарш Хатрі

@AdarshKhatri Це може бути неправильно, але це працює! та Так, команду magento вже слід знати. Подвійне повідомлення їм, якщо можете.
Ікона

2
@AdarshKhatri Я згоден з вами. Коментування цих двох рядків усуває проблему, але також усуває мету виправлення. У мене є те саме питання, і я не можу зрозуміти, як це правильно виправити на даний момент ...
DarkCowboy

Замість того, щоб коментувати, isFormkeyValidationOnCheckoutEnabled()ви можете просто відключити налаштування у адміністратора, проте найкращим рішенням є Рафаельс
DanCarlyon

@DanCarlyon Те, що коли-небудь робив Рафаель - це чудова робота. Я щойно дав інструкцію щодо короткочасного виправлення, запропонованого Пітером, за кілька днів до того, як Magento визнав, що існує проблема. Я згоден - це не ідеальне рішення, а скоріше виправлення, як відключення форм-ключів від бек-енду.
Ікона

1

Хороший момент для початку:

Патч безпеки SUPEE-9767 - Можливі проблеми?

Вам потрібно оновити файли шаблонів. Зауважте, що від випуску цього виправлення пройшло лише кілька годин, і на даний момент ми маємо мати справу з тим, що є загальнодоступним. Я впевнений, що в наступні дні все з’ясується.

РЕДАКЦІЯ: Дякую за те, що ви голосували! Вибачте, що не можу дати рішення за 8 годин після випуску цього виправлення.


3
Так, я переглянув усі файли шаблонів у установці, де помітив проблему. Я оновив вищезазначене питання - на тестовій ванільній установці Magento 1.9.3.3 без будь-яких модифікацій у мене, здається, виникає та сама проблема. Тестова версія 1.9.2.4 також використовувала пакет / тему за замовчуванням (свіжий, немодифікований).
RickyMage123

Я намагався з 1.7.0.2 і те саме, що клієнти ніколи не реєструються, коли клавіші Forms увімкнено.
Ікона

1
Я проведу кілька досліджень, порівнюючи 1.9.2.4 з 1.9.3.3 і побачу, які відмінності. Я ще не встановлював з нуля 1.9.3.3. Я опублікую звіт у згаданому посиланні вище.
ADDISON74

2
Буде оновлено, якщо я знайду проблему; підняли звіт про помилки в Magento, оскільки це, мабуть, є проблемою з немодифікованою установкою 1.9.3.3.
RickyMage123

1
Про те, що відслідковувати помилки в Magento - це не спосіб звітувати, він марний. Я робив це ще багато років, даючи рішення, і нічого не змінилося в коді. Там ніхто не слухає, але вони слухають у Magento 2! Завжди знаходив рішення в інших місцях, ніж веб-сайт Magento. Моя порада - зробити кілька тестів перед оновленням виробничих веб-сайтів. З новими випусками, я думаю, ми побачимо нове оновлення раніше, ніж нам здається. Те ж саме сталося між 1.9.3.0 та 1.9.3.1.
ADDISON74

1

Дякуємо за патч @ Рафаель у Digital Pianism.

Для зручності я створив diff, щоб ви могли швидко застосувати виправлення.

 skin/frontend/base/default/js/opcheckout.js | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/skin/frontend/base/default/js/opcheckout.js b/skin/frontend/base/default/js/opcheckout.js
index 8935793af..9ccbe61a9 100644
--- a/skin/frontend/base/default/js/opcheckout.js
+++ b/skin/frontend/base/default/js/opcheckout.js
@@ -165,20 +165,21 @@ Checkout.prototype = {
     },

     setMethod: function(){
+        var formKey = $('checkout-step-login').select('[name=form_key]')[0].value;
         if ($('login:guest') && $('login:guest').checked) {
             this.method = 'guest';
-            var request = new Ajax.Request(
+            new Ajax.Request(
                 this.saveMethodUrl,
-                {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'guest'}}
+                {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'guest', form_key:formKey}}
             );
             Element.hide('register-customer-password');
             this.gotoSection('billing', true);
         }
         else if($('login:register') && ($('login:register').checked || $('login:register').type == 'hidden')) {
             this.method = 'register';
-            var request = new Ajax.Request(
+            new Ajax.Request(
                 this.saveMethodUrl,
-                {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'register'}}
+                {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'register', form_key:formKey}}
             );
             Element.show('register-customer-password');
             this.gotoSection('billing', true);

1

Версія 2 патча SUPEE-9767 була випущена раніше сьогодні разом з Magento CE 1.9.3.4 . V2 виправляє ряд проблем, включаючи цю помилку реєстрації замовлення.

Ви можете оновити до останньої версії (1.9.3.4) або відновити V1, а потім застосувати V2 патча. Будь-який варіант вирішить проблему.

Офіційна зміна V2 фактично така сама, як описав Пітер О'Каллаган, видаливши три рядки, додані до Mage_Checkout_OnepageController::saveMethodAction.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.