Перейти к публикации
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

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


dinox
 Поделиться

Рекомендованные сообщения

 

/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
Ссылка на комментарий
Поделиться на других сайтах

Я так понял ocstore сыровата ещё, надо ещё допиливать??

Изменено пользователем Basbia
Ссылка на комментарий
Поделиться на других сайтах


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

 

{{ h3 }} ?

Ссылка на комментарий
Поделиться на других сайтах


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

 

Ссылка на комментарий
Поделиться на других сайтах


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

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

 

 

 

 

Ссылка на комментарий
Поделиться на других сайтах


В 12.08.2021 в 08:04, AlektroNik сказал:

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

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

 

 

Спойлер

 

Изменено пользователем ramen
Ссылка на комментарий
Поделиться на других сайтах


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

Ссылка на комментарий
Поделиться на других сайтах


Еще вопрос по поводу тех же сессий.
У меня время сессии 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://opencart-forum.ru/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?

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

 

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

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

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

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

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

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

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

Вот документация:

 

Итого, если мы выставим 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?

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

 

 

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

Вы абсолютно правы. Провел эксперемент. Удалили из таблицы 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
Ссылка на комментарий
Поделиться на других сайтах


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.