2015-01-08 3 views
4

я установить переменный сеанс через AJAX запрос, как в кассе страницеMagento сессия не обновляется в наблюдателя событий

Mage::getSingleton('customer/session')->setMyValue($value_from_post_data); 

выше устанавливаются в контроллере пользовательского модуля.

У меня есть наблюдатель событий, который наблюдает checkout_onepage_controller_success_action здесь, когда я обращаюсь к сеансу, я не нахожу my_value переменную сеанса, которую я создал.

Примечание: Идентификаторы сеанса такие же. Никаких изменений в них. После того, как значение сеанса установлено, я распечатал все данные сеанса для подтверждения, setMyValue создал my_value в сеансе.

Таким образом, запрос ajax выполнил свою работу. Он установил переменную Но наблюдатель берет старые данные сеанса. Почему это происходит, дайте мне работу

Это ошибка в пурпуре? Есть ли способ, с помощью которого я могу попросить magento обновить объект сеанса. Что-то вроде скажем, например,

Mage::getModel('core/session')->pleaseMagentoRefreshSessionObject(); 

Чтобы я получил новый объект сеанса в памяти.

+0

Можете ли вы также показать код, в котором вы получаете данные сеанса в наблюдателе? – bogatyrjov

+0

Как обычно, $ data = Mage :: getSingleton ('customer/session') -> getMyValue(); Код является проприетарным. Имя события: checkout_onepage_controller_success. Здесь я получаю значение сеанса. идентификаторы сеанса совпадают. Переменные сеанса совпадают. его просто та самая переменная, которая отсутствует. –

+0

. Самая разумная вещь, которую я могу предложить, - установить и получить переменную сеанса с использованием стандартного PHP-метода ($ _SESSION), чтобы определить, имеет ли он какое-то отношение к использованию Singleton 0 – bogatyrjov

ответ

0

То, что вы описываете, звучит как сеанс блокировки записи. По какой-то причине где-то Magento (или ZF/PHP) закрывает сеанс. Если вы настроили хранилище для сохранения сеанса в файловой системе, он получает блокировку записи.

Это потому, что в этом состоянии сервер может отправить сеанс в сетевой сокет, потому что он знает, что это не будет перезаписываться. В этом состоянии сеанс все еще существует в памяти, и вы можете читать и записывать объект сеанса, но он не будет сохранен в файловой системе. Таким образом, по новому запросу вы теряете данные, которые записываются после блокировки записи, что именно происходит в вашей ситуации.

Очень простой способ - сохранить сеансы в базе данных. Чтобы сделать это, изменить "приложение/и т.д./local.xml" и заменить:

<session_save><![CDATA[files]]></session_save> 

Для:

<session_save><![CDATA[db]]></session_save> 

(После этого ясном аль файлы в "вар/сессии" и «вар/cache ")

0

Есть несколько вещей, которые вы можете попробовать здесь.

1.) Ваш путь сохранения сеанса не может быть записан сервером, то есть он будет регенерирован для каждого запроса. Вы можете проверить это с небольшим скриптом, который проверяет, если ваш session_save_path является записываемым:

<?php 
    if (!is_writable(session_save_path())) { 
     echo 'Whoops, the session save path at "'.session_save_path().'" is NOT writable!'; 
    } else { 
     echo 'The session save path at "'.session_save_path().'" IS writable, look elsewhere!'; 
    } 
?> 

Очевидно, когда вы знаете ответ, который вы можете принять необходимые меры, основанные на вашем сервере/платформе. Наиболее распространенным решением является установка session.save_path = "/tmp" в php.ini и перезапуск apache.

 

2.) Что-то пошло не так в вашем файле app/code/core/Mage/Core/Model/Session/Abstract/Varien.php. Получите чистую версию от новой загрузки вашей версии Magento.

 

3.) Ваши запросы AJAX перенаправляются на https:// вместо http://. Следуйте запросу с помощью Web Inspector (или эквивалентом) и найдите 302 перенаправления. Если вы их получите, продолжайте идти по этому списку.

 

4.) Ваш запрос AJAX не включает параметр данных, Magento ожидает, а именно: isAjax

jQuery.ajax({ 
    dataType: 'json', 
    data: { 'isAjax': true }, // <-- set this value 
    url: '//' + document.location.hostname + '/index.php/module/controller/method/', 
    method: 'POST' 
}) 
.done(function(json) { 
    var data = eval(json); 
    jQuery('#div').html(data.content); 
}); 

 

5.) Больше то же самое: у вас нет form_key, определенный для вашего A Запрос JAX. Это необходимо для проверки запроса.

jQuery.ajax({ 
    dataType: 'json', 
    data: { 'form_key': window.FORM_KEY, 'isAjax': true }, // <-- note the form_key 
    url: '//' + document.location.hostname + '/index.php/module/controller/method/', 
    method: 'POST' 
}) 
.done(function(json) { 
    var data = eval(json); 
    jQuery('#div').html(data.content); 
}); 

Глобальный JavaScript Object window.FORM_KEY сделан доступным в Magento JS и доступен на веб-узле.


Счастливая охота!