Jump to content

Recommended Posts

Всем добрый день.

 

Не получается правильно настроить сессию в opencart. Прошу помощи.

Началось все с того, что возникло желание заставить корзину не очищаться после закрытия браузера.

 

Все упирается в то, что надо заставить куки запомнить PHPSESSID. Вроде все настроил (вывод phpinfo прилагаю)

 

Настораживают две вещи:

1. если ставить принудительно в php.ini session.cookie_lifetime = 3600, то перестает пускать админка. Не ругается, но и не пускает.

2. В инспекторе в хроме в куки для PHPSESSID вместо даты expire стоит просто session - это что значит? Что даты нет? А как заставить, чтобы была.

2.1 Как-то дату поставить туда все же удалось - с утра ее видел и даже сделал скрин (прилагаю), но там не понятное время. Оно явно просроченное, но почему тогда кука жива?

 

Подскажите, как побороть проблему с сессией?

 

ocStore 2.3.0.2.2

сайт https://krabzik.ru

info.jpg

err.jpg

Share this post


Link to post
Share on other sites
1 час назад, SkyDiver78 сказал:

 

Началось все с того, что возникло желание заставить корзину не очищаться после закрытия браузера.

 

Да простят меня клиенты у которых я за это деньги просил... :) 

 

Файл

"system/library/cart.php"

Закомментируй или удали строку №14

$this->db->query("DELETE FROM " . DB_PREFIX . "cart WHERE customer_id = '0' AND date_added < DATE_SUB(NOW(), INTERVAL 1 HOUR)");

 

Корзина перестанет самоочищаться.

 

в .htaccess добавь следующие строки:

php_value session.cookie_lifetime 8640000
php_value session.gc_maxlifetime 8640000
php_value session.cache_expire 18000

 

  • +1 1

Share this post


Link to post
Share on other sites

Спасибо за советы. Почти все проделал, как написано.

Файл system/library/cart.php нашелся по адресу system/library/cart/cart.php, но думаю, что это он. Такую строчку нашел и закомментарил. Как я понял, из-за нее корзина очищается через час. Но у меня корзина не держится без браузера вообще :(

 

В .htaccess в корне вставил.

 

Но корзина после закрытия браузера по-прежнему не запоминается (( Пока открыт браузер могу закрыть окно сайта, снова открыть - корзина есть. Закрыл браузер - все - с чистого листа. Ну и смущает отсутствие даты в куках для PHPSESSID

 

err2.jpg

Share this post


Link to post
Share on other sites
4 часа назад, SkyDiver78 сказал:

Спасибо за советы. Почти все проделал, как написано.

Файл system/library/cart.php нашелся по адресу system/library/cart/cart.php, но думаю, что это он. Такую строчку нашел и закомментарил. Как я понял, из-за нее корзина очищается через час. Но у меня корзина не держится без браузера вообще :(

 

В .htaccess в корне вставил.

 

Но корзина после закрытия браузера по-прежнему не запоминается (( Пока открыт браузер могу закрыть окно сайта, снова открыть - корзина есть. Закрыл браузер - все - с чистого листа. Ну и смущает отсутствие даты в куках для PHPSESSID

 

err2.jpg

Значит проблема исключительно в браузере.

Share this post


Link to post
Share on other sites

А Вы можете попробовать сделать корзину на моем сайте? Будет она держаться у Вас?

 

Попробовал сафари на ipad - эффект тот же. Корзина не держится после закрытия.. :(

Edited by SkyDiver78

Share this post


Link to post
Share on other sites

Если в session.php ставить в вызов

session_set_cookie_params(0, '/');

вместо 0 длительность (например 86400 - сутки), то длительность куки PHPSESSID становится уже не "session", а реальная дата - чего и добиваюсь..

 

Но сразу возникает эффект, что при добавлении товара в корзину она тут же очищается (даже браузер закрывать не надо).

Кто-то может подсказать, как можно выставить длительность сессии, чтобы при этом не ломалось добавление в корзину?

Share this post


Link to post
Share on other sites

Если увеличиваете время жизни через session_set_cookie_params(XXX, '/') то все сессии умирают сразу в момент создания, т.к. на 2.3 есть ошибка в установке сессионной куки. В этом файле есть код вида

if ($key != 'PHPSESSID') {
	setcookie($key, $this->session_id, ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'), 	ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));
}

В нем время жизни куки устанавливается неверно. Правильно так

if ($key != 'PHPSESSID') {
	setcookie($key, $this->session_id, time() + ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));
}

либо же напрямую указать желаемое время ХХХ в секундах, если по каким-то причинам нет возможности изменить параметр session.cookie_lifetime.

if ($key != 'PHPSESSID') {
	setcookie($key, $this->session_id, time() + XXX, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));
}

 

  • +1 3

Share this post


Link to post
Share on other sites

@Raino Очень вам благодарен. Этот баг не исправили и в 3-й версии.
Надо внести изменения в 2 файла. В первый, чтобы на фронте работали сессии, во второй, чтобы в админку получилось зайти.
catalog\controller\startup\session.php 

system\framework.php

Принцип тот же. Ищем ini_get('session.cookie_lifetime') и добавляем текущее время time() 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.