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

ocStore 3.0.3.7 - Модифицированный OpenCart


Recommended Posts

 

/system/library/seopro.php

public function __destruct() {

if(!$this->config->get('config_seo_pro'))

return;

if ($this->config->get('config_seo_url_cache')){
$this->cache->set('seopro.keywords', $this->keywords);
$this->cache->set('seopro.queries', $this->queries);
$this->cache->set('seopro.cat_tree', $this->cat_tree);
$this->cache->set('seopro.product_categories', $this->product_categories);

}

}

 

Я не знаю какую цель преследовал автор, может быть он что-то забыл?

Возможно надо вот так хотя бы:

 

    public function __destruct() {

        if(!$this->config->get('config_seo_pro'))
            return;

        if ($this->config->get('config_seo_url_cache') &&  !$this->cache->get('seopro.keywords')){
            $this->cache->set('seopro.keywords', $this->keywords);
            $this->cache->set('seopro.queries', $this->queries);
            $this->cache->set('seopro.cat_tree', $this->cat_tree);
            $this->cache->set('seopro.product_categories', $this->product_categories);
        }
    }

 

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


Ещё баг:

/catalog/model/blog/article.php

 

		$article_data = $this->cache->get('article.total.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.' . $cache);
		
		$article_data = [];
		
		if (!$article_data) {

Кэш сбрасывается в любом случаи. Надо написать так:

 

		$article_data = $this->cache->get('article.total.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.' . $cache);
		
		
		if (!$article_data) {
			
			$article_data = [];

 

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


У всех плодятся файлы или записи в БД сессионных данных, если в браузере запретить куки?

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

14 минут назад, buslikdrev сказал:

У всех плодятся файлы или записи в БД сессионных данных, если в браузере запретить куки?

Нет сессии, будет создана новая. И естественно будет сохранена.

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

У OC это валюта и язык по умолчанию. Они будут выставлены из конфига при новом обращении.

 

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

7 часов назад, buslikdrev сказал:

У всех плодятся файлы или записи в БД сессионных данных, если в браузере запретить куки?

Вот таким вот кодом можно избавиться от записи ненужных сессиий.

 

В файле system/library/session/db.php

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

$this->db = $registry->get('db');

Добавить:

$this->config = $registry->get('config');

 

И в функции write после строки:

if ($session_id) {

Добавить вот это:

$session_empty = true;

foreach ($data as $key => $value) {
    if ($key == 'language' && $value == $this->config->get('config_language')) {
        continue;
    }
    if ($key == 'currency' && $value == $this->config->get('config_currency')) {
        continue;
    }
    $session_empty = false;
    break;
}

if ($session_empty) {
    return true;
}

 

Таким образом, если в сессии будут данные, отличные от данных по умолчанию, то она будет записана в БД. Иначе запись не производится.

Непонятно, почему вообще этому моменту не уделили изначально должного внимания. Тем более, что либа сессий OC3 изначально из коробки кривая.

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

15 часов назад, mpn2005 сказал:

Таким образом, если в сессии будут данные, отличные от данных по умолчанию, то она будет записана в БД. Иначе запись не производится.

 

 

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

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

 

Спойлер

				$cookie_status_path = DIR_SESSION . $this->config->get('session_prefix') . md5($this->request->server['REMOTE_ADDR']);
				if (!isset($this->request->cookie['cookie_status'])) {
					setcookie('cookie_status', true, 0);
					if (!is_file($cookie_status_path)) {
						file_put_contents($cookie_status_path, false);
					} else {
						$this->cookie_status = false;
						return false;
					}
				} else {
					if (is_file($cookie_status_path)) {
						@unlink($cookie_status_path);
					}
				}

 

 

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

2 часа назад, Webjokerst сказал:

В ocstore при заполнении товара есть поле H3, какой переменной можно вывести значения в странице товара?

Это где? Можете показать снимок, а то у меня такого нету.

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

3 часа назад, SergeTkach сказал:

Это где? Можете показать снимок, а то у меня такого нету.

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

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


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

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

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

Это один момент.

А второй - зачем сохранять сессию, если там от дефолтных значений ничего не поменялось.

Если посмотреть в БД записи, то сессий о значениями по умолчанию будет под 90%

Их нет смысла хранить и тратить на них ресурс.

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

В 08.08.2021 в 21:03, NineBot сказал:

Решил обновиться поверх свежеУстановленной версию ocStore 3.0.2.0 (с хостинга)
PHP 7.4

Во время обновления появляется ошибка:

Upgrade Progress

 


Error Code(0): Error: Table 'igor12w7_ocar1.oc_url_alias' doesn't exist
Error No: 1146
SELECT * FROM `oc_url_alias` in /home/i/igor12w7/"website"/public_html/system/library/db/mysqli.php on line 41

 

И ещё в добавок PHP_errors.log

 

Всё делал по инструкции, что не так?

PHP_errors.log 22 \u043a\u0411 · 1 download

Та же проблема. Как-то решили?

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


11 минут назад, kamrik сказал:

oc_url_alias' doesn't exist

Конкретно в этом случае просто создать  таблицу oc_url_alias. Структуру запроса таблицы можно подсмотреть толи в install.php, толи в install.sql в новой версии.

 

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

 

А вообще, кто-то писал, что с 3.0.3.2 обновиться на 3.0.3.7 нельзя. Т. е. если обновляетесь, то на свой страх и риск.

Лучше ставить с нуля.

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


7 минут назад, AlektroNik сказал:

Конкретно в этом случае просто создать  таблицу oc_url_alias. Структуру запроса таблицы можно подсмотреть толи в install.php, толи в install.sql в новой версии.

 

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

 

А вообще, кто-то писал, что с 3.0.3.2 обновиться на 3.0.3.7 нельзя. Т. е. если обновляетесь, то на свой страх и риск.

Лучше ставить с нуля.

Значит пока остаемся на  3.0.3.2

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


После чистой установки, в админке появляется ошибка, связанная с "домовой" PHP 7.4. Как исправить?

Цитата

 in /admin/controller/extension/dashboard/domovoy.php on line 206Notice: Trying to access array offset on value of type null in /admin/controller/extension/dashboard/domovoy.php on line 206

 

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


3 минуты назад, ramen сказал:

Ставлю с нуля и аналогичный error выдает.

Поставить с нуля - это удалить, что уже поставили, в том числе БД, и установить на чистый хостинг. А вы снова делаете обновление по старому.

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


В 10.08.2021 в 21:41, mpn2005 сказал:

Вот таким вот кодом можно избавиться от записи ненужных сессиий.

 

В файле system/library/session/db.php

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


$this->db = $registry->get('db');

Добавить:


$this->config = $registry->get('config');

 

И в функции write после строки:


if ($session_id) {

Добавить вот это:


$session_empty = true;

foreach ($data as $key => $value) {
    if ($key == 'language' && $value == $this->config->get('config_language')) {
        continue;
    }
    if ($key == 'currency' && $value == $this->config->get('config_currency')) {
        continue;
    }
    $session_empty = false;
    break;
}

if ($session_empty) {
    return true;
}

 

Таким образом, если в сессии будут данные, отличные от данных по умолчанию, то она будет записана в БД. Иначе запись не производится.

Непонятно, почему вообще этому моменту не уделили изначально должного внимания. Тем более, что либа сессий OC3 изначально из коробки кривая.

 

Мне кажется так сделано из-за того, что анонимные корзины (просто прохожий накидал товар в корзину без регистрации и т. д.) хранят свою корзину в таблице oc_cart и идет привязка к сессии из таблицы oc_session.

 

Мне кажется не стоит убирать эти сессии по двум причинам:

1. У сессий есть срок истекания. Т. е. сессии сами удаляются примерно через 34 часа.

Вот код из файла /system/library/session/db.php:

    if (mt_rand() / mt_getrandmax() > $gc_probability / $gc_divisor) {
      $this->db->query("DELETE FROM `" . DB_PREFIX . "session` WHERE `expire` < '" . $this->db->escape(date('Y-m-d H:i:s'time())) . "'");
 

2. Если не будет уникальных сессий как же тогда Opencart будет различать корзины покупателей? Опять же товары из корзины без customer id удаляются через 1 час по умолчанию.

Вот код из файла /system/library/cart/cart.php:

$this->maxlifetime = ini_get('session.gc_maxlifetime') !== null ? (int)ini_get('session.gc_maxlifetime') : 1440;
и вот оттудаже:
    // Remove all the expired carts with no customer ID
    $this->db->query("DELETE FROM " . DB_PREFIX . "cart WHERE (api_id > '0' OR customer_id = '0') AND date_added < DATE_SUB(NOW(), INTERVAL 1 HOUR)");

 

Вот пример, что в базе творится.

image.png.e0990e2d9713dfb78ac9f6a0d633ed08.png

image.thumb.png.335ee01bc3e6b71badafd1f4d00c06d8.png

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


Еще вопрос по поводу тех же сессий.
У меня время сессии 33,6
Вот по этой строчке из /system/library/session/db.php

$this->maxlifetime = ini_get('session.gc_maxlifetime') !== null ? (int)ini_get('session.gc_maxlifetime') : 1440;
 
Я давно хотел сделать типо вечную ссессию как допустим в vk.com или яндексе,
но мой же ответ выше https://opencartforum.com/topic/177506-russkaya-sborka-ocstore-3037/?do=findComment&comment=1742162
натолкнул на мысль, если ее сделать бесконечной, то тогда БД будет расти слишком быстро.

@mpn2005 @chukcha Коллеги, может кто-то подскажет какой бестпрактис для Opencart для времени жизни сессий, гостевых корзин и файлов cookie?
 
Пока наверное, мысли хотя бы увеличить до 4-х дней, чтобы сессия жила хотя бы с пятницы на понедельник без необходимости обновлять страницу сайта для обновления 
expire сессии. Правда, пару лет назад я так и не смог решить проблему времени жизни cookie в Яндекс Браузере (после закрытия браузера генерируется новая сессия, помогает только правка поведения самого браузера, но у клиентов же такое не сделаешь.) Буду благодарен за совет и по этой проблеме.
Надіслати
Поділитися на інших сайтах


В 17.08.2021 в 13:16, AlektroNik сказал:

Мне кажется не стоит убирать эти сессии по двум причинам:

1. У сессий есть срок истекания. Т. е. сессии сами удаляются примерно через 34 часа.

С одной стороны. А с другой стороны, их не стоит и сохранять. Там же нет ничего полезного.

 

В 17.08.2021 в 13:16, AlektroNik сказал:

2. Если не будет уникальных сессий как же тогда Opencart будет различать корзины покупателей? Опять же товары из корзины без customer id удаляются через 1 час по умолчанию.

Данные сессии никак не влияют на корзину.

Корзина привязана к ID сессии, а не к данным из сессии.

ID сессии хранится в куках браузера. И время жизни определяется настройкой session.cookie_lifetime

Если там ноль, то кука умирает с закрытием браузера. И по умолчанию там ноль.

Если там не ноль, то в большинстве версия OC3 есть глюк и сессия сразу протухает, т.к. время создания попадает в прошлое. И не получится даже заглогинится в админку. В ocStore-3.0.3.7 это уже из коробки исправлено. В чистом OC3 это так и не поправили.

 

Параметр session.gc_maxlifetime относится к времени жизни именно данных сессии. Но не самого ID сессии.

 

Вы всё слепили в кучу и перемешали.

Можно сесиию делать долгой. Но при этом лучше не сохранять пустые сессии.

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

 

Если важна только корзина, то данные самой сессии можно долго не хранить. А хранить дольше только куку с ID сессии.

 

19 часов назад, AlektroNik сказал:

Правда, пару лет назад я так и не смог решить проблему времени жизни cookie в Яндекс Браузере (после закрытия браузера генерируется новая сессия, помогает только правка поведения самого браузера, но у клиентов же такое не сделаешь.) Буду благодарен за совет и по этой проблеме.

Что в параметре session.cookie_lifetime?

Если там ноль, то браузер работает как надо.

image.thumb.png.ea683e8a22b0246b3bf0cad99420ff0b.png

 

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

2 часа назад, mpn2005 сказал:

Если там ноль, то браузер работает как надо.

image.thumb.png.ea683e8a22b0246b3bf0cad99420ff0b.png

В оригинальном OC3 всё ещё не поправили проблему.

Вот файл на git https://github.com/opencart/opencart/blob/3.0.x.x_Maintenance/upload/system/framework.php

Смотрим вот сюда:

image.thumb.png.9949193bbfeb73f04f39f03c06899615.png

Время жизни сесии должно быть меткой времени UNIX

Вот документация:
image.thumb.png.9cbd0620d2f8b2dbe1d4bb613b32ec30.png

 

Итого, если мы выставим cookie_lifetime = 10000, для примера, то получим куку, которая протухла 52 года назад.

image.png.b998c2cda0ae7a3b9414800f08e7d2f3.png

 

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

 

3 часа назад, mpn2005 сказал:

Корзина привязана к ID сессии, а не к данным из сессии.

ID сессии хранится в куках браузера. И время жизни определяется настройкой session.cookie_lifetime

Если там ноль, то кука умирает с закрытием браузера. И по умолчанию там ноль.

Если там не ноль, то в большинстве версия OC3 есть глюк и сессия сразу протухает, т.к. время создания попадает в прошлое. И не получится даже заглогинится в админку. В ocStore-3.0.3.7 это уже из коробки исправлено. В чистом OC3 это так и не поправили.

 

Параметр session.gc_maxlifetime относится к времени жизни именно данных сессии. Но не самого ID сессии.

 

Вы всё слепили в кучу и перемешали.

Можно сесиию делать долгой. Но при этом лучше не сохранять пустые сессии.

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

 

Если важна только корзина, то данные самой сессии можно долго не хранить. А хранить дольше только куку с ID сессии.

 

Что в параметре session.cookie_lifetime?

Если там ноль, то браузер работает как надо.

image.thumb.png.ea683e8a22b0246b3bf0cad99420ff0b.png

 

 

Добрый вечер, большое спасибо за такой развернутый ответ 🤗🍻
Да, что-то не разобрался с курицей и яйцом 😅

Вы абсолютно правы. Провел эксперемент. Удалили из таблицы oc_session сессия и по кукам она в базе создалась обратно при обновлении страницы :)
Тогда да, нужно внедрять исправление однозначно.

 

Не зря ocStore 3.0.3.7 ждал пока зарелизят 😁, хотябы /system/framework.php поправили.
Может кинете Pull Request в git OcStore?

 

Можете посоветовать настройки? Как Вы обычно в своих проектах делаете?

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

Или как лучше?
1. Корзина гостей чистится вот этой строчкой. Тут выставляю 4 дня:

код из файла /system/library/cart/cart.php:

    // Remove all the expired carts with no customer ID
    $this->db->query("DELETE FROM " . DB_PREFIX . "cart WHERE (api_id > '0' OR customer_id = '0') AND date_added < DATE_SUB(NOW(), INTERVAL 96 HOUR)");

 

2. Вот с временем жизни сессии и куков немного в затруднении. Обычно все ставят одинаковое число. Я поставил время жизни сессий 4 дня, чтобы они из базы вычищались, т. к. один фиг их по кукам с тем же номером сессии опять в базу пропишет OcStore. Но что-то мне подсказывает что люди все же не с проста делают одинаковые значения у этих параметров.

    # 1 год = 31 536 000
    php_value session.cookie_lifetime 31536000
    # 4 Дня равно 345600 секунд
    php_value session.gc_maxlifetime 345600

 

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


34 минуты назад, AlektroNik сказал:

Хотелось бы чтобы корзина сохранялась для гостей хотя бы 4 дня

 

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

 

 

 

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


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

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

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

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

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

Вхід

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

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

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