-
Публікації
1 797 -
З нами
-
Відвідування
Тип публікації
Профілі
Форум
Маркетплейс
Статті
FAQ
Наші новини
Магазин
Блоги
module__dplus_manager
Усі публікації користувача kJlukOo
-
из коробки никак. нужно на этапе автосвязки логику для сортировки писать или же крайний вариант проставлять вручную
-
в модуле нет округления цен, только округление скидки
- 263 відповіді
-
- комплекты про
- серии
- (і ще %d)
-
чей-то модификатор лезет в код модуля...
- 263 відповіді
-
- комплекты про
- серии
- (і ще %d)
-
привет форумчане. статья может быть полезна для начинающих разрабов и тех, кто недавно столкнулся с опенкартом штатный кэш опенкарта 1. ocmod обновляется в админке. меню слева - расширения - модификаторы. обновить можно следующим образом рекомендации: когда сайту плохо и вы получаете 404 можно сделать очистку всех модификаторов - нажав на желтую кнопку с ластиком, чтобы убедиться, что дело не в них в бд в таблице oc_modification колонка xml легко поддается поиску через интерфейс phpMyAdmin перед работой с сайтом желательно сохранить все модифицированный файлы - storage/modification 2. twig and sass cache (3.x) opencart и ocstore 3 ветки обзавелся twig шаблонизатором, который умеет кэшироваться настраивается это в админке. в левом меню пункт панель состояния рекомендации: отключить перед работой с сайтом. после завершения не забыть включить 3. opencart file/mem cache библиотека для разработчиков. которая используется так $this->cache->set('test','value'); $val = $this->cache->get('test'); содержимое кэша по умолчанию находится в system/storage/cache для файлового кэша очищается посредством удаления содержимого папки для мемкэша очищается вызовом пары команд в консоле. это легко гуглится в этот хранилище обычно кэшируется языки, валюты и меню сайта рекомендации: можно кэшировать любой статический контент сайта, например футер или блок преимуществ по возможности используйте мемкэш или редис, если вы используете файловый кэш - ssd и m.2 в помощь 4. image cache опенкарт создает кэш изображений под размеры указанные в настройках темы этот кэш находится в image/cache. чтобы очистить - удалите содержимое этой папки рекомендации: не избыточное разрешение, webp и отложенная загрузка изображений. ну и верный Cache-control для изображений от сервера 5. design/theme (3.x) этот инструмент кэширует представления(view) в бд находится в левом меню. дизайн - редактор шаблона на скрине ниже можно увидеть, что файл account/account закэширован изменение этого файла на сервере не даст ожидаемого результата рекомендации: желательно не использовать вовсе 6. внештатные дополнения для кэширования тут наши полномочия все. следуйте рекомендациям автора и читайте руководства к модулям рекомендации: чтобы сделать ваш сайт быстрым нужен индивидуальный подход. общие решения не дадут нужного эффекта. тут зеленыЙ прав клиентский кэш это кэш вашего браузера. заголовок ответа сервера Cache-control является инструкцией для браузера пример блока из конфига для nginx, который отдаст инструкцию браузеру к кэшированию js, css, jpeg на 72 часа location ~* \.(css|js|gif|jpeg|jpg|png)$ { expires 3d; access_log off; add_header Pragma public; add_header Cache-Control "public, max-age=259200"; add_header X-Asset "yes"; } этот кэш отключается следующим образом для google chrome: 1. нажатие хоткея CTRL + F5 приведет к перезагрузке страницы со сбросом кэша 2. отключаем кэширование браузера в инструментах разработчика. под спойлером поправляйте если где-то ошибаюсь
-
встанет без проблем. адаптация стилей нужна, чтоб красиво было
- 263 відповіді
-
- 1
-
-
- комплекты про
- серии
- (і ще %d)
-
я с подобных заданий первые деньги заработал. и конечно пусть сын сам разбирается. толку от курсов. пусть гуглит и учится
-
$this->cart->clearCache(); вызвать в методе пользователя logout
- 66 відповідей
-
- 1
-
-
- cart cache
- cache
-
(і ще %d)
Теги:
-
кеш хранится тут $this->cache в зависимости от настроек магазина может хранится в файлах на жестком диске или в оперативной памяти (memcache) для этой версии окстор проблема никак не кэшированной корзины к сожалению все еще актуальна
-
чтобы в момент разработки не дергать обновления модифов вручную
-
при работе с опенкартом всегда возникает необходимость обновлять модифы, после ряда совершенных правок. делается это для того, чтобы получить актуальный контент давным давно я решил этот вопрос программно, что избавило меня от кучи головной боли в виде открытия вкладки и нажатия кнопки обновления модифов раз за разом я решил этот вопрос программно следующим образом. пришло время делиться 1. авторизация по ссылке быстрая авторизация в админке по ссылке. перед использованием модификатора обязательно изменить эти значения на свои $secret_key = 'secret_key64587967'; $secret_val = 'eret345dfgc342'; ссылку в админку для обновления модификаторов выглядит следующим образом https://site.com/admin/index.php?route=extension/modification/refresh добавим к этой ссылке нашу секретную пару https://site.com/admin/index.php?route=extension/modification/refresh&secret_key64587967=eret345dfgc342 в вашем случае ссылка должна отличаться <?xml version="1.0" encoding="utf-8"?> <modification> <name>fast admin auth fix</name> <code>fast admin auth fix</code> <version>1.3</version> <author>kJluk</author> <link>cleanphp.ru</link> <file path="admin/controller/common/login.php"> <operation> <search><![CDATA[public function index() {]]></search> <add position="after"><![CDATA[ //обязательно измените эти значения! $secret_key = 'secret_key64587967'; $secret_val = 'eret345dfgc342'; if(isset($this->request->get[$secret_key]) && $this->request->get[$secret_key]==$secret_val) { $this->session->data['user_id'] = 1; $token = token(32); $this->session->data['token'] = $token; $url=HTTPS_SERVER.'index.php?'; $params = array('token' => $token); if(!empty($this->request->get['route'])) $params['route']=$this->request->get['route']; $this->response->redirect($url.http_build_query($params)); } ]]></add> </operation> </file> </modification> 2. Запрос к обновлению модифов используя авторизацию по ссылке эта функция, которые прекрасно скушает 302 редирект, после успешной авторизации путь к куки должен быть ваш. куки должен лежать в какой-то закрытой папке ее необходимо разместить в system/library/helper.php. возможно это правильно сделать модификатором, но мне лень function curlWihteRedir($url) { //путь к куки должен быть ваш $path_to_cookie = '/path_to_cookie/cookies.rip'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, $path_to_cookie); curl_setopt($ch, CURLOPT_COOKIEFILE, $path_to_cookie); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $response = curl_exec($ch ); curl_close($ch); return $response; } 3. Использование вызываем функцию с ссылкой, которую получили в 1п для быстрой авторизации. обычно вызывать функцию нужно в начале метода контроллера curlWihteRedir(HTTPS_SERVER."index.php?route=extension/modification/refresh&secret_key64587967=eret345dfgc342");
-
поддержка файлов куки есть на мобильном браузере?
-
попробовать поставить лимит в 4-5 товаров и еще постараться подобрать оптимально большой лимит времени выполнения скрипта. пишите в личку. помогу исправить
- 121 відповідь
-
- 1
-
-
- рекомендуемые
- авто рекомендуемые
- (і ще %d)
-
20 Скачать / Купить дополнение Добавил kJlukOo Добавлено 17.09.2021 Категория Прочее Ioncube Loader Нет ocStore 3.0 2.3.0.2.4 2.3 2.2 2.1 OpenCart.Pro, ocShop Обращение к серверу разработчика Нет
-
Версія 1.2.0
модуль имеет две модификации вечная авторизация покупателя данный модуль переносит хранение ключей из сессии в куки и позволяет существовать ключам очень долгое время. время хранение куки 1 год корзина гостя по умолчанию в опенкарте корзина гостя хранится 1 час. модификация увеличивает этот интервал до 7 дней, а так же актуализирует ключ сессии для гостевых корзин эта модификация может привести к увеличению таблицы oc_cart тк корзины хранятся дольше и занимают место в базе данных установка модуля происходит через штатный установщик расширений в админке после установки не забываем обновлять модификаторы модуль не закодирован, не требует ключ лицензии и не имеет никаких бэкдоров или что-то вроде этого в случае возникновения конфликтов с другими модификациями настоятельно рекомендую отключить модификатор и написать в личку поддержка: опенкарт 2х 3х / оcStore 2х 3х20.00 USD -
вывод в карточку со всеми темами работает отлично в категорию под любую тему нужна адаптация
-
в настройках серии, в самом внизу есть выбор содержимого колонок language/lang-code/extension/module/kjseries.php вместо lang-code код вашего языка
-
в функцию пересчета добавить умножение на кол-во модель: catalog/model/extension/module/kjseries.php метод: public function getAdminParent($type, $field, $parent = false) предположительно! строка, которую нужно редачить: $sql .= "SUM(p.$field) as $field"; таких настроек не припомню
-
ну так в чем вопрос. допишите генерацию серии под бесплатный модуль и под свои нужды или если лень, то покупайте у меня мой модуль умеет группировать по части названия. достаточно выбрать желаемое название и указать кол-во совпадающих слов
-
во тут реально конструктивно было. конфликты будут с микроволной печью в первую очередь. затестил цифры с sql_no_cache и разрыв в первом байте стал еще вкуснее на каких-то 5-10мс Отображение строк 0 - 49 (50 всего, Запрос занял 0.0276 сек.) SELECT SQL_NO_CACHE p.image, p.price, p.quantity, pd.name , (SELECT price FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, p.product_id FROM oc_product_to_category p2c LEFT JOIN oc_product p ON (p2c.product_id = p.product_id) LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND p2c.category_id = '118' GROUP BY p.product_id ORDER BY (p.quantity>0) DESC,p.sort_order ASC, LCASE(pd.name) ASC LIMIT 0,50 Отображение строк 0 - 49 (50 всего, Запрос занял 0.0200 сек.) SELECT SQL_NO_CACHE p.product_id, (SELECT price FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, p.product_id FROM oc_product_to_category p2c LEFT JOIN oc_product p ON (p2c.product_id = p.product_id) LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND p2c.category_id = '118' GROUP BY p.product_id ORDER BY (p.quantity>0) DESC,p.sort_order ASC, LCASE(pd.name) ASC LIMIT 0,50 как полагаешь разница в 0.0076 секунды сможет компенсировать 50 таких запросов(ниже)? Отображение строк 0 - 0 (1 всего, Запрос занял 0.0016 сек.) SELECT SQL_NO_CACHE DISTINCT *, pd.name AS name, p.image, (SELECT md.name FROM oc_manufacturer_description md WHERE md.manufacturer_id = p.manufacturer_id AND md.language_id = '1') AS manufacturer, (SELECT price FROM oc_product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '1' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM oc_product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '1') AS reward, (SELECT ss.name FROM oc_stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '1') AS stock_status, (SELECT wcd.unit FROM oc_weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '1') AS weight_class, (SELECT lcd.unit FROM oc_length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '1') AS length_class, (SELECT AVG(rating) AS total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM oc_review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order FROM oc_product p LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN oc_manufacturer m ON (p.manufacturer_id = m.manufacturer_id) WHERE p.product_id = '2510842' AND pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' зачем тебе explain? смешной. условия запроса никак не менялись. экплейн идентичен для двух этих запросов, я думал это само собой понятно... но не тебе не убирать дискаунт, чтобы добиться хорошей совместимости будет максимально логично, но мне интересно сделать легче и быстрее
-
добрый вечер. сменить урл можно запросто. объединить товары по значению атрибутов тоже можно из коробки
-
дримфильтр на такой кастомизации работает исправно. окфильтр надо будет потестить про то, что надо делать модом согласен
-
catalog/model/catalog/product.php метод getProducts имеет следующий цикл foreach ($query->rows as $result) { $product_data[$result['product_id']] = $this->getProduct($result['product_id']); } те на каждый товар категории у нас создается отдельный запрос с кучей условий. как избавится от порождения кучи новых запросов? получить все в одном запросе. без цикличного вызова метода getProduct foreach ($query->rows as $result) { $product_data[$result['product_id']] = $result; } в родном запросе мы получим: id, рейтинг, акцию и дискаунт в моем случае для категории мне нужно: количество, изображение, название товара, id , цена //исходный $sql = "SELECT p.product_id, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special"; заменим SELECT p.product_id на SELECT p.product_id, p.image, p.price, p.quantity, pd.name $sql = "SELECT p.product_id, p.image, p.price, p.quantity, pd.name, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special"; //тесты 10 срезов по ttfb показали категория 50 товаров. 62.8 => 23.5 ms категория 30 товаров: 45.8 => 22.7 ms $startTime = microtime(true); $query = $this->db->query($sql); foreach ($query->rows as $result) { $product_data[$result['product_id']] = $result; //$product_data[$result['product_id']] = $this->getProduct($result['product_id']); } $msec = (microtime(true) - $startTime)*1000; if($_SERVER['REMOTE_ADDR']=='ваш айпи') { echo round($msec,2); exit(); }