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

1roma1

Новачок
  
  • Публікації

    28
  • З нами

  • Відвідування

Повідомлення, опубліковані користувачем 1roma1

  1. 18 минут назад, Otvet сказал:

    system/library/document.php как выглядит?

    как то так:

    Спойлер

    <?php
    final class Document {
        public $title;
        public $description;
        public $keywords;
        public $base;    
        public $charset = 'utf-8';        
        public $language = 'en-gb';    
        public $direction = 'ltr';        
        public $links = array();        
        public $styles = array();
        public $scripts = array();
        public $breadcrumbs = array();
        
        public function setTitle($title) {
            $this->title = $title;
        }
        
        public function getTitle() {
            return $this->title;
        }
        
        public function setDescription($description) {
            $this->description = $description;
        }
        
        public function getDescription() {
            return $this->description;
        }
        
        public function setKeywords($keywords) {
            $this->keywords = $keywords;
        }
        
        public function getKeywords() {
            return $this->keywords;
        }
        
        public function setBase($base) {
            $this->base = $base;
        }
        
        public function getBase() {
            return $this->base;
        }        
        
        public function setCharset($charset) {
            $this->charset = $charset;
        }
        
        public function getCharset() {
            return $this->charset;
        }    
        
        public function setLanguage($language) {
            $this->language = $language;
        }
        
        public function getLanguage() {
            return $this->language;
        }    
        
        public function setDirection($direction) {
            $this->direction = $direction;
        }
        
        public function getDirection() {
            return $this->direction;
        }    
        
        public function addLink($href, $rel) {
            $this->links[] = array(
                'href' => $href,
                'rel'  => $rel
            );            
        }
        
        public function getLinks() {
            return $this->links;
        }    
        
        public function addStyle($href, $rel = 'stylesheet', $media = 'screen') {
            $this->styles[] = array(
                'href'  => $href,
                'rel'   => $rel,
                'media' => $media
            );            
        }
        
        public function getStyles() {
            return $this->styles;
        }    
        
        public function addScript($script) {
            $this->scripts[] = $script;            
        }
        
        public function getScripts() {
            return $this->scripts;
        }
        
        public function addBreadcrumb($text, $href, $separator = ' &gt; ') {
            $this->breadcrumbs[] = array(
                'text'      => $text,
                'href'      => $href,
                'separator' => $separator
            );            
        }
        
        public function getBreadcrumbs() {
            return $this->breadcrumbs;
        }    
    }
    ?>

     

    пора бы, но во-первых много доработок слетит, во вторых в принципе все утраивает за исключением нюансов

  2. Есть статья https://netpeak.net/ru/blog/optimizatsiya-stranits-paginatsii-internet-magazina-podrobnaya-instruktsiya/ в которой описан способ (№3) настройки оптимальной пангинации который нужно реализовать.

     

    Версия движка ocstore 0.2.2.

    Для контактов использовать ЛС или скайп r_e_n_t_o_n

    Спасибо.

  3. 1. Переделать стандартный модуль "Дополнения-Каналы товаров-Яндекс Маркет" для вывода YML-файла определенного формата. Так же настроить в модуле возможность выбирать некоторые параметры для вывода например конкретного бренда или товаров в зависимости от наличия (можно ли такое сделать, и какие параметры сортировать будет дополнительно обсуждаться с исполнителем).

    2. Настроить синхронизацию с Укрсклад, а именно брать из БД Укрсклада количество и статус наличия товара и заливать в БД магазина.

    3. Есть статья https://netpeak.net/ru/blog/optimizatsiya-stranits-paginatsii-internet-magazina-podrobnaya-instruktsiya/ в которой описан способ (№3) настройки оптимальной пангинации, который и нужно реализовать.

     

    Версия движка ocstore 0.2.2, описал все довольно коротко, если нужно могу подробнее. Необходимость доработок возникает периодически, так что оптимален вариант долгосрочного сотрудничества.

    Для контактов использовать ЛС или скайп r_e_n_t_o_n

    Спасибо.

  4. Необходимо настроить кеширование через memcached и драйвер mysql_cached со включенным в админке SEO-url.

    Проблема в совместной работе этих двух дополнений, а именно - не формируются ссылки на товары и категории.  

    Если seo-url выключить, все работает, но это не вариант.

    Версия магазина ocstore 0.2.2.

  5. Изначально была проведена модификация кода для сортировки доп изображений как написано в этом посте:

    https://opencartforum.com/topic/8972-poriadok-foto-v-dopolnitelnykh-izobrazheniiakh-to/

    Продолжительное время все работало нормально. 

    После смены сервера фотографии начали выводиться как попало.

    Выгрузив каталог и упорядочив все фото в ячейке additional image names (для работы с каталогом используется модуль Export/Import Tool for OpenCart) и загрузив все обратно в базу, выяснилось, что в товаре где фото до 10 т.е. 9, там с выводом на странице товара все нормально, они идут по-порядку. Но там где больше 9, есть проблема.
    Если взять их по номерам, то выводятся они так: 01,10,09,08,07,06,05,04,03,02,11 либо 11,02,03,04,05,06,07,08,09,10,01. При чем, вариант этот меняется когда из админки зайти в карточку товара и нажать сохранить.

    Вернув код к исходному, картинки загрузились (опять же через модуль Export/Import Tool) в том порядке, в каком они и есть в ячейке additional image names. Но, если зайти в карточку товара из админки и нажать сохранить, они перетасуются наоборот, и будут от большего к меньшему. Зайдя еще раз в карточку товара и нажав сохранить, порядок опять изменится от меньшего к большему.
    Фактически фото перетасовываются каждый раз по нажатию кнопки сохранить.

    Необходимо сделать что бы порядок изображений не менялся каждый раз когда нажимаешь кнопку сохранить в карточке товара.
    Версии MySQL 5.1.57 на старом и 5.1.68 на новом серверах.

    Версия магазина 0.2.2

     

    icq: 342 582 181
    skype: r_e_n_t_o_n

  6. Нужно доработать модуль рекомендуемые товары на главной на предмет вывода товаров в установленном порядке. Это должно быть отдельное поле (input) напротив каждого товара, в самом модуле в админке магазина, с возможностью ввода туда чисел, по которым и будет осуществляться сортировка и вывод товаров на главной странице. Похоже как предусмотрено сортировать производителей в меню каталог-производители параметр "порядок сортировки". Версия магазина 0.2.2.

     

    icq: 342 582 181
    skype: r_e_n_t_o_n

  7. Есть версия фильтра 2.0 и ocstore 0.2.2. Необходимо отключить отображение фильтра когда пользователь перешел в карточку товара. Он там совершенно не нужен, только занимает лишнее место в левой колонке.

     

    icq: 342 582 181

    skype: r_e_n_t_o_n

     

    В этом как раз и есть отличие в версиях.

    Колонки будут преследовать по всюду так как в старом ОК нет схем.

     

    а это вы собственно к чему?))

  8. Есть версия фильтра 2.0 и ocstore 0.2.2. Необходимо отключить отображение фильтра когда пользователь перешел в карточку товара. Он там совершенно не нужен, только занимает лишнее место в левой колонке.

     

    icq: 342 582 181

    skype: r_e_n_t_o_n

  9. Привет всем!

    Попытался сделать копию модуля рекомендуемые товары на главной в ocStore 0.2.2. Порядок действий такой:

    1. Скопировал файлы, переименовал их добавил в конце m:

    admin\controller\module\featuredm.php

    admin\language\russian\module\featuredm.php

    admin\view\template\module\featuredm.tpl

    catalog\controller\module\featuredm.php

    catalog\language\russian\module\featuredm.php

    catalog\view\theme\default\template\module\featuredm.tpl

    catalog\view\theme\default\template\module\featuredm_home.tpl

    2. В содержимом каждого файла заменил featured на featuredm.

    3. В языковых файлах строку $_['heading_title'] = 'Рекомендуемые'; заменил на $_['heading_title'] = 'Рекомендуемые клон';

    4. Залил все файлы обратно.

    5. В файле admin\model\catalog\product.php после

    public function addFeatured($data) {
    $this->db->query("DELETE FROM " . DB_PREFIX . "product_featured");
    if (isset($data['product_featured'])) {
    foreach ($data['product_featured'] as $product_id) {
    $this->db->query("INSERT INTO " . DB_PREFIX . "product_featured (product_id) VALUES ('" . (int)$product_id . "')");
    }}}

    добавил

    public function addFeaturedm($data) {
    $this->db->query("DELETE FROM " . DB_PREFIX . "product_featuredm");
    if (isset($data['product_featuredm'])) {
    foreach ($data['product_featuredm'] as $product_id) {
    $this->db->query("INSERT INTO " . DB_PREFIX . "product_featuredm (product_id) VALUES ('" . (int)$product_id . "')");
    }}}

    в том же файле чуть ниже после

    public function getFeaturedProducts() {
    $product_featured_data = array();
    $query = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product_featured");
    foreach ($query->rows as $result) {
    $product_featured_data[] = $result['product_id'];
    }
    return $product_featured_data; }

    добавил

    public function getFeaturedmProducts() {
    $product_featuredm_data = array();
    $query = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product_featuredm");
    foreach ($query->rows as $result) {
    $product_featuredm_data[] = $result['product_id'];
    }
    return $product_featuredm_data; } 

    6. В файле catalog\model\catalog\product.php после

    public function getFeaturedProducts($limit) {
    $product_data = $this->cache->get('product.featured.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $limit);
    if (!$product_data) {
    $query = $this->db->query("SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product_featured f LEFT JOIN " . DB_PREFIX . "product p ON (f.product_id=p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (f.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' LIMIT " . (int)$limit);
    $product_data = $query->rows;
    $this->cache->set('product.featured.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $limit, $product_data); }
    return $product_data; }

    добавил

    public function getFeaturedmProducts($limit) {
    $product_data = $this->cache->get('product.featuredm.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $limit);
    if (!$product_data) {
    $query = $this->db->query("SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product_featuredm f LEFT JOIN " . DB_PREFIX . "product p ON (f.product_id=p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (f.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' LIMIT " . (int)$limit);
    $product_data = $query->rows;
    $this->cache->set('product.featuredm.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $limit, $product_data); }
    return $product_data; }

    7. В MyphpAdmin скопировал таблицу с данными oc_product_featured и назвал oc_product_featuredm.

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

    Проблема в том что модуль выводит не все товары. Или совсем не выводит. Если в функциях getFeaturedmProducts и addFeaturedmProducts указывать таблицы product_featured ситуация почти та же. За исключением того что, если в одном модуле выбрать товары, те же будут выбраны и в другом, но выводятся они тоже не все.

    Прошу подсказать в какую сторону копать дальше.

  10. Всем привет!

    Народ, подскажите пожалуйста, есть версия фильтра 2.0 и ocstore 0.2.2. Как отключить отображение фильтра когда пользователь перешел в карточку товара? Он там совершенно не нужен, только занимает лишнее место в левой колонке.

  11. Народ, подскажите пожалуйста.

    Еще вопрос возник...

    При просмотре отфильтрованных товаров, нет возможности изменить сортировку. Он пересортировывает все товары, без учета фильтров. Или это я что-то не так сделал??

    Если сделать как писал SOOR

    LiS, сравните код с вашим в category.php

    if (isset($this->request->get['filter'])) {
      $url .= '&filter=' . $this->request->get['filter'];
    }
    
    $this->data['sorts'] = array();

    И стоит ли переменная $url во всех элементах массива sorts?

    Должно быть так:

    if (isset($this->request->get['filter'])) {

    $url .= '&filter=' . $this->request->get['filter'];

    }

    $this->data['sorts'] = array();

    $this->data['sorts'][] = array('text' => $this->language->get('text_name_asc'), 'value' => 'pd.name-ASC', 'href' => $this->model_tool_seo_url->rewrite($this->url->http('product/category&path=' . $this->request->get['path'] . '&sort=pd.name&order=ASC' . $url)));

    $this->data['sorts'][] = array('text' => $this->language->get('text_name_desc'), 'value' => 'pd.name-DESC', 'href' => $this->model_tool_seo_url->rewrite($this->url->http('product/category&path=' . $this->request->get['path'] . '&sort=pd.name&order=DESC' . $url)));

    $this->data['sorts'][] = array('text' => $this->language->get('text_price_asc'), 'value' => 'p.price-ASC', 'href' => $this->model_tool_seo_url->rewrite($this->url->http('product/category&path=' . $this->request->get['path'] . '&sort=p.price&order=ASC' . $url)));

    $this->data['sorts'][] = array('text' => $this->language->get('text_price_desc'), 'value' => 'p.price-DESC', 'href' => $this->model_tool_seo_url->rewrite($this->url->http('product/category&path=' . $this->request->get['path'] . '&sort=p.price&order=DESC' . $url)));

    $this->data['sorts'][] = array('text' => $this->language->get('text_rating_desc'), 'value' => 'rating-DESC', 'href' => $this->model_tool_seo_url->rewrite($this->url->http('product/category&path=' . $this->request->get['path'] . '&sort=rating&order=DESC' . $url)));

    $this->data['sorts'][] = array('text' => $this->language->get('text_rating_asc'), 'value' => 'rating-ASC', 'href' => $this->model_tool_seo_url->rewrite($this->url->http('product/category&path=' . $this->request->get['path'] . '&sort=rating&order=ASC' . $url)));

    Внимание, состав элементов массива sorts в вашей версии OpenCart может отличаться! Так что не копируйте данный код, а просто исправьте при необходимости свой.

    то сортировка действительно работает, но при перелистывании страницы с товарами фильтр обнуляется точно так же как и было при смене сортировки.

    Файл category.php такой:

    <?php
    class ControllerProductCategory extends Controller {
    public function index() {
    $this->language->load('product/category');
    
    $this->document->breadcrumbs = array();
    
    $this->document->breadcrumbs[] = array(
    'href' => HTTP_SERVER . 'index.php?route=common/home',
    'text' => $this->language->get('text_home'),
    'separator' => FALSE
    );
    
    $this->load->model('catalog/category');
    $this->load->model('tool/seo_url');
    
    if (isset($this->request->get['path'])) {
    $path = '';
    
    $parts = explode('_', $this->request->get['path']);
    
    foreach ($parts as $path_id) {
    $category_info = $this->model_catalog_category->getCategory($path_id);
    
    if ($category_info) {
    if (!$path) {
    $path = $path_id;
    } else {
    $path .= '_' . $path_id;
    }
    
    $this->document->breadcrumbs[] = array(
    'href' => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $path),
    'text' => $category_info['name'],
    'separator' => $this->language->get('text_separator')
    );
    }
    }
    
    $category_id = array_pop($parts);
    } else {
    $category_id = 0;
    }
    
    $category_info = $this->model_catalog_category->getCategory($category_id);
    
    if ($category_info) {
    $this->document->title = ($category_info['title']) ? $category_info['title'] : $category_info['name'];
    
    $this->document->keywords = $category_info['meta_keywords'];
    
    $this->document->description = $category_info['meta_description'];
    
    $this->data['heading_title'] = ($category_info['h1']) ? $category_info['h1'] : $category_info['name'];
    
    $this->data['description'] = html_entity_decode($category_info['description'], ENT_QUOTES, 'UTF-8');
    
    $this->data['text_sort'] = $this->language->get('text_sort');
    
    $this->data['text_error'] = $this->language->get('text_empty');
    
    $this->load->model('tool/image');
    
    if ($category_info['image']) {
    $image = $category_info['image'];
    } else {
    $image = '';
    }
    
    $this->data['thumb'] = $this->model_tool_image->resize($image, $this->config->get('config_image_category_width'), $this->config->get('config_image_category_height'));
    
    if (isset($this->request->get['page'])) {
    $page = $this->request->get['page'];
    } else {
    $page = 1;
    }
    
    if (isset($this->request->get['sort'])) {
    $sort = $this->request->get['sort'];
    } else {
    $sort = 'p.sort_order';
    }
    
    if (isset($this->request->get['order'])) {
    $order = $this->request->get['order'];
    } else {
    $order = 'ASC';
    }
    // Start Filter
    if (isset($this->request->get['filter'])) {
    $filter = $this->request->get['filter'];
    } else {
    $filter = '';
    }
    // End filter
    $url = '';
    
    if (isset($this->request->get['sort'])) {
    $url .= '&sort=' . $this->request->get['sort'];
    }
    
    if (isset($this->request->get['order'])) {
    $url .= '&order=' . $this->request->get['order'];
    }
    // Start Filter
    if (isset($this->request->get['filter'])) {
    $url .= '&filter=' . $this->request->get['filter'];
    }
    // End Filter
    $this->load->model('catalog/product');
    
    $category_total = $this->model_catalog_category->getTotalCategoriesByCategoryId($category_id);
    $product_total = $this->model_catalog_product->getTotalProductsByCategoryId($category_id, $filter);
    
    if ($category_total || $product_total) {
    $this->data['categories'] = array();
    
    $results = $this->model_catalog_category->getCategories($category_id);
    
    foreach ($results as $result) {
    if ($result['image']) {
    $image = $result['image'];
    } else {
    $image = 'no_image.jpg';
    }
    
    $this->data['categories'][] = array(
    'name' => $result['name'],
    'href' => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . '_' . $result['category_id'] . $url),
    'thumb' => $this->model_tool_image->resize($image, $this->config->get('config_image_category_width'), $this->config->get('config_image_category_height'))
    );
    }
    
    $this->load->model('catalog/review');
    
    $this->data['button_add_to_cart'] = $this->language->get('button_add_to_cart');
    
    $this->data['products'] = array();
    
    $results = $this->model_catalog_product->getProductsByCategoryId($category_id, $filter, $sort, $order, ($page - 1) * $this->config->get('config_catalog_limit'), $this->config->get('config_catalog_limit'));
    
    foreach ($results as $result) {
    if ($result['image']) {
    $image = $result['image'];
    } else {
    $image = 'no_image.jpg';
    }
    
    if ($this->config->get('config_review')) {
    $rating = $this->model_catalog_review->getAverageRating($result['product_id']);
    } else {
    $rating = false;
    }
    
    $special = FALSE;
    
    $discount = $this->model_catalog_product->getProductDiscount($result['product_id']);
    
    if ($discount) {
    $price = $this->currency->format($this->tax->calculate($discount, $result['tax_class_id'], $this->config->get('config_tax')));
    } else {
    $price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')));
    
    $special = $this->model_catalog_product->getProductSpecial($result['product_id']);
    
    if ($special) {
    $special = $this->currency->format($this->tax->calculate($special, $result['tax_class_id'], $this->config->get('config_tax')));
    }
    }
    
    $options = $this->model_catalog_product->getProductOptions($result['product_id']);
    
    if ($options) {
    $add = $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/product&product_id=' . $result['product_id']);
    } else {
    $add = HTTPS_SERVER . 'index.php?route=checkout/cart&product_id=' . $result['product_id'];
    }
    
    $this->data['products'][] = array(
    'name' => $result['name'],
    'model' => $result['model'],
    'rating' => $rating,
    'stars' => sprintf($this->language->get('text_stars'), $rating),
    'thumb' => $this->model_tool_image->resize($image, $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height')),
    'price' => $price,
    'options' => $options,
    'special' => $special,
    'href' => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/product&path=' . $this->request->get['path'] . '&product_id=' . $result['product_id']),
    'add' => $add
    );
    }
    
    if (!$this->config->get('config_customer_price')) {
    $this->data['display_price'] = TRUE;
    } elseif ($this->customer->isLogged()) {
    $this->data['display_price'] = TRUE;
    } else {
    $this->data['display_price'] = FALSE;
    }
    
    $url = '';
    
    if (isset($this->request->get['page'])) {
    $url .= '&page=' . $this->request->get['page'];
    }
    
    $this->data['sorts'] = array();
    
    $this->data['sorts'][] = array(
    'text' => $this->language->get('text_default'),
    'value' => 'p.sort_order-ASC',
    'href' => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . '&sort=p.sort_order&order=ASC')
    );
    /*
    $this->data['sorts'][] = array(
    'text' => $this->language->get('text_name_asc'),
    'value' => 'pd.name-ASC',
    'href' => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . '&sort=pd.name&order=ASC')
    );
    
    $this->data['sorts'][] = array(
    'text' => $this->language->get('text_name_desc'),
    'value' => 'pd.name-DESC',
    'href' => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . '&sort=pd.name&order=DESC')
    );
    */
    $this->data['sorts'][] = array(
    'text' => $this->language->get('text_price_asc'),
    'value' => 'p.price-ASC',
    'href' => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . '&sort=p.price&order=ASC')
    );
    
    $this->data['sorts'][] = array(
    'text' => $this->language->get('text_price_desc'),
    'value' => 'p.price-DESC',
    'href' => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . '&sort=p.price&order=DESC')
    );
    
    if ($this->config->get('config_review')) {
    $this->data['sorts'][] = array(
    'text' => $this->language->get('text_rating_desc'),
    'value' => 'rating-DESC',
    'href' => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . '&sort=rating&order=DESC')
    );
    /*
    $this->data['sorts'][] = array(
    'text' => $this->language->get('text_rating_asc'),
    'value' => 'rating-ASC',
    'href' => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . '&sort=rating&order=ASC')
    );
    */
    }
    /*
    $this->data['sorts'][] = array(
    'text' => $this->language->get('text_model_asc'),
    'value' => 'p.model-ASC',
    'href' => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . '&sort=p.model&order=ASC')
    );
    
    $this->data['sorts'][] = array(
    'text' => $this->language->get('text_model_desc'),
    'value' => 'p.model-DESC',
    'href' => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . '&sort=p.model&order=DESC')
    );
    */
    $url = '';
    
    if (isset($this->request->get['sort'])) {
    $url .= '&sort=' . $this->request->get['sort'];
    }
    
    if (isset($this->request->get['order'])) {
    $url .= '&order=' . $this->request->get['order'];
    }
    // Start filter
    if (isset($this->request->get['filter'])) {
    $url .= '&filter=' . $this->request->get['filter'];
    }
    // End filter
    
    $pagination = new Pagination();
    $pagination->total = $product_total;
    $pagination->page = $page;
    $pagination->limit = $this->config->get('config_catalog_limit');
    $pagination->text = $this->language->get('text_pagination');
    $pagination->url = $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . $url . '&page={page}');
    
    $this->data['pagination'] = $pagination->render();
    
    $this->data['sort'] = $sort;
    $this->data['order'] = $order;
    
    if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/product/category.tpl')) {
    $this->template = $this->config->get('config_template') . '/template/product/category.tpl';
    } else {
    $this->template = 'default/template/product/category.tpl';
    }
    
    $this->children = array(
    'common/column_right',
    'common/column_left',
    'common/footer',
    'common/header'
    );
    
    $this->response->setOutput($this->render(TRUE), $this->config->get('config_compression'));
    } else {
    $this->document->title = ($category_info['title']) ? $category_info['title'] : $category_info['name']; ;
    
    $this->document->description = $category_info['meta_description'];
    
    $this->data['heading_title'] = ($category_info['h1']) ? $category_info['h1'] : $category_info['name'];;
    
    $this->data['text_error'] = $this->language->get('text_empty');
    
    $this->data['button_continue'] = $this->language->get('button_continue');
    
    $this->data['continue'] = HTTP_SERVER . 'index.php?route=common/home';
    
    $this->data['categories'] = array();
    
    $this->data['products'] = array();
    
    if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/product/category.tpl')) {
    $this->template = $this->config->get('config_template') . '/template/product/category.tpl';
    } else {
    $this->template = 'default/template/product/category.tpl';
    }
    
    $this->children = array(
    'common/column_right',
    'common/column_left',
    'common/footer',
    'common/header'
    );
    
    $this->response->setOutput($this->render(TRUE), $this->config->get('config_compression'));
    }
    } else {
    $url = '';
    
    if (isset($this->request->get['sort'])) {
    $url .= '&sort=' . $this->request->get['sort'];
    }
    
    if (isset($this->request->get['order'])) {
    $url .= '&order=' . $this->request->get['order'];
    }
    // Start filter
    if (isset($this->request->get['filter'])) {
    $url .= '&filter=' . $this->request->get['filter'];
    }
    // End filter
    if (isset($this->request->get['page'])) {
    $url .= '&page=' . $this->request->get['page'];
    }
    
    if (isset($this->request->get['path'])) {
    $this->document->breadcrumbs[] = array(
    'href' => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . $url),
    'text' => $this->language->get('text_error'),
    'separator' => $this->language->get('text_separator')
    );
    }
    
    $this->document->title = $this->language->get('text_error');
    
    $this->data['heading_title'] = $this->language->get('text_error');
    
    $this->data['text_error'] = $this->language->get('text_error');
    
    $this->data['button_continue'] = $this->language->get('button_continue');
    
    $this->data['continue'] = HTTP_SERVER . 'index.php?route=common/home';
    
    if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/error/not_found.tpl')) {
    $this->template = $this->config->get('config_template') . '/template/error/not_found.tpl';
    } else {
    $this->template = 'default/template/error/not_found.tpl';
    }
    
    $this->children = array(
    'common/column_right',
    'common/column_left',
    'common/footer',
    'common/header'
    );
    
    $this->response->setOutput($this->render(TRUE), $this->config->get('config_compression'));
    }
    }
    }
    ?>
    

    Как сделать что бы работало все вместе?

  12. Подскажите, мож кто сталкивался с такой проблемой. Фильтр установил, создал новые опции в разделе "фильр товаров", а вот самом товаре в разделе опции ничего создать не могу. Есть только поле ввода с "+" справа. Если начинаю вводить в поле ввода назавание, окна выбора не пояляется?

    В чем может быть причина?Куда копать?

    для начала вы бы хоть версию фильтра и магазина указали.

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

  13. Всем привет! Есть проблема, которую уже поднимали (атрибуты в даном случае это значения опций фильтра):

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

    Так же есть решение:

    Файл

    catalog/model/catalog/filter.php
    В запрос функции

    public function getOptionValues($option_id) {
    добавить

    ORDER BY covd.`name` ASC
    Должно получиться так:

    public function getOptionValues($option_id) {
       $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category_option_value cov LEFT JOIN " . DB_PREFIX . "category_option_value_description covd ON (cov.value_id = covd.value_id) WHERE cov.option_id = '" . (int)$option_id . "' AND covd.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY covd.`name` ASC");

    Но. В таком случае сортировка значений опции будет по алфавиту. Может кто-то подсказать как сделать, что бы значения выводились в том порядке, в котором их добавили первым - первое, вторим - второе и т.д.

    mod.name: [Модуль] [sooR] Фильтр товаров в категории 2.0 Переделанный модуль. Стабильный и правильный.

    ocStore 0.2.2

    Заранее спасибо!

  14. Привет всем!

    Прошу помочь знающих в решении вроде бы простой задачи. Собственно вопрос такой: как сделать, что бы главное изображение товара показывалось только в каталоге, а уже при входе в карточку товара, оно заменялось бы первым из дополнительных. Фактически что бы главная фотография товара фигурировала только в виде миниатюры в каталоге, последних поступлениях и т.д.

  15. Спасибо большое! все работает!

    В блоке $sort_data = array нужно было не добавить 's_price', а заменить ним 'p.price'.

    Полный код рабочего файла catalog/model/catalog/product.php представил ниже, может кому пригодится (версия OcStore 0.2.2!).

    <?php
    class ModelCatalogProduct extends Model {
    public function getProduct($product_id) {
      $query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock 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) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.date_available <= NOW() AND p.status = '1'");
      return $query->row;
    }
    public function getProducts() {
      $query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, wcd.unit AS weight_class 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) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) LEFT JOIN " . DB_PREFIX . "weight_class_description wcd ON (p.weight_class_id = wcd.weight_class_id) WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.date_available <= NOW() AND p.status = '1'");
      return $query->rows;
    }
    public function getProductsByCategoryId($category_id, $sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20) {
      $sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating 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) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2c.category_id = '" . (int)$category_id . "'";
    		 if ($sort=='p.price'){
    		 if ($this->customer->isLogged()) {
    			 $customer_group_id = $this->customer->getCustomerGroupId();
    		 } else {
    			$customer_group_id = $this->config->get('config_customer_group_id');
    		 }
    		$sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating, ". "coalesce((SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND customer_group_id = '" . (int)$customer_group_id . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY priority ASC, price ASC LIMIT 1), p.price) as s_price ". "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) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2c.category_id = '" . (int)$category_id . "'";
    $sort = 's_price';
    }
      $sort_data = array(
       'pd.name',
       'p.sort_order',
       'special',
       'rating',
       'p.price',
       's_price',
       'p.model'
      );
      if (in_array($sort, $sort_data)) {
       if ($sort == 'pd.name' || $sort == 'p.model') {
    	$sql .= " ORDER BY LCASE(" . $sort . ")";
       } else {
    	$sql .= " ORDER BY " . $sort;
       }
      } else {
       $sql .= " ORDER BY p.sort_order";
      }
      if ($order == 'DESC') {
       $sql .= " DESC";
      } else {
       $sql .= " ASC";
      }
      if ($start < 0) {
       $start = 0;
      }
      $sql .= " LIMIT " . (int)$start . "," . (int)$limit;
      $query = $this->db->query($sql);
      return $query->rows;
    }
    public function getTotalProductsByCategoryId($category_id = 0) {
      $query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "product_to_category p2c LEFT JOIN " . DB_PREFIX . "product p ON (p2c.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND p2c.category_id = '" . (int)$category_id . "'");
      return $query->row['total'];
    }
    public function getProductsByManufacturerId($manufacturer_id, $sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20) {
      $sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating 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) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND m.manufacturer_id = '" . (int)$manufacturer_id. "'";
    		if ($sort == 'p.price') {
    				if ($this->customer->isLogged()) {
    						$customer_group_id = $this->customer->getCustomerGroupId();
    				} else {
    						$customer_group_id = $this->config->get('config_customer_group_id');
    				}
    				$sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating," .
    						"coalesce((SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND customer_group_id = '" . (int)$customer_group_id . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY priority ASC, price ASC LIMIT 1), p.price) as s_price " .
    						" 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) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND m.manufacturer_id = '" . (int)$manufacturer_id . "'";
    				$sort = 's_price';
    		}
      $sort_data = array(
       'pd.name',
       'p.sort_order',
       'special',
       'rating',
       's_price',
       'p.model'
      );
      if (in_array($sort, $sort_data)) {
       if ($sort == 'pd.name' || $sort == 'p.model') {
    	$sql .= " ORDER BY LCASE(" . $sort . ")";
       } else {
    	$sql .= " ORDER BY " . $sort;
       }
      } else {
       $sql .= " ORDER BY p.sort_order";
      }
      if ($order == 'DESC') {
       $sql .= " DESC";
      } else {
       $sql .= " ASC";
      }
      if ($start < 0) {
       $start = 0;
      }
      $sql .= " LIMIT " . (int)$start . "," . (int)$limit;
      $query = $this->db->query($sql);
      return $query->rows;
    }
    public function getTotalProductsByManufacturerId($manufacturer_id = 0) {
      $query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "product WHERE status = '1' AND date_available <= NOW() AND manufacturer_id = '" . (int)$manufacturer_id . "'");
      return $query->row['total'];
    }
    public function getProductsByTag($tag, $category_id = 0, $sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20) {
      if ($tag) {
       $sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_tags pt ON (p.product_id = pt.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "'  AND pt.language_id = '" . (int)$this->config->get('config_language_id') . "' AND (pt.tag = '" . $this->db->escape($tag) . "'";
       $keywords = explode(" ", $tag);
       foreach ($keywords as $keyword) {
    	$sql .= " OR pt.tag = '" . $this->db->escape($keyword) . "'";
       }
       $sql .= ")";
       if ($category_id) {
    	$data = array();
    	$this->load->model('catalog/category');
    	$string = rtrim($this->getPath($category_id), ',');
    	foreach (explode(',', $string) as $category_id) {
    	 $data[] = "category_id = '" . (int)$category_id . "'";
    	}
    	$sql .= " AND p.product_id IN (SELECT product_id FROM " . DB_PREFIX . "product_to_category WHERE " . implode(" OR ", $data) . ")";
       }
       $sql .= " AND p.status = '1' AND p.date_available <= NOW() GROUP BY p.product_id";
       $sort_data = array(
    	'pd.name',
    	'p.sort_order',
    	'special',
    	'rating',
    	'p.price',
    	'p.model'
       );
       if (in_array($sort, $sort_data)) {
    	if ($sort == 'pd.name' || $sort == 'p.model') {
    	 $sql .= " ORDER BY LCASE(" . $sort . ")";
    	} else {
    	 $sql .= " ORDER BY " . $sort;
    	}
       } else {
    	$sql .= " ORDER BY p.sort_order";
       }
       if ($order == 'DESC') {
    	$sql .= " DESC";
       } else {
    	$sql .= " ASC";
       }
       if ($start < 0) {
    	$start = 0;
       }
       $sql .= " LIMIT " . (int)$start . "," . (int)$limit;
       $query = $this->db->query($sql);
       $products = array();
       foreach ($query->rows as $key => $value) {
    	$products[$value['product_id']] = $this->getProduct($value['product_id']);
       }
       return $products;
      }
    }
    public function getProductsByKeyword($keyword, $category_id = 0, $description = FALSE, $model = FALSE, $sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20) {
      if ($keyword) {
       $sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating 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) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "'";
       if (!$description) {
    	$sql .= " AND (pd.name LIKE '%" . $this->db->escape($keyword) . "%'";
       } else {
    	$sql .= " AND (pd.name LIKE '%" . $this->db->escape($keyword) . "%' OR pd.description LIKE '%" . $this->db->escape($keyword) . "%'";
       }
       if (!$model) {
    	$sql .= ")";
       } else {
    	$sql .= " OR p.model LIKE '%" . $this->db->escape($keyword) . "%')";
       }
       if ($category_id) {
    	$data = array();
    	$this->load->model('catalog/category');
    	$string = rtrim($this->getPath($category_id), ',');
    	foreach (explode(',', $string) as $category_id) {
    	 $data[] = "category_id = '" . (int)$category_id . "'";
    	}
    	$sql .= " AND p.product_id IN (SELECT product_id FROM " . DB_PREFIX . "product_to_category WHERE " . implode(" OR ", $data) . ")";
       }
       $sql .= " AND p.status = '1' AND p.date_available <= NOW() GROUP BY p.product_id";
       $sort_data = array(
    	'pd.name',
    	'p.sort_order',
    	'special',
    	'rating',
    	'p.price',
    	'p.model'
       );
       if (in_array($sort, $sort_data)) {
    	if ($sort == 'pd.name' || $sort == 'p.model') {
    	 $sql .= " ORDER BY LCASE(" . $sort . ")";
    	} else {
    	 $sql .= " ORDER BY " . $sort;
    	}
       } else {
    	$sql .= " ORDER BY p.sort_order";
       }
       if ($order == 'DESC') {
    	$sql .= " DESC";
       } else {
    	$sql .= " ASC";
       }
       if ($start < 0) {
    	$start = 0;
       }
       $sql .= " LIMIT " . (int)$start . "," . (int)$limit;
       $query = $this->db->query($sql);
       return $query->rows;
      }
      return 0;
    }
    public function getTotalProductsByKeyword($keyword, $category_id = 0, $description = FALSE, $model = FALSE) {
      if ($keyword) {
       $sql = "SELECT COUNT(*) AS total 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 pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'";
       if (!$description) {
    	$sql .= " AND (pd.name LIKE '%" . $this->db->escape($keyword) . "%'";
       } else {
    	$sql .= " AND (pd.name LIKE '%" . $this->db->escape($keyword) . "%' OR pd.description LIKE '%" . $this->db->escape($keyword) . "%'";
       }
       if (!$model) {
    	$sql .= ")";
       } else {
    	$sql .= " OR p.model LIKE '%" . $this->db->escape($keyword) . "%')";
       }
       if ($category_id) {
    	$data = array();
    	$this->load->model('catalog/category');
    	$string = rtrim($this->getPath($category_id), ',');
    	foreach (explode(',', $string) as $category_id) {
    	 $data[] = "category_id = '" . (int)$category_id . "'";
    	}
    	$sql .= " AND p.product_id IN (SELECT product_id FROM " . DB_PREFIX . "product_to_category WHERE " . implode(" OR ", $data) . ")";
       }
       $sql .= " AND p.status = '1' AND p.date_available <= NOW()";
       $query = $this->db->query($sql);
       if ($query->num_rows) {
    	return $query->row['total'];
       } else {
    	return 0;
       }
      }
      return 0;
    }
    public function getTotalProductsByTag($tag, $category_id = 0) {
      if ($tag) {
       $sql = "SELECT COUNT(*) AS total FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_tags pt ON (p.product_id = pt.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "'  AND pt.language_id = '" . (int)$this->config->get('config_language_id') . "' AND (pt.tag = '" . $this->db->escape($tag) . "'";
       $keywords = explode(" ", $tag);
       foreach ($keywords as $keyword) {
    	$sql .= " OR pt.tag = '" . $this->db->escape($keyword) . "'";
       }
       $sql .= ")";
       if ($category_id) {
    	$data = array();
    	$this->load->model('catalog/category');
    	$string = rtrim($this->getPath($category_id), ',');
    	foreach (explode(',', $string) as $category_id) {
    	 $data[] = "category_id = '" . (int)$category_id . "'";
    	}
    	$sql .= " AND p.product_id IN (SELECT product_id FROM " . DB_PREFIX . "product_to_category WHERE " . implode(" OR ", $data) . ")";
       }
       $sql .= " AND p.status = '1' AND p.date_available <= NOW()";
       $query = $this->db->query($sql);
       if ($query->num_rows) {
    	return $query->row['total'];
       } else {
    	return 0;
       }
      }
      return 0;
    }
    public function getPath($category_id) {
      $string = $category_id . ',';
      $results = $this->model_catalog_category->getCategories($category_id);
      foreach ($results as $result) {
       $string .= $this->getPath($result['category_id']);
      }
      return $string;
    }
    public function getLatestProducts($limit) {
      $product_data = $this->cache->get('product.latest.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $limit);
      if (!$product_data) {
       $query = $this->db->query("SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating 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) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY p.date_added DESC LIMIT " . (int)$limit);
       $product_data = $query->rows;
       $this->cache->set('product.latest.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $limit, $product_data);
      }
      return $product_data;
    }
    public function getPopularProducts($limit) {
      $query = $this->db->query("SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating 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) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY p.viewed, p.date_added DESC LIMIT " . (int)$limit);
      return $query->rows;
    }
    public function getFeaturedProducts($limit) {
      $product_data = $this->cache->get('product.featured.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $limit);
      if (!$product_data) {
       $query = $this->db->query("SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product_featured f LEFT JOIN " . DB_PREFIX . "product p ON (f.product_id=p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (f.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' LIMIT " . (int)$limit);
       $product_data = $query->rows;
       $this->cache->set('product.featured.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $limit, $product_data);
      }
      return $product_data;
    }
    public function getBestSellerProducts($limit) {
      $product_data = $this->cache->get('product.bestseller.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $limit);
      if (!$product_data) {
       $product_data = array();
       $query = $this->db->query("SELECT op.product_id, SUM(op.quantity) AS total, p.status FROM " . DB_PREFIX . "order_product op LEFT JOIN `" . DB_PREFIX . "order` o ON (op.order_id = o.order_id) LEFT JOIN `" . DB_PREFIX . "product` p ON (op.product_id = p.product_id) WHERE o.order_status_id > '0' AND p.status = '1' GROUP BY op.product_id, p.status ORDER BY total DESC LIMIT " . (int)$limit);
       foreach ($query->rows as $result) {
    	$product_query = $this->db->query("SELECT * 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.product_id = '" . (int)$result['product_id'] . "' AND p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");
    	if ($product_query->num_rows) {
    	 $product_data[] = $product_query->row;
    	}
       }
       $this->cache->set('product.bestseller.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $limit, $product_data);
      }
      return $product_data;
    }
    public function updateViewed($product_id) {
      $this->db->query("UPDATE " . DB_PREFIX . "product SET viewed = viewed + 1 WHERE product_id = '" . (int)$product_id . "'");
    }
    public function getProductOptions($product_id) {
      $product_option_data = array();
      $product_option_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option WHERE product_id = '" . (int)$product_id . "' ORDER BY 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 WHERE product_option_id = '" . (int)$product_option['product_option_id'] . "' ORDER BY sort_order");
       foreach ($product_option_value_query->rows as $product_option_value) {
    	$product_option_value_description_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option_value_description WHERE product_option_value_id = '" . (int)$product_option_value['product_option_value_id'] . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");
    	$product_option_value_data[] = array(
    				'product_option_value_id' => $product_option_value['product_option_value_id'],
    				'name'					=> $product_option_value_description_query->row['name'],
    				'price'				   => $product_option_value['price'],
    				'prefix'				  => $product_option_value['prefix'],
    				'quantity'			  => $product_option_value['quantity'] /* webme - options show|hide - mod */
    				);
       }
       $product_option_description_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option_description WHERE product_option_id = '" . (int)$product_option['product_option_id'] . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");
    		 $product_option_data[] = array(
    		  'product_option_id' => $product_option['product_option_id'],
    	'name'			  => $product_option_description_query->row['name'],
    	'option_value'	  => $product_option_value_data,
    	'sort_order'		=> $product_option['sort_order']
    		 );
    	   }
      return $product_option_data;
    }
    public function getProductImages($product_id) {
      $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_image WHERE product_id = '" . (int)$product_id . "'");
      return $query->rows;
    }
    public function getProductTags($product_id) {
      $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_tags WHERE product_id = '" . (int)$product_id . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");
      return $query->rows;
    }
    public function getProductDiscount($product_id) {
      if ($this->customer->isLogged()) {
       $customer_group_id = $this->customer->getCustomerGroupId();
      } else {
       $customer_group_id = $this->config->get('config_customer_group_id');
      }
      $query = $this->db->query("SELECT price FROM " . DB_PREFIX . "product_discount WHERE product_id = '" . (int)$product_id . "' AND customer_group_id = '" . (int)$customer_group_id . "' AND quantity = '1' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY priority ASC, price ASC LIMIT 1");
      if ($query->num_rows) {
       return $query->row['price'];
      } else {
       return FALSE;
      }
    }
    public function getProductDiscounts($product_id) {
      if ($this->customer->isLogged()) {
       $customer_group_id = $this->customer->getCustomerGroupId();
      } else {
       $customer_group_id = $this->config->get('config_customer_group_id');
      }
      $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_discount WHERE product_id = '" . (int)$product_id . "' AND customer_group_id = '" . (int)$customer_group_id . "' AND quantity > 1 AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY quantity ASC, priority ASC, price ASC");
      return $query->rows;
    }
    public function getProductSpecial($product_id) {
      if ($this->customer->isLogged()) {
       $customer_group_id = $this->customer->getCustomerGroupId();
      } else {
       $customer_group_id = $this->config->get('config_customer_group_id');
      }
      $query = $this->db->query("SELECT price FROM " . DB_PREFIX . "product_special WHERE product_id = '" . (int)$product_id . "' AND customer_group_id = '" . (int)$customer_group_id . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY priority ASC, price ASC LIMIT 1");
      if ($query->num_rows) {
       return $query->row['price'];
      } else {
       return FALSE;
      }
    }
    public function getProductSpecials($sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20) {
      if ($this->customer->isLogged()) {
       $customer_group_id = $this->customer->getCustomerGroupId();
      } else {
       $customer_group_id = $this->config->get('config_customer_group_id');
      }
      $sql = "SELECT *, pd.name AS name, p.price, (SELECT ps2.price FROM " . DB_PREFIX . "product_special ps2 WHERE p.product_id = ps2.product_id AND ps2.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps2.date_start = '0000-00-00' OR ps2.date_start < NOW()) AND (ps2.date_end = '0000-00-00' OR ps2.date_end > NOW())) ORDER BY ps2.priority ASC, ps2.price ASC LIMIT 1) AS special, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating 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) LEFT JOIN " . DB_PREFIX . "product_special ps ON (p.product_id = ps.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND ps.customer_group_id = '" . (int)$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())) AND ps.product_id NOT IN (SELECT pd2.product_id FROM " . DB_PREFIX . "product_discount pd2 WHERE p.product_id = pd2.product_id AND pd2.customer_group_id = '" . (int)$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()))) GROUP BY p.product_id";
      $sort_data = array(
       'pd.name',
       'p.sort_order',
       'special',
       'rating',
       'p.price',
       'p.model'
      );
      if (in_array($sort, $sort_data)) {
       if ($sort == 'pd.name' || $sort == 'p.model') {
    	$sql .= " ORDER BY LCASE(" . $sort . ")";
       } else {
    	$sql .= " ORDER BY " . $sort;
       }
      } else {
       $sql .= " ORDER BY p.sort_order";
      }
      if ($order == 'DESC') {
       $sql .= " DESC";
      } else {
       $sql .= " ASC";
      }
      if ($start < 0) {
       $start = 0;
      }
      $sql .= " LIMIT " . (int)$start . "," . (int)$limit;
      $query = $this->db->query($sql);
      return $query->rows;
    }
    public function getTotalProductSpecials() {
      if ($this->customer->isLogged()) {
       $customer_group_id = $this->customer->getCustomerGroupId();
      } else {
       $customer_group_id = $this->config->get('config_customer_group_id');
      }
      $query = $this->db->query("SELECT COUNT(DISTINCT ps.product_id) AS total FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "product_special ps ON (p.product_id = ps.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_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())) AND ps.product_id NOT IN (SELECT pd2.product_id FROM " . DB_PREFIX . "product_discount pd2 WHERE p.product_id = pd2.product_id AND pd2.customer_group_id = '" . (int)$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())))");
      if (isset($query->row['total'])) {
       return $query->row['total'];
      } else {
       return 0;
      }
    }
    public function getProductRelated($product_id) {
      $product_data = array();
      $product_related_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_related WHERE product_id = '" . (int)$product_id . "'");
      foreach ($product_related_query->rows as $result) {
       $product_query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating 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) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE p.product_id = '" . (int)$result['related_id'] . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.date_available <= NOW() AND p.status = '1'");
       if ($product_query->num_rows) {
    	$product_data[$result['related_id']] = $product_query->row;
       }
      }
      return $product_data;
    }
    public function getCategories($product_id) {
      $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "'");
      return $query->rows;
    }
    }
    ?>

    Тему можно закрыть с пометкой решено и сделать на нее ссылку в FAQ)

  16. сделал, но в производителях по-прежнему не работает. выдает ошибку:

    Notice: Undefined variable: category_id in Z:\home\localhost\www\nb2\catalog\model\catalog\product.php on line 80

    ругается на вот это:

    $sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating, ". "coalesce((SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND customer_group_id = '" . (int)$customer_group_id . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY priority ASC, price ASC LIMIT 1), p.price) as s_price ". "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) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2c.category_id = '" . (int)$category_id . "'";

  17. Извините что так долго не отписывал, был в разъездах, не было возможности проверить.

    Код представленный здесь действительно работает, и сортирует товар по ценам с учетом текущей акционной цены, но только в каталоге. Если зайти в производители, сортирует по старому. Может еще где-то куда-то что-то нужно прописать?

  18. Спасибо большое за оперативность!

    Мне только не совсем понятно назначение чисел *** 14,19 **** --- 14,33 ---- *** 21,26 **** --- 35,41 ---- извините, я не программист.

    Ясно только что править нужно файл catalog/model/catalog/product.php начиная с 14й строки. Вы бы не могли дать буквенные пояснения к этим числам?)

  19. Всем привет!

    Собственно наткнулся на такую проблему/недоработку пока не знаю как назвать.

    Версия OcStore 0.2.2. Есть каталог продукции с установленной ценой. Например на 2 месяца устанавливаю специальную цену. Она может быть разной относительно первоначальной одинаковой цены в похожих моделях. Например есть 2 товара по цене 700. На один делаю скидку 100, на другой 150. Итого новые цены выходят 600 и 550 соответственно.

    Проблема заключается в том, что когда в каталоге выбираю сортировку по цене, скрипт сортирует относительно первоначальной цены, без учета специальной. Т.е. таким образом: 700 600, 700 550, 720 610, 740 630, 750 650.

    Вопрос: это у всех так или только у меня? И если у всех, то кто-то может подсказать как это решить?

    Поиском пользовался, решений не нашел.

    Спасибо.

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

Important Information

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