1roma1
-
Публікації
28 -
З нами
-
Відвідування
Тип публікації
Профілі
Форум
Маркетплейс
Статті
FAQ
Наші новини
Магазин
Блоги
module__dplus_manager
Повідомлення, опубліковані користувачем 1roma1
-
-
15 минут назад, Otvet сказал:
что это?
это опенкарт версии 1.4.х
-
Есть статья https://netpeak.net/ru/blog/optimizatsiya-stranits-paginatsii-internet-magazina-podrobnaya-instruktsiya/ в которой описан способ (№3) настройки оптимальной пангинации который нужно реализовать.
Версия движка ocstore 0.2.2.
Для контактов использовать ЛС или скайп r_e_n_t_o_n
Спасибо.
-
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
Спасибо.
-
Необходимо настроить кеширование через memcached и драйвер mysql_cached со включенным в админке SEO-url.
Проблема в совместной работе этих двух дополнений, а именно - не формируются ссылки на товары и категории.
Если seo-url выключить, все работает, но это не вариант.
Версия магазина ocstore 0.2.2.
-
Изначально была проведена модификация кода для сортировки доп изображений как написано в этом посте:
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 -
Нужно доработать модуль рекомендуемые товары на главной на предмет вывода товаров в установленном порядке. Это должно быть отдельное поле (input) напротив каждого товара, в самом модуле в админке магазина, с возможностью ввода туда чисел, по которым и будет осуществляться сортировка и вывод товаров на главной странице. Похоже как предусмотрено сортировать производителей в меню каталог-производители параметр "порядок сортировки". Версия магазина 0.2.2.
icq: 342 582 181
skype: r_e_n_t_o_n -
Спасибо, тему можно закрывать.
-
-
Есть версия фильтра 2.0 и ocstore 0.2.2. Необходимо отключить отображение фильтра когда пользователь перешел в карточку товара. Он там совершенно не нужен, только занимает лишнее место в левой колонке.
icq: 342 582 181
skype: r_e_n_t_o_n
В этом как раз и есть отличие в версиях.
Колонки будут преследовать по всюду так как в старом ОК нет схем.
а это вы собственно к чему?))
-
Есть версия фильтра 2.0 и ocstore 0.2.2. Необходимо отключить отображение фильтра когда пользователь перешел в карточку товара. Он там совершенно не нужен, только занимает лишнее место в левой колонке.
icq: 342 582 181
skype: r_e_n_t_o_n
-
Привет всем!
Попытался сделать копию модуля рекомендуемые товары на главной в 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 ситуация почти та же. За исключением того что, если в одном модуле выбрать товары, те же будут выбраны и в другом, но выводятся они тоже не все.
Прошу подсказать в какую сторону копать дальше.
-
Всем привет!
Народ, подскажите пожалуйста, есть версия фильтра 2.0 и ocstore 0.2.2. Как отключить отображение фильтра когда пользователь перешел в карточку товара? Он там совершенно не нужен, только занимает лишнее место в левой колонке.
-
Народ, подскажите пожалуйста.
Еще вопрос возник...
При просмотре отфильтрованных товаров, нет возможности изменить сортировку. Он пересортировывает все товары, без учета фильтров. Или это я что-то не так сделал??
Если сделать как писал 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')); } } } ?>
Как сделать что бы работало все вместе?
-
для начала вы бы хоть версию фильтра и магазина указали.Подскажите, мож кто сталкивался с такой проблемой. Фильтр установил, создал новые опции в разделе "фильр товаров", а вот самом товаре в разделе опции ничего создать не могу. Есть только поле ввода с "+" справа. Если начинаю вводить в поле ввода назавание, окна выбора не пояляется?
В чем может быть причина?Куда копать?
а вообще мне кажется что форум глохнет потихоньку.. или все перешли на новую версию магазина... или всё настроили и не появляются здесь, одним словом совета приходится ждать долго, если конечно он будет
-
Всем привет! Есть проблема, которую уже поднимали (атрибуты в даном случае это значения опций фильтра):
у меня атрибуты фильтра не сохраняются в том порядке, в котором я их забиваю - все время отображаются в хаотическом порядке. как исправить кто-нибудь знает?
Так же есть решение:
Файл
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
Заранее спасибо!
-
Спасибо, на oсStore 0.2.2 тоже работает!
-
Скажите пожалуйста, а для 1.4.9.х этот способ подойдет?
-
Привет всем!
Прошу помочь знающих в решении вроде бы простой задачи. Собственно вопрос такой: как сделать, что бы главное изображение товара показывалось только в каталоге, а уже при входе в карточку товара, оно заменялось бы первым из дополнительных. Фактически что бы главная фотография товара фигурировала только в виде миниатюры в каталоге, последних поступлениях и т.д.
-
Спасибо большое! все работает!
В блоке $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)
-
сделал, но в производителях по-прежнему не работает. выдает ошибку:
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 . "'";
-
Извините что так долго не отписывал, был в разъездах, не было возможности проверить.
Код представленный здесь действительно работает, и сортирует товар по ценам с учетом текущей акционной цены, но только в каталоге. Если зайти в производители, сортирует по старому. Может еще где-то куда-то что-то нужно прописать?
-
Спасибо большое за оперативность!
Мне только не совсем понятно назначение чисел *** 14,19 **** --- 14,33 ---- *** 21,26 **** --- 35,41 ---- извините, я не программист.
Ясно только что править нужно файл catalog/model/catalog/product.php начиная с 14й строки. Вы бы не могли дать буквенные пояснения к этим числам?)
-
Всем привет!
Собственно наткнулся на такую проблему/недоработку пока не знаю как назвать.
Версия OcStore 0.2.2. Есть каталог продукции с установленной ценой. Например на 2 месяца устанавливаю специальную цену. Она может быть разной относительно первоначальной одинаковой цены в похожих моделях. Например есть 2 товара по цене 700. На один делаю скидку 100, на другой 150. Итого новые цены выходят 600 и 550 соответственно.
Проблема заключается в том, что когда в каталоге выбираю сортировку по цене, скрипт сортирует относительно первоначальной цены, без учета специальной. Т.е. таким образом:
700600,700550,720610,740630,750650.Вопрос: это у всех так или только у меня? И если у всех, то кто-то может подсказать как это решить?
Поиском пользовался, решений не нашел.
Спасибо.
Необходимо сделать пангинацию
в Програмування, створення модулів, зміна функціональності
Опубліковано:
как то так:
<?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 = ' > ') {
$this->breadcrumbs[] = array(
'text' => $text,
'href' => $href,
'separator' => $separator
);
}
public function getBreadcrumbs() {
return $this->breadcrumbs;
}
}
?>
пора бы, но во-первых много доработок слетит, во вторых в принципе все утраивает за исключением нюансов