[Ищу] массовое добавление товаров в модуль "Рекомендуемые"

Тема в разделе "OpenCart", создана пользователем sonicking, 12 окт 2016.

  1. sonicking

    sonicking

    Регистрация:
    26 май 2013
    Сообщения:
    406
    Симпатии:
    104
    приветствую
    требуется массово добавлять товары в стандартный модуль "Рекомендуемые"
    думал есть возможность решить это через batcheditor, но там такой функционал отсутствует...
    в модуль надо добавлять товары, у которых в поле UPC стоит некий код (одинаковый для всех товаров, которые требуется добавить)
    кто то может помочь с решением?
     
  2. chukcha

    chukcha

    Регистрация:
    9 окт 2014
    Сообщения:
    281
    Симпатии:
    85
    В модуль?
    Не думаю, что вы найдете решение. Данные модуля хранятся в сериализованном виде (или json)
    Максимум, что можно сделать - это фильтровать товары по upc
    Но вставлять все равно руками
    Версия?
    Если для 1.5 - рекомендованные могут быть только один модуль
    В таком случае можно фильтровать getProducts по фильтру upc, но это вмешательство в модель.

    для 2-к их может быть несколько
     
  3. sonicking

    sonicking

    Регистрация:
    26 май 2013
    Сообщения:
    406
    Симпатии:
    104
    да, в модуль (тот, который можно повесить на любой странице)
    версия 1.5
    устроило бы решение, что если у товара в UPC стоит к примеру "12345", он автоматически показывается в данном модуле
     
  4. ostrun

    ostrun

    Регистрация:
    7 ноя 2012
    Сообщения:
    140
    Симпатии:
    37
    Есть модули, которые выводят в ркомендуемые определенные категории и есть модуль, который рандомно выводит в рекомендумые товар. Я лично использую второй модуль, во первых удобно, а во вторых постоянно меняется список товаров на главной.
     
  5. sonicking

    sonicking

    Регистрация:
    26 май 2013
    Сообщения:
    406
    Симпатии:
    104
    у меня немного другая ситуация
    в базе, в поле UPS отмечены товары, которые как бы новинки (что то действительно новое, что то не очень - так хочет начальство)
    т.к. в стандартном модуле "Последние" нет возможности выводить каждый раз продукты рандомно (при каждом обновлении страницы), хочу попробовать выводить эти же продукты через модуль "рекомендуемые" (переименовав его в Новые поступления) в котором возможно выводить продукты рандомно есть
     
  6. ostrun

    ostrun

    Регистрация:
    7 ноя 2012
    Сообщения:
    140
    Симпатии:
    37
    Есть и такой модуль, который выводит последние рандомно. Ищите такой модуль latest_rnd_byctaegorysv
     
  7. sonicking

    sonicking

    Регистрация:
    26 май 2013
    Сообщения:
    406
    Симпатии:
    104
    по latest_rnd_byctaegorysv ничего гугл не находит :о)

    или вы имели ввиду это

    и всё равно, через модуль "Последнии" придётся каждый раз после обновления базы товаров (а это каждый день), нужным товарам ставить новую дату...

    по UPS было бы замечательно/автоматизированно......

    хотя в бачедиторе это можно быстренько сделать :о)

    значит ищем модуль
     
    Последнее редактирование: 13 окт 2016
  8. ostrun

    ostrun

    Регистрация:
    7 ноя 2012
    Сообщения:
    140
    Симпатии:
    37
    Вот такой нужно вам попробовать. У меня он стоит для рекомендуемых, правда стиль CSS нужно будет подстраивать под свой сайт https://opencartforum.com/files/file/1591-2в1-случайные-и-новинки-с-привязкой-к-категории-и/
     
  9. ISomeInterface

    ISomeInterface

    Регистрация:
    4 окт 2016
    Сообщения:
    47
    Симпатии:
    30
    Уточнение, я вас правильно понимаю?
    Вам нужно что бы в модуль выводилось определенное кол-во товаров у которых upc содержит определенное значение, причем товары должны выводиться рандомно ?
     
  10. sonicking

    sonicking

    Регистрация:
    26 май 2013
    Сообщения:
    406
    Симпатии:
    104
    это есть, попробую
    совершенно верно
     
  11. ISomeInterface

    ISomeInterface

    Регистрация:
    4 окт 2016
    Сообщения:
    47
    Симпатии:
    30
    Готового модуля для этих задач не встречал. Если идти по пути переделки модуля "рекомендуемые", тогда могу предложить такой подход:
    В файле (\catalog\controller\module\featured.php) заменить этот код:
    Код:
    if (!empty($setting['product'])) {
                $products = array_slice($setting['product'], 0, (int)$setting['limit']);
    
    На этот:
    Код:
    $upc = 'latest'; //Это значение поменять на нужное
    $products_id = $this->model_catalog_product->getUpcProductsId($upc);
    if (!empty($products_id)) {
        shuffle($products_id);
        $products = array_slice($products_id, 0, (int)$setting['limit']);
    
    И в файле (catalog\model\catalog\product.php) добавить функцию:
    Код:
    public function getUpcProductsId($upc) {
            $products_id = $this->cache->get('product.latest.upc.id');
    
            if (!$products_id) {
                $q = "
                SELECT DISTINCT p.product_id          
                FROM " . DB_PREFIX . "product p
                LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id)
                LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)
                WHERE p.upc = '" . trim($upc) . "'
                    AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "'
                    AND p.status = '1'
                    AND p.date_available <= NOW()
                    AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'";
                $query = $this->db->query($q);
                foreach ($query->rows as $result) {
                    $products_id[] = $result['product_id'];
                }
                $this->cache->set('product.latest.upc.id', $products_id);
           }
           return $products_id;
    }
    
    Это минимально необходимый код для выполнения вашей задачи.
    Управлять через админку можно будет только кол-ом выводимых товаров.
     
    sonicking нравится это.
  12. sonicking

    sonicking

    Регистрация:
    26 май 2013
    Сообщения:
    406
    Симпатии:
    104
    ISomeInterface, спасибо за желание помочь, но:
    в первом файле таких строк нету
    во второй к сожалению не знаю куда вставлять
    приложил на всякий случай эти файлы, если будет возможность, может посмотрите
     
  13. ISomeInterface

    ISomeInterface

    Регистрация:
    4 окт 2016
    Сообщения:
    47
    Симпатии:
    30
    Какая версия OC?
     
  14. sonicking

    sonicking

    Регистрация:
    26 май 2013
    Сообщения:
    406
    Симпатии:
    104
    ocStore Версия 1.5.5.1.2
     
  15. ISomeInterface

    ISomeInterface

    Регистрация:
    4 окт 2016
    Сообщения:
    47
    Симпатии:
    30
    Эту строку:
    Код:
    $products = array_slice($products, 0, (int)$setting['limit']);
    На этот код:
    Код:
    $upc = 'latest'; //Это значение поменять на нужное
    $products_id = $this->model_catalog_product->getUpcProductsId($upc);
    shuffle($products_id);
    $products = array_slice($products_id, 0, (int)$setting['limit']);
    
    Да куда угодно, после конструктора вставьте.
    public function __construct($registry) {
    $this->NOW = date('Y-m-d H:i') . ':00';
    parent::__construct($registry);
    }
    Вставить код:
    Код:
        
    public function getUpcProductsId($upc) {
            $products_id = $this->cache->get('product.latest.upc.id');
    
            if (!$products_id) {
                $q = "
                SELECT DISTINCT p.product_id           
                FROM " . DB_PREFIX . "product p
                LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id)
                LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)
                WHERE p.upc = '" . trim($upc) . "'
                    AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "'
                    AND p.status = '1'
                    AND p.date_available <= NOW()
                    AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'";
                $query = $this->db->query($q);
                foreach ($query->rows as $result) {
                    $products_id[] = $result['product_id'];
                }
                $this->cache->set('product.latest.upc.id', $products_id);
            }
            return $products_id ? $products_id : array();
    }
    
    Должно работать, хотя я с 1.5 дел не имею, проверьте.
     
    sonicking нравится это.
  16. sonicking

    sonicking

    Регистрация:
    26 май 2013
    Сообщения:
    406
    Симпатии:
    104
    вроде работает, товары автоматом добавляются
    но вот с рандомным выводом что то не понятно
    один раз обновляется, а потом одни и теже товары показывает...

    ООООО - не в один продукт зайти не могу!!! везде HTTP ERROR 500
    ВУУУУУ - заработало вроде!
     
    Последнее редактирование: 13 окт 2016
  17. ISomeInterface

    ISomeInterface

    Регистрация:
    4 окт 2016
    Сообщения:
    47
    Симпатии:
    30
    Развернул osstore у меня все как часы работает.
    Единственное что можно изменить: замените функцию на эту (что бы кеширование происходило с привязкой к upс).
    Код:
    public function getUpcProductsId($upc) {
            $products_id = $this->cache->get('product.latest.upc.id.' . $upc);
    
            if (!$products_id) {
                $q = "
                SELECT DISTINCT p.product_id          
                FROM " . DB_PREFIX . "product p
                LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id)
                LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)
                WHERE p.upc = '" . trim($upc) . "'
                    AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "'
                    AND p.status = '1'
                    AND p.date_available <= NOW()
                    AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'";
                $query = $this->db->query($q);
                foreach ($query->rows as $result) {
                    $products_id[] = $result['product_id'];
                }
                $this->cache->set('product.latest.upc.id.' . $upc, $products_id);
            }
            return $products_id ? $products_id : array();
    }
    Это не обязательно, только если вы часто значение $upc менять будете.
    Так как вы видимо в коде ничего не понимаете, хочу заметить что чтобы новый товар появился в списке выводимых нужно либо дождаться пока система
    обновит кеш (по дефолту 1час), либо вручную удалить файл кеша по адресу
    \system\cache\cache.product.latest.upc.id(название файла начинается так)
     
    sonicking нравится это.
  18. sonicking

    sonicking

    Регистрация:
    26 май 2013
    Сообщения:
    406
    Симпатии:
    104
    да. к сожалению в коде я мало что понимаю :о)
    но очень бы хотелось научится на старости лет
    т.е. если я правильно понимаю, что обновление товаров в модуле будет происходить, грубо говоря, каждый час, сколько бы я за этот час не нажимал обновить страницу, товары не поменяются

    и ещё. у меня установлена xml'ка (dbassa_adca_randomize_featured.xml) отвечающая за рандомизацию рекомендуемых. может её стоит убрать?
     
  19. ISomeInterface

    ISomeInterface

    Регистрация:
    4 окт 2016
    Сообщения:
    47
    Симпатии:
    30
    Суть кэширования:
    В данном примере метод getUpcProductsId() выполняет запрос в базу данных, для выборки списка id товаров, у которых значение столбца upc таблицы product равно "latest".
    Данный метод вызывается при каждом обновлении страницы. Так как товары с пометкой upc = "latest" будут добавляться не каждые 5 минут, а в лучшем случае раз в день (наверное), то и выполнять этот запрос каждый раз нет смысла. Поэтому в методе происходит кэширование результатов данного запроса. Если в методе проверка на наличие кэша выдала негативный результат (кэш не обнаружен) тогда выполняется запрос в БД и свежие данные помещаются в кеш, и в течении установленного времени (по дэфолту 1 час) данные при вызове метода будут браться из кеша (их актуальность соответствует времени добавления). Брать готовые данные из кэша менее ресурсозатратно чем выполнять запрос в базу с большим кол-ом товаров. Так что добавляя новые товары путем задания свойства upc = "latest" они не сразу будут отображены, а только когда обновиться кэш. Это нормальная практика, можно даже сказать оптимизация.
    Что бы сказать нужно ли удалять dbassa_adca_randomize_featured.xml его нужно посмотреть, что он делает, и на каком этапе выполнения он это делает.
     
    sonicking нравится это.
  20. sonicking

    sonicking

    Регистрация:
    26 май 2013
    Сообщения:
    406
    Симпатии:
    104