Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Recommended Posts

Когда-то в версии 1.5 делал доступ к закладкам лишь удалив в контроллере первых несколько строк проверки логина пользователя, и всё работало.

Сейчас проделал подобное, но обнаружил, что закладки каким-то образом общие для любых поситителей, любых IP, браузеров устройств. :blink:

 

Реализовал работу с закладками исключительно правкой контроллера catalog\controller\account\wishlist.php

 

Убрать строки

if (!$this->customer->isLogged()) {
	$this->session->data['redirect'] = $this->url->link('account/wishlist', '', true);

	$this->response->redirect($this->url->link('account/login', '', true));
}

После строки:

$this->model_account_wishlist->deleteWishlist($this->request->get['remove']);

Добавить:      

if (!$this->customer->isLogged()) {            
	$this->session->data['wishlist'] = array_diff( $this->session->data['wishlist'], array($this->request->get['remove']) );                
}

После строки

$results = $this->model_account_wishlist->getWishlist();

Добавить:

if (empty($results)){
	if (!empty($this->session->data['wishlist'])){
		foreach ($this->session->data['wishlist'] as $wish){
			$results[]['product_id'] = $wish;
		}
	}
}

Чтобы кнопка "Продолжить" со страницы закладок перенаправляла не в аккаунт а на предыдущую страницу

Строку :

$data['continue'] = $this->url->link('account/account', '', true);

Заменить на:

$data['continue'] = 'javascript:history.go(-1)';

И последнее, в конце строку:

$json['success'] = sprintf($this->language->get('text_login'), $this->url->link('account/login', '', true), $this->url->link('account/register', '', true), $this->url->link('product/product', 'product_id=' . (int)$this->request->post['product_id']), $product_info['name'], $this->url->link('account/wishlist'));  

Заменить на:

$json['success'] = sprintf($this->language->get('text_success'), $this->url->link('product/product', 'product_id=' . (int)$this->request->post['product_id']), $product_info['name'], $this->url->link('account/wishlist'));

 

Протестировал, у меня все работает, закладки теперь привязаны к сессии, следственно каждый посетитель сайта может накидать закладок и потом из них выбрать и оформить заказ без регистрации (если это доступно), при закрытии браузера закладки не обнуляются, 

 

Не могу утверждать что решение идеальное, поэтому кто заинтересован - берите, тестируйте, оценивайте, предлагайте идеи, если можно что-то улучшить.

 

У меня остался нерешенным вопрос - вычислить длительность пользовательской и админской сессии и как их продлить. Решения, найденные на форуме и в сети неоднозначные и описывают замену строк в файле session.php которые гораздо проще чем в версии 2.3.0.1

Змінено користувачем excalibur
  • +1 1
Надіслати
Поділитися на інших сайтах


  • 2 weeks later...

Можно было бы прописать для установки времени жизни избранного что то вроде

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

как сделано в system\library\cart\cart.php , но в БД с методом предложенным @excalibur в  oc_customer_wishlist  записей не делается.

Как вариант можно перенять часть кода от корзины, там и айди уникальный создается для каждого пользователя и время жизни описано и в бд запись отдельная идет...

Змінено користувачем lilianz
Надіслати
Поділитися на інших сайтах


9 часов назад, warezliker сказал:

Присоединяюсь к вопросу о длительности жизни этих закладок.

@lilianz

В сети большинство пишет о том, что нужно в настройках хостинга увеличить время gc.max_lifetime с стандартных 1440 секунд (24 минуты) до требуемых и мол будет счастье. Нифига этот способ не работает, во всяком случае в 2.3 просто потому что обнаружил что не создаются файлы сессии, а сессия посетителя хранится в куки.

 

Чтобы увеличить время жизни корзины - нужно в вышеупомянутом system\library\cart\cart.php поставить INTERVAL x HOURS.

 

Закладки же хранятся в глобальной переменной $_SESSION с привязкой к значению куки default. Всего куки создается 4 - язык, валюта (срок действия - месяц), default и PHPSESSID.

 

Лично у меня на сервере при попытке в файле system/library/session.php 

session_set_cookie_params(0, '/');

заменить ноль на, например, 7*24*3600 (7 суток) я не мог залогиниться в админку. При этом по сети опять же множество рекомендаций замените ноль на требуемое количество секунд и будет счастье, мол печенька будет жить не сессию, а сколько вам нужно.

 

Проще говоря, и PHP и опенкарт создают по печеньке. Оба используют переменную времени жизни куки. Вот только PHP берет этот параметр и сам его плюсует к текущему времени чтобы установить Expires (действительна ДО), а Opencart создает куки используя тот же параметр сразу как "действительна ДО ...". Поэтому получается, устанавливая параметр в секундах на сервере вместо 0, на определенное значение в секундах - тогда создается корректное куки PHP с именем PHPSESSID, но не создается куки опенкарта так как время недействительное. Если устанавливаем time()+x, создается корректно куки опенкарта, а вот PHPSESSID создается до мая 2065 года (time()+time()+x)

 

Решение нашел такое - в файле вместо нуля установить session_set_cookie_params(7*24*3600, '/');

а в строке где именно опенкарт создает куки 

 

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'));
}

заменить ini_get('session.cookie_lifetime') на time()+х секунд

 

Тогда обе куки создаются с одинаковым временем жизни.. При этом куки PHPSESSID живет пока не умрет по сроку давности, а default куки обновляется при каждом запросе к серверу и умрет только если не заходить на сайт установленное количество секунд х....

 

Опытным путём вычислил сейчас, что те же закладки записываются на сайте в глобальную переменную $_SESSION с привязкой к куки. И очищается эта переменная каждые 1440 стандартных секунд. Поэтому спустя 24 минуты выбрасывает из админки и очищаются закладки. Корзина не очищается потому что есть запись в базе данных.

То же самое эффективно и для установок языка, валюты в куки - пользователь заходит на сайт и опенкарт берет значения которые он ему присылает.. А вот с закладками и авторизацией... Идёт проверка в глобальном массиве сессий - если соответствия идентификатора не найдено - увы, от ворот - поворот.

 

И у меня на хостинге мне вроде бы предоставили доступ к изменению параметра gc.max_lifetime но его изменение влияет только на чистку файлов сессий подключений к самой cPanel... но не влияет на время жизни сессий PHP. Либо перебивается каким-то глобальным параметром сервера, который не меняют... Я не специалист...

 

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

 

Хранение в базе - преимуществ не вижу, а минус есть - нужно еще реализовать чистку, аналогичную чистке корзины с определенным интервалом...

 

А вот что делать со временем авторизации админки в 24 минуты бездействия - вопрос. Использовать костыль с пингом сервера не хочется, ибо это актуально будет только для включенного компьютера с запущенным браузером...

 

Надеюсь не запутал своими умозаключениями. У кого будут какие еще идеи или сведения?...

Змінено користувачем excalibur
  • +1 2
Надіслати
Поділитися на інших сайтах


Всё. Теперь окончательно со всем разобрался. Стоило просто прописать в опенкарте отдельную папку для хранения файлов сессий.

Теперь opencart туда скидывает файлы сессий которые в себе содержат идентификатор пользователя. Если этот пользователь - покупатель - в сессию записываются так же закладки. Если администратор - его айди и токен.

 

Есть три параметра отвечающих за обработку файлов сессий.

session.gc_probability integer
session.gc_probability в сочетании с session.gc_divisor определяет вероятность запуска функции сборщика мусора (gc, garbage collection). По умолчанию равна 1
session.gc_divisor integer
session.gc_divisor в сочетании с session.gc_probability вероятность запуска функции сборщика мусора (gc, garbage collection) при каждой инициализации сессии. Вероятность рассчитывается как gc_probability/gc_divisor, т.е. 1/100 означает, что функция gc запускается в одном случае из ста, или 1% при каждом запросе. session.gc_divisor по умолчанию имеет значение 100.
session.gc_maxlifetime integer
session.gc_maxlifetime задает отсрочку времени в секундах, после которой данные будут рассматриваться как "мусор" и потенциально будут удалены. Сбор мусора может произойти в течение старта сессии (в зависимости от значенийsession.gc_probability и session.gc_divisor).

Замечание: Если разные скрипты имеют разные значения session.gc_maxlifetime, но при этом одни и те же места для хранения данных сессии, то скрипт с минимальным значением уничтожит все данные. В таком случае следует использовать эту директиву вместе с session.save_path.

 

Таким образом, в файле system\library\session.php

задаем нужные нам параметры, если хотим чтобы они отличались от тех, что по умолчанию на сервере. параметры по умолчанию хостера можно узнать выведя функцию phpinfo();

 

Я у себя создал в папке tmp дополнительную папку для хранения сессий посетитетелей сайта и указал ее в session.save_path и изменил session.gc_maxlifetime на нужное мне время.

Теперь всё работает как часики.

Змінено користувачем excalibur
  • +1 2
Надіслати
Поділитися на інших сайтах


Сразу извиняюсь за некоторые неправильные умозаключения в посте 

Дело в том, что у меня на сервере в настройках PHP (версия 5.6) папка для сохранения временных файлов значилась tmp. Там действительно появлялись файлики вида sess_*************, НО, только сессий авторизации в cPanel. Как я не пытался где либо найти файлы сессий такого же вида самого Opencarta их нигде не было.

Поэтому предположил, что сессии на сервере хранятся как-то в неявном виде, в кеше временном типа, без создания этих файлов сессий во временной папке.

 

Но когда я уже в опенкарте задал другую папку для сохранения сессий, отличную от по-умолчанию, скажем tmp/opencart/ - там начали появлятся заветные файлики сессий sess_*********** каждого посетителя сайта. И эти файлики будут храниться установленное время gc.max_lifetime и очищаться сборщиком мусора, который запускается при каждом вызове сессии с вероятностью gc_probability/gc_divisor

 

Относительно вопроса почему файлов сессий опенкарта не было до этого, хотя в настройках PHP значилась доступная мне папка, там создавались файлы сессий cPanel... Скорее всего эти файлы создавались в папке, к которой на хостинге доступа нет - где-то в /var/lib/php/session.... Если у вас не выделенный собственный сервер, а хостинг - не все доступно для просмотра и тем более редактирования.

 

Надіслати
Поділитися на інших сайтах


В 28.08.2017 в 01:52, excalibur сказал:

Оформил :-)
...


У меня модификатор установился без проблем, а вот когда список закладок смотришь, то они почему-то исключительно по одной показываются. Дайте направления куда копать чтобы полный список увидеть? 
ps. разобрался. Все работает.

Змінено користувачем PaltonB
Надіслати
Поділитися на інших сайтах


10 часов назад, PaltonB сказал:


У меня модификатор установился без проблем, а вот когда список закладок смотришь, то они почему-то исключительно по одной показываются. Дайте направления куда копать чтобы полный список увидеть? 
ps. разобрался. Все работает.

 

Это хорошо, но напишите хоть в чем была проблема, какое решение нашли, какая версия опенкарта у вас, для других, у кого может возникнуть такая же проблема :-)

Змінено користувачем excalibur
Надіслати
Поділитися на інших сайтах


6 часов назад, excalibur сказал:

 

Это хорошо, но напишите хоть в чем была проблема, какое решение нашли, какая версия опенкарта у вас, для других, у кого может возникнуть такая же проблема :-)


Проблема была на моей стороне - ошибка в css, просто не показывались все товары в таблице. Поправил и все стало ОК.

Тем не менее, есть что добавить - добавьте в модификатор тэг <link>. А иначе, установленный у меня редактор модификаторов не позволяет его сохранять после редактирования (сама установка модификатора прошла гладко). Если не знаете какую поставить ссылку, поставьте ссылку на этот топик.

Змінено користувачем PaltonB
Надіслати
Поділитися на інших сайтах


  • 1 month later...
  • 1 year later...
  • 1 year later...
11 минут назад, yskl240995 сказал:

@excalibur огромное Вам спасибо за решение! Все работает, очень Вам благодарен, а то весь инет перерыл в поисках.

 

  • +1 1
Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.