Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

nogocuHoBuk

Users
  • Posts

    356
  • Joined

  • Last visited

Everything posted by nogocuHoBuk

  1. Не понимаю откуда она может взяться при юзании собственной функции с двумя джоинами на получение цвета и линка для перелинковки в карточке. Тем более если таблицу "связей" индекснуть корректно. Тут же не нужно для каждого продукта getProduct() дёргать. Это ж всего 600 строк из индексной страницы с 2мя джоинами по индексным полям. Ну тут то без вопросов. Опять же, для ускорения желательно хранить кастомное поле в самой oc_product чтобы дёргать вместе с product_id. Можно даже что-то из имеющегося неиспользуемого jan, isbn, mnp etc... Тем более на примере числовой формат от 0 до 9999 с ведущим нулём. Во всяком случае поверхностно сложностей не вижу.
  2. Зато нагрузка, в принципе, околонулевая, если учесть что сами связки хранятся непосредственно в таблице товаров (образно можно реализовать подобием product_image, т.е. 2 столбца. main_product_id и dop_product_id) Ну а на фронте тянуть "дай main где dop это я, и если пусто, то дай всех dop'ов, где я main) И, опять же, всё зависит от текущей реализации. Если магазин уже существует и в него уже добавлены для каждого цвета своя карточка - то решение вообще лучшее.
  3. Выбор решения будет зависеть от многих факторов. Для примера Есть товар - нитки. 600 цветов. Как Вы ведете учет складов? На складе ж это не одна номенклатура, а 600, верно? т.е. красных - 100, зеленых - 120, синих - 200 etc... При реализации через опции нужно будет переделывать логику синхронизации со складом, так как теперь количество товара (в карточке) нужно учитывать как общее количество ВСЕХ доступных цветов, а в каждой опции конкретно проставлять количество каждого цвета. Если же у Вас учет каждого цвета в отдельной карточке - тут свой подход нужен. В Админке все останется без изменений (разве что добавить возможность "связать" карточки товара, а вот на фронте нужно будет выводить, например, по каноникалу. Очень мало вводных данных чтобы советовать что-то конкретное.
  4. По ресурсозатратности и времени выполнения ж то же самое, вроде. Не? Да и для того, чтобы нужно запустить всё тот же цикл перебора полученных товаров. Тут же главное суть... не. Имеем сто товаров 99 порублю 1 за 100 рублей в вашем случае средняя цена (100+1)/2 примерно 50 руб в реальности (99+100)/100 примерно 2 руб
  5. Нужно править и контроллер и модель и шаблонизатор twig. В модели есть функция получения количества товаров в категории. Достаточно просто вызвать её в контроллере, передать данные в твиг и отобразить, а вот с мин, макс и средней ценой чуть "интереснее" Нужно создать функцию, которая будет возвращать эти значения. Т.е. обращаемся к БД, говорим - дай все товары, которые в нужной нам категории. Перебираем их циклом и используем поле price для сравнения. Перебором находим мин и макс, а среднее получаем методом сложения всех прайсов и делим на количество товаров. Но функция будет вешать Ваш сайт, особенно если в ней много товаров, потому результат выполнения нужно "кешировать", например писать в статичный файл в json, указывая в нём все 3 значения и "срок годности" . И при обращении к категории проверять файл на существование, а затем на срок годности. Если устарел или не существует - запускаем функцию вышеуказанную и снова пишем в файл. А если существует и дата в порядке - берем данные из json. По реализации - часа полтора-два (без стилизации вывода), т.е. получение, кеширование и передача данных шаблонизатору. При желании можно повесить рассчет и кеширование на крон, чтобы тех редких юзеров, на участь которых может выпасть "устаревание" - не напрягать, а рассчитывать всё в фоне и поддерживать кеш в актуальном состоянии. А при НАСТОЯЩЕМ желании сделать красиво, можно так же обновлять кеш из админки каждый раз, когда добавляется, удаляется или редактируется товар, в зависимости от категории, в которую он входит. Если это "сложно" или "дорого", то вариант предложенный @Tom выше - идеальное решение.
  6. движок отмаслает хоть 200 000. Весь вопрос к ресурсам сервера. скажем так - самое слабое место БД. Но это проблема практически всех CMS без исключения. Ну и многое зависит от модулей. Если поставить некоторые фильтры атрибутов... (не буду тыкать пальцем), то тормоза начнутся на 5000 товаров.
  7. А чем стандартный функционал не устраивает? Пользователи зарегистрированные обязательно принадлежат какой-то группе (по умолчанию Default) Для этой группы пользователей можно создать скидку в товарах. Да, разница лишь, что не по категорям, а только в товарах, Но зато итоговый результат будет именно таким, каким Вы его планируете. А чтобы привязаться к категории - есть модуль:
  8. Я ж понятия не имею как Вы всё выводите и что обрабатываете. По кускам кода сложно "догадаться" Для начала верните как было у Вас в первом посте т.е. Только вместо $options = $this->model_catalog_product->getProductOptions($result['product_id']); будет $options = $this->model_catalog_product->MygetProductOptions($result['product_id']); Только эти правки увеличат скорость обработки (учитывая сколько у Вас групп опций и самих опций в каждом товаре), как минимум раз в 10.
  9. СОздаете в меню 3 ссылки с параметром, например, type_catalog и 3-мя разными значениями M,W и С В хедере ловите $this->request->get('type_catalog') и пишете значение в сессию В каждом товаре добавляете либо аттрибут, либо кастомное свойство (зависит от реализации) и прописываете для всех товаров значения M,W или С Ну и при выборке товаров каталога применяете фильтр по этому свойству (можно написать свою функцию аналог getProducts) который будет отбирать только нужные товары. Зависит от Ваших навыков и опыта.
  10. В catalog/model/catalog/product.php полностью копируете функцию getProductOptions() В скопированной функции переименовываете название на MygetProductOptions и после $product_id добавляете ещё один параметр - $option_id можно с дефолтным значением: Получится так: public function MygetProductOptions($product_id,$option_id = 11) { А в строке запроса, где $product_option_query = ... добавляете фильтр по опции, т.е. перед po.product_id ставите проверку Получится примерно так: было WHERE po.product_id стало: WHERE o.option_id = '" . (int)$option_id . "' AND po.product_id Итоговая функция: public function MygetProductOptions($product_id, $option_id = 11) { $product_option_data = array(); $product_option_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option po LEFT JOIN `" . DB_PREFIX . "option` o ON (po.option_id = o.option_id) LEFT JOIN " . DB_PREFIX . "option_description od ON (o.option_id = od.option_id) WHERE o.option_id = '" . (int)$option_id . "' AND po.product_id = '" . (int)$product_id . "' AND od.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY o.sort_order"); foreach ($product_option_query->rows as $product_option) { $product_option_value_data = array(); $product_option_value_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option_value pov LEFT JOIN " . DB_PREFIX . "option_value ov ON (pov.option_value_id = ov.option_value_id) LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (ov.option_value_id = ovd.option_value_id) WHERE pov.product_id = '" . (int)$product_id . "' AND pov.product_option_id = '" . (int)$product_option['product_option_id'] . "' AND ovd.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY ov.sort_order"); foreach ($product_option_value_query->rows as $product_option_value) { $product_option_value_data[] = array( 'product_option_value_id' => $product_option_value['product_option_value_id'], 'option_value_id' => $product_option_value['option_value_id'], 'name' => $product_option_value['name'], 'image' => $product_option_value['image'], 'quantity' => $product_option_value['quantity'], 'subtract' => $product_option_value['subtract'], 'price' => $product_option_value['price'], 'price_prefix' => $product_option_value['price_prefix'], 'weight' => $product_option_value['weight'], 'weight_prefix' => $product_option_value['weight_prefix'] ); } $product_option_data[] = array( 'product_option_id' => $product_option['product_option_id'], 'product_option_value' => $product_option_value_data, 'option_id' => $product_option['option_id'], 'name' => $product_option['name'], 'type' => $product_option['type'], 'value' => $product_option['value'], 'required' => $product_option['required'] ); } return $product_option_data; } Ну и теперь в контроллере вызывайте вместо $options = $this->model_catalog_product->getProductOptions($result['product_id']); нужно заменить на $options = $this->model_catalog_product->MygetProductOptions($result['product_id']); А если нужно сменить в запросе группу, то так: $options = $this->model_catalog_product->MygetProductOptions($result['product_id'],12); Т.е. запрос будет по группе 12
  11. Общее количество в категории не играет роли. Запрос ограничен количеством на странице. А если уменьшить количество товаров до 12, например? Просто 48 товаров, обход циклом. В цикле 5 групп опций, да по 6-20 опций. Делать "по аналогии" - равносильно прямому запросу. Это не ускорит выполнение. Нужно как-то оптимизировать сам запрос и написать свою функцию получения опций с фильтром (к примеру пропустить какие-то, ) типа: MygetProductOptions($result['product_id'],$filter); ну а в фильтре уже указывать группы опций, или прямо задать какие именно опции нужны.
  12. Это Вы уже что-то совсем не то делаете. Сама getProductOptions всё это уже возвращает. А сколько у Вас товаров в этой категории. И в среднем сколько опций на товар?
  13. Добрый. Что именно Вы сделали "один в один"? То, что процитировали? Отключили ошибки в админке? Это НИКАКИМ образом не влияет на заказы, их открытие, редактирование и прочее. Подобная опция отключает показ ошибок, если таковые имеются. Не более. Пишите в личку - попробуем разобраться с Вашей проблемой
  14. Ваша текущая ошибка - "ВНИМАНИЕ: Ваш IP адрес 89.200.234.223 не имеет доступа к API! Ваш" и "Ваш API ключ недействителен" Вы точно проделали все операции из предыдущего решения? Админка - Система - Настройки (там выберите свой магазин) - Вкладка "Сервер". Ищите там "Показывать ошибки" и ставите "Нет". Опять же, названия пунктов смысловые, зависит от Вашего перевода. Но в конкретной ситуации отключение ошибки не исправит проблему с API . Просто теперь они будут выводиться красным вверху заказа.
  15. Так и есть. Я "API" в тексте даже не заметил А полный текст ошибки "У Вас нет разрешения на доступ к API" Вот это может помочь:
  16. Про готовый модуль не в курсе, но подобное реализовывал вот тут: https://iglaz.ua/apple-iphone-12-128gb-black-mgja3 Делалось и для цвета и для объема. В админке есть блок "связей" для указания дополнительных товаров-цветов. В карточке "главного" товара указывается его цвет А у "Дополнительных товаров" помимо цвета нужно выбрать "главный товар" (он же будет каноникалом для всех остальных цветов Модуль не делался, так как вывод зависит от шаблона. Потому в любом случае нужно "допиливать". Если заинтересует - пишите в ЛС.
  17. зависит от многих "параметров" Версии опенкарта, шаблона, модулей и прочего. Опять же, от того, где именно Вам нужно изменить "количество в ряду". В блоке "рекомендованные" на главной (например) или в каталоге.
  18. Все подобные алерты в опенкарте показываются при ajax запросах при включенном показе ошибок. Т.е. Вы меняете статус заказа, происходит ajax запрос, и скрипт ждёт ответ в формате json, а получает html страницу на которой в самом верху какой-то warning или notice. Ну и при невозможности распарсить json скрипт выдает сообщение "SyntaxError: Unexpected ..." Отключите показ ошибок и, скорее всего, всё заработает.
  19. Вы предлагаете "закостылить" проблему? В принципе можно, но... Ведь по факту товар был некорректно удален. Удалена запись из таблицы oc_product (это можно понять из запроса, так как выборка именно p.product_id) А остальные таблицы скорее всего не тронуты. И в запросе с *, который выше этих самых "product_id" будет как минимум 5. И именно по ним можно определить какой из товаров удален некорректно. Ну и зная product_id можно смело вызвать из /admin/model/catalog/product.php функцию deleteProduct($product_id) и избавиться от хвостов...
  20. Кидайте доступы в личку. Я пока за ПК. Можете создать временные
  21. нужно дебажить. Без вариантов. Кстати. А заскриньте oc_order_history для последних заказов (которые после "правок"
  22. Ну в данный момент пока не ясно плохо ли это. У Вас, видимо, у статуса "Принят" order_status_id = 1, или нет? Только не меняйте order_status_id в БД В настройках системы смените статус закза по умолчанию на любой другой. Например на Оплачен или Отменен
  23. Удалите все заказы Именно удалите, а не отмените. Это реально? Затем очистите таблицу "oc_order_status" Именно таким способом, а не удалением статусов. Чтобы сбросить аутоинкремент Затем в админке создать нужные статусы (те 4, которые Вам нужны) А уже после этого зайти в систему и проставить правильные статусы как тут: И сохранить настройки После этого попробуйте создать заказ
  24. А какой order_status_id у статуса "Принят"? Хотя это вряд-ли поможет, но мало ли. Ну и всех остальных статусов тоже. На всякий....
×
×
  • Create New...

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.