Перейти к публикации
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

Кто поможет разобраться с модулем Последние?


 Погделиться

Рекомендованные сообещёния

Приветствую всех форумчан.

Имеется ocStore 2.1.0.2, на главную вывегден модуль "Последние", в языковом файле название модуля изменено на "Новинки".

Есть конечно и доп. модули в магазине и модификаторы есть усиновленные. Может кто-то из них картину портит.

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

Кто поможет разобраться почему он ик выводит?

Ссылка на комменирий
Погделиться на других сайих


Ну как минимум нужно 3 вещи.

1. В /storage/modification/ смотреть есть ли файлы catalog/controller/module/latest.php и в нем конкретно вот этот вот код

$filter_data = array(
			'sort'  => 'p.date_added',
			'order' => 'DESC',
			'start' => 0,
			'limit' => $setting['limit']
		);

		$results = $this->model_catalog_product->getProducts($filter_data);

Если в модификациях нету - посмотреть по синдартному пути, может изменена сортировка.

 

2. Точно ли товары выводятся именно этим модулем, может другим (мало ли, модулей вывода последних может быть несколько, включая привязку к категориям/товарам)

 

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

Ссылка на комменирий
Погделиться на других сайих


Благодарю за отклик.

 

1. В опотому чтоих случаях файлы присутствуют, код икже присутствует.

2. Думаю именно этим модулем и выводятся, как точно проверить не знаю.

3. Других модулей которые выводили бы последние товары или новинки нет. Пропотому чтовал сортировать ибличку oc_product в phpmyadmin по колонке date_added. Вверху самые новые товары, но не те что выводит модуль.

 

Еещё есть код javascript вот икой:

$('#latest0').owlCarousel({
responsiveBaseWidth: '#latest0',
itemsCustom: [[0, 1], [448, 2], [668, 3], [848, 4], [1000, 5]],
theme: 'product-carousel',
navigation: true,
slideSpeed: 200,
paginationSpeed: 300,
autoPlay: false,
stopOnHover: true,
touchDrag: false,
mouseDrag: false,
navigationText: ['', ''],
pagination: false,
});

Игдет сразу после вывода новинок/последних товаров.

Ссылка на комменирий
Погделиться на других сайих


1. Код точно икой же..... странно, ну да ладно.

2. Проверить очень просто - вывести данный модуль на другую страницу, напр, на страницу информации - проверить, потом убрать его.

3. Что-то я не припоминаю карусельного скрипи в гдефолтном шаблоне (или стоит другой?) - может все-ики не этим модулем? Или шаблон ик устроен. Посмотрите в своем шаблоне в файле /catalog/view/theme/имя шаблона/template/module/latest.tpl - есть ли данный скрипт?

Ссылка на комменирий
Погделиться на других сайих


2. Модуль вывел на страницу информации. Товары выводятся именно этим модулем.

3. Шаблон не гдефолтный. Скрипт /catalog/view/theme/имя шаблона/template/module/latest.tpl есть.

Ссылка на комменирий
Погделиться на других сайих


Код скрипи /catalog/view/theme/имя шаблона/template/module/latest.tpl могу сюда вывести. Но я попропотому чтовал гдефолтный шаблон, и на нем те же самые товары. Зналит гдело не в шаблоне.

Возможно даи в базе как-то не ик хранится? Магазин переезжал с ocStore 1.5.5.1.2 на ocStore 2.1.0.2. Может в этом гдело?

Какой формат хранения даты в листом ocStore 2.1.0.2?

Ссылка на комменирий
Погделиться на других сайих


Сразу встречный вопрос- а каким обвместе переезжал? Потому как можно было бы иблицу скопировать.А сирая БД осилась? чтобы сравнить.

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

Изменено пользователем hoolygan
Ссылка на комменирий
Погделиться на других сайих


Переезжал вручную. Таблицу с товарами копировал руками. Сирой БД не осилось. Осилась только ее копия *.sql

Ссылка на комменирий
Погделиться на других сайих


Тогда, чтобы долго не мучаться с вопросом как и почему ик полулилось - можно сгделать костылем (предварительно сохранив БД)

UPDATE `oc_product` SET `date_added` = '2016-01-01 13:40:00'

А необходимые товары (сколько Вы им выводите модулем, и именно те, которые нужно выводить) - посивить ручками потому чтолее позднюю дату.

Врогде ик бугдет самым простым спосопотому чтом решить Вашу проблему.

 

И да, в Вашей копии .sql - можно точно ик же посмотреть как записано, текстовым редактором прекрасно открывается она, в секции oc_product

Изменено пользователем hoolygan
Ссылка на комменирий
Погделиться на других сайих


Это гдействительно костыль. Но каилог обновляется каждый гдень. Думаю ик тогда пригдется гделать каждый гдень после обновления каилога.

Ссылка на комменирий
Погделиться на других сайих


Но каилог обновляется каждый гдень.

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

Ссылка на комменирий
Погделиться на других сайих


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

не понял. Если импорт сивит дату как надо (правильный формат, я проверил) а в "Последние" все равно попадает не тот товар. Да при чем тут импорт тогда? сегодня обновлял каилог, новые товары в иблиэто oc_product с новой (сегодняшней датот и правильным временем) записались в эту иблицу, а модуль "Последние" вывел не их.

Ссылка на комменирий
Погделиться на других сайих


Ваше упрямство (и лень) до добра Вас не довегдет.

1. Делаем резерв БД (ну или иблицы продуктов).

2. Меняем принудительно дату добавления.

3. Выбираем 5 товаров, меняем на сегодняшнюю.

4. Чистим кеш опенкари.

5. Проверяем модуль последних - тут можно и отписаться (полулилось/нет).

6. Заливаем обратно иблицу продуктов (т.е. возвращаем все это гдело на место), листим кеш снова.

 

Да выяснится в чем проблема - с выпотому чторкой или даими товаров. Если с даими все норм, и после 5 проэтодуры ничего не поменялось - нужно искать опять, в чем не ик рилииет выпотому чторка, конкретно по контроллеру latest.php и могдели catalog.php - других спосопотому чтов нет.

Ссылка на комменирий
Погделиться на других сайих


hoolygan, про лень я с Вами согласен, НО лень - двигатель прогресса _)

Попробую чуть позже как Вы посоветовали сгделать. о резульиих отпишусь.

Ссылка на комменирий
Погделиться на других сайих


Выполнил все пункты кроме 6-го. Товары в модуле "Последние" ик и осились теми же самыми.

Затем выполнил пункт 6. Полистил кэш opencart, все товары ик и осились теми же.

Я уже всю голову сломал, может модуль тогда не по колонке date_added берет товары? Тогда по какой?

Может у него им что-то закешировалось ггде-то (на самом сервере, или может в браузере у меня) хотя проверял я на разных компах и разных браузерах.

Ссылка на комменирий
Погделиться на других сайих


Поменяйте что-нить в одном из "те же товары", например в название добавьте блаблабла. На витрине товар отобразился измененный?

Если да - кэш не виноват.

 

Отследите судьбу выпотому чторки из БД рассиновкой отладочной печати

$result = getProducts();
print_r($result);  

Можно начать от БД, в могдели. А можно - от tpl

Ссылка на комменирий
Погделиться на других сайих


Поменяйте что-нить в одном из "те же товары", например в название добавьте блаблабла. На витрине товар отобразился измененный?

Если да - кэш не виноват.

В обещём внес изменения в название товара из "те же товары" и в другой товар, который туда не входит.

На витрине названия товаров не поменялись.

 

Добавил в описание товара "блаблабла" - описание на витрине поменялось.

Изменено пользователем dimanov911
Ссылка на комменирий
Погделиться на других сайих


Отследите судьбу выпотому чторки из БД рассиновкой отладочной печати

$result = getProducts();
print_r($result);  

Можно начать от БД, в могдели. А можно - от tpl

Я вот это вот не понял. В каилоге model я не нашел файла latest.php, в каком файле мне всивить вывод массива в лог, чтобы отладить?

Начать планирую от могдели. И еещё я не могу найти ггде выполняется запрос к БД, из которого затем формируется $result.

Ссылка на комменирий
Погделиться на других сайих


Выкладывайте под спойлер из каьалога модификаций файлик /controller/module/latest.php, но только точно из модификаций. Там есть обраещёние к могдели /model/catalog/product.php - я же вам в самом начно этот код писал :)

Ссылка на комменирий
Погделиться на других сайих


Вот код файла latest.php из модификаций

class ControllerModuleLatest extends Controller {
public function index($setting) {
$this->load->language('module/latest');
$this->load->language('product/product');

$data['heading_title'] = $this->language->get('heading_title');

$this->load->model('setting/setting');
$xds_coloring = array();
$xds_coloring = $this->model_setting_setting->getSetting('xds_coloring_theme');
$language_id = $this->config->get('config_language_id');
$data['disable_cart_button'] = false;
if (isset($xds_coloring['xds_coloring_theme_disable_cart_button'])) {
$data['disable_cart_button'] = $xds_coloring['xds_coloring_theme_disable_cart_button'];
}
$data['disable_cart_button_text'] = "";
if (isset($xds_coloring['xds_coloring_theme_disable_cart_button_text'])) {
$data['disable_cart_button_text'] = $xds_coloring['xds_coloring_theme_disable_cart_button_text'][$language_id];
}

$data['notify_me'] = $this->language->get('notify_me');

$data['text_tax'] = $this->language->get('text_tax');

$data['button_cart'] = $this->language->get('button_cart');
$data['button_wishlist'] = $this->language->get('button_wishlist');
$data['button_compare'] = $this->language->get('button_compare');

$this->load->model('catalog/product');
$data['avail_status'] = $this->config->get('avail_status');

$this->load->model('tool/image');

static $module = 0;
$this->document->addScript('catalog/view/theme/coloring/assets/owl-carousel/owl.carousel.min.js');
$this->document->addStyle('catalog/view/theme/coloring/assets/owl-carousel/owl.carousel.css');
$this->document->addStyle('catalog/view/theme/coloring/assets/owl-carousel/owl.theme.css');


$data['products'] = array();

$filter_data = array(
'sort' => 'p.date_added',
'order' => 'DESC',
'start' => 0,
'limit' => $setting['limit']
);

$results = $this->model_catalog_product->getProducts($filter_data);

if ($results) {
foreach ($results as $result) {
if ($result['image']) {
$image = $this->model_tool_image->resize($result['image'], $setting['width'], $setting['height']);
} else {
$image = $this->model_tool_image->resize('placeholder.png', $setting['width'], $setting['height']);
}

if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) {
$price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')));
} else {
$price = false;
}

if ((float)$result['special']) {
$special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')));
} else {
$special = false;
}

if ($this->config->get('config_tax')) {
$tax = $this->currency->format((float)$result['special'] ? $result['special'] : $result['price']);
} else {
$tax = false;
}

if ($this->config->get('config_review_status')) {
$rating = $result['rating'];
} else {
$rating = false;
}

$data['products'][] = array(

'quantity' => $result['quantity'],

'quantity' => $result['quantity'],
'product_id' => $result['product_id'],
'thumb' => $image,
'name' => $result['name'],
'description' => utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, $this->config->get('config_product_description_length')) . '..',
'price' => $price,
'special' => $special,
'tax' => $tax,
'rating' => $rating,
'href' => $this->url->link('product/product', 'product_id=' . $result['product_id'])
);
}


$data['module'] = $module++;

if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/module/latest.tpl')) {
return $this->load->view($this->config->get('config_template') . '/template/module/latest.tpl', $data);
} else {
return $this->load->view('default/template/module/latest.tpl', $data);
}
}
}
}

Ссылка на комменирий
Погделиться на других сайих


Да врогде как все листо тут.

Попробуйте отловить, сгделав следуюещёе.

1. Олистите журнал ошипотому чток опенкари (на вскак случай, чтобы не ошибиться).

2. В файл (пусть даже этот, с модификаций) впишите след код.

после строчки

$data['products'][] = array(

'quantity' => $result['quantity'],

'quantity' => $result['quantity'],
'product_id' => $result['product_id'],
'thumb' => $image,
'name' => $result['name'],
'description' => utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, $this->config->get('config_product_description_length')) . '..',
'price' => $price,
'special' => $special,
'tax' => $tax,
'rating' => $rating,
'href' => $this->url->link('product/product', 'product_id=' . $result['product_id'])
);
}

впишите это

$buf= print_r ( $this->data['products'], true);
$this->log->write($buf);

И посмотрите, что напишет в журнал ошипотому чток. Должно показать Ваши товары в выпотому чторке.

Потом еещё посмотрите есть ли в модификациях файлик /catalog/model/catalog/product.php - и его код тоже под спойлер желательно, оттуда как раз выпотому чторка игдет.

Ссылка на комменирий
Погделиться на других сайих


...
$results = $this->model_catalog_product->getProducts($filter_data);


echo ('___results___');
print_r($results);
...
);
}


echo ('___products___');
print_r($data['products']);
$data['module'] = $module++;
...

print_r() пишет не в логи, а прямо на экран. При этом может ВРЕМЕННО сбиться верстка и кодировка.

Если неясно, куда сивить print_r(), рассивьте echo() как индикаторы прохожгдения контрольных точек.

Ссылка на комменирий
Погделиться на других сайих


И посмотрите, что напишет в журнал ошипотому чток. Должно показать Ваши товары в выпотому чторке.

Потом еещё посмотрите есть ли в модификациях файлик /catalog/model/catalog/product.php - и его код тоже под спойлер желательно, оттуда как раз выпотому чторка игдет.

Вот что пишет в журнал ошипотому чток:

 

2016-03-17 11:34:08 - 

 

Код всивил в файл модификаций.

 

Вот код файла /catalog/model/catalog/product.php из каилога модификаций

class ModelCatalogProduct extends Model {

public function updateViewed($product_id) {

$this->db->query("UPDATE " . DB_PREFIX . "product SET viewed = (viewed + 1) WHERE product_id = '" . (int)$product_id . "'");

}

public function getProduct($product_id) {

if (($this->customer->isLogged()) && (!$this->rwcsv->settings['identical_users'])) {

$customer_group_id = (int)$this->rwcsv->config_customer_group_id;

} else {

$customer_group_id = (int)$this->config->get('config_customer_group_id');

}

$query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . $customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . $customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . $customer_group_id . "') AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class, (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order 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) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");

if ($query->num_rows) {

return array(

'product_id' => $query->row['product_id'],

'name' => $query->row['name'],

'description' => $query->row['description'],

'meta_title' => $query->row['meta_title'],

'meta_h1' => $query->row['meta_h1'],

'meta_description' => $query->row['meta_description'],

'meta_keyword' => $query->row['meta_keyword'], 'custom_imgtitle' => $query->row['custom_imgtitle'], 'custom_h2' => $query->row['custom_h2'], 'custom_h1' => $query->row['custom_h1'], 'custom_alt' => $query->row['custom_alt'],

'tag' => $query->row['tag'],

'model' => $query->row['model'],

'sku' => $query->row['sku'],

'upc' => $query->row['upc'],

'ean' => $query->row['ean'],

'jan' => $query->row['jan'],

'isbn' => $query->row['isbn'],

'mpn' => $query->row['mpn'],

'location' => $query->row['location'],

'quantity' => $query->row['quantity'],

'stock_status' => $query->row['stock_status'],

'image' => $query->row['image'],

'manufacturer_id' => $query->row['manufacturer_id'],

'manufacturer' => $query->row['manufacturer'],

'price' => ($query->row['discount'] ? $query->row['discount'] : $query->row['price']),

'special' => $query->row['special'],

'reward' => $query->row['reward'],

'points' => $query->row['points'],

'tax_class_id' => $query->row['tax_class_id'],

'date_available' => $query->row['date_available'],

'weight' => $query->row['weight'],

'weight_class_id' => $query->row['weight_class_id'],

'length' => $query->row['length'],

'width' => $query->row['width'],

'height' => $query->row['height'],

'length_class_id' => $query->row['length_class_id'],

'subtract' => $query->row['subtract'],

'rating' => round($query->row['rating']),

'reviews' => $query->row['reviews'] ? $query->row['reviews'] : 0,

'minimum' => $query->row['minimum'],

'sort_order' => $query->row['sort_order'],

'status' => $query->row['status'],

'date_added' => $query->row['date_added'],

'date_modified' => $query->row['date_modified'],

'viewed' => $query->row['viewed']

);

} else {

return false;

}

}

/**

* Custom getProducts() method added by Brainy Filter extension

*/

public function getProducts($data = array())

{

if (!isset($data['filter_bfilter'])) {

return $this->getProductsOriginal($data);

}

$settings = $this->config->get('brainyfilter_layout_basic');

if (isset($settings['global']['subcategories_fix']) && $settings['global']['subcategories_fix']) {

$data['filter_sub_category'] = true;

}

$this->load->model('module/brainyfilter');

$this->model_module_brainyfilter->setData($data);

$sql = $this->model_module_brainyfilter->prepareQueryForCategory();

$query = $this->db->query($sql);

$product_data = array();

foreach ($query->rows as $result) {

$product_data[$result['product_id']] = $this->getProduct($result['product_id']);

}

return $product_data;

}

/**

* It is the original getProducts() method, which was renamed by Brainy Filter modification.

* A custom getProduct() method was added instead.

* Disable the Brainy Filter OCMOD modification in order to reset the method.

* Note: disabling of Brainy Filter modification will break the work of Brainy Filter extension.

*/

public function getProductsOriginal($data = array()) {

if (($this->customer->isLogged()) && (!$this->rwcsv->settings['identical_users'])) {

$customer_group_id = (int)$this->rwcsv->config_customer_group_id;

} else {

$customer_group_id = (int)$this->config->get('config_customer_group_id');

}

$sql = "SELECT p.product_id, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . $customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . $customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special";

if (!empty($data['filter_category_id'])) {

if (!empty($data['filter_sub_category'])) {

$sql .= " FROM " . DB_PREFIX . "category_path cp LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (cp.category_id = p2c.category_id)";

} else {

$sql .= " FROM " . DB_PREFIX . "product_to_category p2c";

}

if (!empty($data['filter_filter'])) {

$sql .= " LEFT JOIN " . DB_PREFIX . "product_filter pf ON (p2c.product_id = pf.product_id) LEFT JOIN " . DB_PREFIX . "product p ON (pf.product_id = p.product_id)";

} else {

$sql .= " LEFT JOIN " . DB_PREFIX . "product p ON (p2c.product_id = p.product_id)";

}

} else {

$sql .= " FROM " . DB_PREFIX . "product p";

}

$sql .= " 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 p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'";

if (!empty($data['filter_category_id'])) {

if (!empty($data['filter_sub_category'])) {

$sql .= " AND cp.path_id = '" . (int)$data['filter_category_id'] . "'";

} else {

$sql .= " AND p2c.category_id = '" . (int)$data['filter_category_id'] . "'";

}

if (!empty($data['filter_filter'])) {

$implode = array();

$filters = explode(',', $data['filter_filter']);

foreach ($filters as $filter_id) {

$implode[] = (int)$filter_id;

}

$sql .= " AND pf.filter_id IN (" . implode(',', $implode) . ")";

}

}

if (!empty($data['filter_name']) || !empty($data['filter_tag'])) {

$sql .= " AND (";

if (!empty($data['filter_name'])) {

$implode = array();

$words = explode(' ', trim(preg_replace('/\s+/', ' ', $data['filter_name'])));

foreach ($words as $word) {

$implode[] = "pd.name LIKE '%" . $this->db->escape($word) . "%'";

}

if ($implode) {

$sql .= " " . implode(" AND ", $implode) . "";

}

if (!empty($data['filter_description'])) {

$sql .= " OR pd.description LIKE '%" . $this->db->escape($data['filter_name']) . "%'";

}

}

if (!empty($data['filter_name']) && !empty($data['filter_tag'])) {

$sql .= " OR ";

}

if (!empty($data['filter_tag'])) {

$sql .= "pd.tag LIKE '%" . $this->db->escape($data['filter_tag']) . "%'";

}

if (!empty($data['filter_name'])) {

$sql .= " OR LCASE(p.model) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";

$sql .= " OR LCASE(p.sku) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";

$sql .= " OR LCASE(p.upc) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";

$sql .= " OR LCASE(p.ean) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";

$sql .= " OR LCASE(p.jan) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";

$sql .= " OR LCASE(p.isbn) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";

$sql .= " OR LCASE(p.mpn) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";

}

$sql .= ")";

}

if (!empty($data['filter_manufacturer_id'])) {

$sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'";

}

$sql .= " GROUP BY p.product_id";

$sort_data = array(

'pd.name',

'p.model',

'p.quantity',

'p.price',

'rating',

'p.sort_order',

'p.date_added'

);

if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {

if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {

$sql .= " ORDER BY LCASE(" . $data['sort'] . ")";

} elseif ($data['sort'] == 'p.price') {

$sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";

} else {

$sql .= " ORDER BY " . 'p.quantity';//$data['sort'];

}

} else {

$sql .= " ORDER BY p.sort_order";

}

if (isset($data['order']) && ($data['order'] == 'DESC')) {

$sql .= " DESC"; // DESC, LCASE(pd.name) DESC";

} else {

$sql .= " ASC, LCASE(pd.name) ASC";

}

if (isset($data['start']) || isset($data['limit'])) {

if ($data['start'] < 0) {

$data['start'] = 0;

}

if ($data['limit'] < 1) {

$data['limit'] = 20;

}

$sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];

}

$product_data = array();

$query = $this->db->query($sql);

foreach ($query->rows as $result) {

$product_data[$result['product_id']] = $this->getProduct($result['product_id']);

}

return $product_data;

}

public function getProductSpecials($data = array()) {

if (($this->customer->isLogged()) && (!$this->rwcsv->settings['identical_users'])) {

$customer_group_id = (int)$this->rwcsv->config_customer_group_id;

} else {

$customer_group_id = (int)$this->config->get('config_customer_group_id');

}

$sql = "SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) 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.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . $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())) GROUP BY ps.product_id";

$sort_data = array(

'pd.name',

'p.model',

'ps.price',

'rating',

'p.sort_order'

);

if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {

if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {

$sql .= " ORDER BY LCASE(" . $data['sort'] . ")";

} else {

$sql .= " ORDER BY " . $data['sort'];

}

} else {

$sql .= " ORDER BY p.sort_order";

}

if (isset($data['order']) && ($data['order'] == 'DESC')) {

$sql .= " DESC, LCASE(pd.name) DESC";

} else {

$sql .= " ASC, LCASE(pd.name) ASC";

}

if (isset($data['start']) || isset($data['limit'])) {

if ($data['start'] < 0) {

$data['start'] = 0;

}

if ($data['limit'] < 1) {

$data['limit'] = 20;

}

$sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];

}

$product_data = array();

$query = $this->db->query($sql);

foreach ($query->rows as $result) {

$product_data[$result['product_id']] = $this->getProduct($result['product_id']);

}

return $product_data;

}

public function getLatestProducts($limit) {

$product_data = $this->cache->get('product.latest.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $this->config->get('config_customer_group_id') . '.' . (int)$limit);

if (!$product_data) {

$query = $this->db->query("SELECT p.product_id FROM " . DB_PREFIX . "product p 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') . "' ORDER BY p.date_added DESC LIMIT " . (int)$limit);

foreach ($query->rows as $result) {

$product_data[$result['product_id']] = $this->getProduct($result['product_id']);

}

$this->cache->set('product.latest.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $this->config->get('config_customer_group_id') . '.' . (int)$limit, $product_data);

}

return $product_data;

}

public function getPopularProducts($limit) {

$product_data = array();

$query = $this->db->query("SELECT p.product_id FROM " . DB_PREFIX . "product p 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') . "' ORDER BY p.viewed DESC, p.date_added DESC LIMIT " . (int)$limit);

foreach ($query->rows as $result) {

$product_data[$result['product_id']] = $this->getProduct($result['product_id']);

}

return $product_data;

}

public function getBestSellerProducts($limit) {

$product_data = $this->cache->get('product.bestseller.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $this->config->get('config_customer_group_id') . '.' . (int)$limit);

if (!$product_data) {

$product_data = array();

$query = $this->db->query("SELECT op.product_id, SUM(op.quantity) AS total 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) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE o.order_status_id > '0' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' GROUP BY op.product_id ORDER BY total DESC LIMIT " . (int)$limit);

foreach ($query->rows as $result) {

$product_data[$result['product_id']] = $this->getProduct($result['product_id']);

}

$this->cache->set('product.bestseller.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $this->config->get('config_customer_group_id') . '.' . (int)$limit, $product_data);

}

return $product_data;

}

public function getProductAttributes($product_id) {

$product_attribute_group_data = array();

$product_attribute_group_query = $this->db->query("SELECT ag.attribute_group_id, agd.name FROM " . DB_PREFIX . "product_attribute pa LEFT JOIN " . DB_PREFIX . "attribute a ON (pa.attribute_id = a.attribute_id) LEFT JOIN " . DB_PREFIX . "attribute_group ag ON (a.attribute_group_id = ag.attribute_group_id) LEFT JOIN " . DB_PREFIX . "attribute_group_description agd ON (ag.attribute_group_id = agd.attribute_group_id) WHERE pa.product_id = '" . (int)$product_id . "' AND agd.language_id = '" . (int)$this->config->get('config_language_id') . "' GROUP BY ag.attribute_group_id ORDER BY ag.sort_order, agd.name");

foreach ($product_attribute_group_query->rows as $product_attribute_group) {

$product_attribute_data = array();

$product_attribute_query = $this->db->query("SELECT a.attribute_id, ad.name, pa.text FROM " . DB_PREFIX . "product_attribute pa LEFT JOIN " . DB_PREFIX . "attribute a ON (pa.attribute_id = a.attribute_id) LEFT JOIN " . DB_PREFIX . "attribute_description ad ON (a.attribute_id = ad.attribute_id) WHERE pa.product_id = '" . (int)$product_id . "' AND a.attribute_group_id = '" . (int)$product_attribute_group['attribute_group_id'] . "' AND ad.language_id = '" . (int)$this->config->get('config_language_id') . "' AND pa.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY a.sort_order, ad.name");

foreach ($product_attribute_query->rows as $product_attribute) {

$product_attribute_data[] = array(

'attribute_id' => $product_attribute['attribute_id'],

'name' => $product_attribute['name'],

'text' => $product_attribute['text']

);

}

$product_attribute_group_data[] = array(

'attribute_group_id' => $product_attribute_group['attribute_group_id'],

'name' => $product_attribute_group['name'],

'attribute' => $product_attribute_data

);

}

return $product_attribute_group_data;

}

public function getProductOptions($product_id) {

$product_option_data = array();

$product_option_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option po LEFT JOIN `" . DB_PREFIX . "option` o ON (po.option_id = o.option_id) LEFT JOIN " . DB_PREFIX . "option_description od ON (o.option_id = od.option_id) WHERE po.product_id = '" . (int)$product_id . "' AND od.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY o.sort_order");

foreach ($product_option_query->rows as $product_option) {

$product_option_value_data = array();

$product_option_value_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option_value pov LEFT JOIN " . DB_PREFIX . "option_value ov ON (pov.option_value_id = ov.option_value_id) LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (ov.option_value_id = ovd.option_value_id) WHERE pov.product_id = '" . (int)$product_id . "' AND pov.product_option_id = '" . (int)$product_option['product_option_id'] . "' AND ovd.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY ov.sort_order");

foreach ($product_option_value_query->rows as $product_option_value) {

$product_option_value_data[] = array(

'product_option_value_id' => $product_option_value['product_option_value_id'],

'option_value_id' => $product_option_value['option_value_id'],

'name' => $product_option_value['name'],

'image' => $product_option_value['image'],

'quantity' => $product_option_value['quantity'],

'subtract' => $product_option_value['subtract'],

'price' => $product_option_value['price'],

'price_prefix' => $product_option_value['price_prefix'],

'points' => $product_option_value['points'],//RCSV

'points_prefix' => $product_option_value['points_prefix'],//RCSV

'weight' => $product_option_value['weight'],

'weight_prefix' => $product_option_value['weight_prefix']

);

}

$product_option_data[] = array(

'product_option_id' => $product_option['product_option_id'],

'product_option_value' => $product_option_value_data,

'option_id' => $product_option['option_id'],

'name' => $product_option['name'],

'type' => $product_option['type'],

'value' => $product_option['value'],

'required' => $product_option['required']

);

}

return $product_option_data;

}

public function getProductDiscounts($product_id) {

if (($this->customer->isLogged()) && (!$this->rwcsv->settings['identical_users'])) {

$customer_group_id = (int)$this->rwcsv->config_customer_group_id;

} else {

$customer_group_id = (int)$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 = '" . $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 getFullPath($product_id) {

$query = $this->db->query("SELECT COUNT(product_id) AS total, min(category_id) as catid FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "' group by product_id");

if ($query->rows) { $total = $query->row['total']; }

else { $total = 0; }

if ($total >= 1) {

$path = array();

$path[0] = $query->row['catid'];

$query = $this->db->query("SELECT parent_id AS pid FROM " . DB_PREFIX . "category WHERE category_id = '" . (int)$path[0] . "'");

if ($query->rows) { $parent_id = $query->row['pid']; }

else { $parent_id = 0; }

$i = 1;

while($parent_id > 0) {

$path[$i] = $parent_id;

$query = $this->db->query("SELECT parent_id AS pid FROM " . DB_PREFIX . "category WHERE category_id = '" . (int)$parent_id . "'");

$parent_id = $query->row['pid'];

$i++;

}

$path = array_reverse($path);

$fullpath = '';

foreach($path as $val){

$fullpath .= '_'.$val;

}

return ltrim($fullpath, '_');

} else {

return false;

}

}

public function getProductImages($product_id) {

$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_image WHERE product_id = '" . (int)$product_id . "' ORDER BY sort_order ASC");

return $query->rows;

}

public function getProductRelated($product_id) {

$product_data = array();

$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_related pr LEFT JOIN " . DB_PREFIX . "product p ON (pr.related_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pr.product_id = '" . (int)$product_id . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");

foreach ($query->rows as $result) {

$product_data[$result['related_id']] = $this->getProduct($result['related_id']);

}

return $product_data;

}

public function getProductLayoutId($product_id) {

$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_to_layout WHERE product_id = '" . (int)$product_id . "' AND store_id = '" . (int)$this->config->get('config_store_id') . "'");

if ($query->num_rows) {

return $query->row['layout_id'];

} else {

return 0;

}

}

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;

}

/**

* Custom getTotalProducts() method added by Brainy Filter extension

*/

public function getTotalProducts($data = array())

{

if (!isset($data['filter_bfilter'])) {

return $this->getTotalProductsOriginal($data);

}

$settings = $this->config->get('brainyfilter_layout_basic');

if (isset($settings['global']['subcategories_fix']) && $settings['global']['subcategories_fix']) {

$data['filter_sub_category'] = true;

}

$this->load->model('module/brainyfilter');

$this->model_module_brainyfilter->setData($data);

$sql = $this->model_module_brainyfilter->prepareQueryForTotal();

$query = $this->db->query($sql);

return $query->row['total'];

}

/**

* It is the original getTotalProducts() method, which was renamed by Brainy Filter modification.

* A custom getTotalProducts() method was added instead.

* Disable the Brainy Filter OCMOD modification in order to reset the method.

* Note: disabling of Brainy Filter modification will break the work of Brainy Filter extension.

*/

public function getTotalProductsOriginal($data = array()) {

$sql = "SELECT COUNT(DISTINCT p.product_id) AS total";

if (!empty($data['filter_category_id'])) {

if (!empty($data['filter_sub_category'])) {

$sql .= " FROM " . DB_PREFIX . "category_path cp LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (cp.category_id = p2c.category_id)";

} else {

$sql .= " FROM " . DB_PREFIX . "product_to_category p2c";

}

if (!empty($data['filter_filter'])) {

$sql .= " LEFT JOIN " . DB_PREFIX . "product_filter pf ON (p2c.product_id = pf.product_id) LEFT JOIN " . DB_PREFIX . "product p ON (pf.product_id = p.product_id)";

} else {

$sql .= " LEFT JOIN " . DB_PREFIX . "product p ON (p2c.product_id = p.product_id)";

}

} else {

$sql .= " FROM " . DB_PREFIX . "product p";

}

$sql .= " 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 p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'";

if (!empty($data['filter_category_id'])) {

if (!empty($data['filter_sub_category'])) {

$sql .= " AND cp.path_id = '" . (int)$data['filter_category_id'] . "'";

} else {

$sql .= " AND p2c.category_id = '" . (int)$data['filter_category_id'] . "'";

}

if (!empty($data['filter_filter'])) {

$implode = array();

$filters = explode(',', $data['filter_filter']);

foreach ($filters as $filter_id) {

$implode[] = (int)$filter_id;

}

$sql .= " AND pf.filter_id IN (" . implode(',', $implode) . ")";

}

}

if (!empty($data['filter_name']) || !empty($data['filter_tag'])) {

$sql .= " AND (";

if (!empty($data['filter_name'])) {

$implode = array();

$words = explode(' ', trim(preg_replace('/\s+/', ' ', $data['filter_name'])));

foreach ($words as $word) {

$implode[] = "pd.name LIKE '%" . $this->db->escape($word) . "%'";

}

if ($implode) {

$sql .= " " . implode(" AND ", $implode) . "";

}

if (!empty($data['filter_description'])) {

$sql .= " OR pd.description LIKE '%" . $this->db->escape($data['filter_name']) . "%'";

}

}

if (!empty($data['filter_name']) && !empty($data['filter_tag'])) {

$sql .= " OR ";

}

if (!empty($data['filter_tag'])) {

$sql .= "pd.tag LIKE '%" . $this->db->escape(utf8_strtolower($data['filter_tag'])) . "%'";

}

if (!empty($data['filter_name'])) {

$sql .= " OR LCASE(p.model) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";

$sql .= " OR LCASE(p.sku) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";

$sql .= " OR LCASE(p.upc) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";

$sql .= " OR LCASE(p.ean) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";

$sql .= " OR LCASE(p.jan) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";

$sql .= " OR LCASE(p.isbn) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";

$sql .= " OR LCASE(p.mpn) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";

}

$sql .= ")";

}

if (!empty($data['filter_manufacturer_id'])) {

$sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'";

}

$query = $this->db->query($sql);

return $query->row['total'];

}

public function getProfile($product_id, $recurring_id) {

if (($this->customer->isLogged()) && (!$this->rwcsv->settings['identical_users'])) {

$customer_group_id = (int)$this->rwcsv->config_customer_group_id;

} else {

$customer_group_id = (int)$this->config->get('config_customer_group_id');

}

return $this->db->query("SELECT * FROM `" . DB_PREFIX . "recurring` `p` JOIN `" . DB_PREFIX . "product_recurring` `pp` ON `pp`.`recurring_id` = `p`.`recurring_id` AND `pp`.`product_id` = " . (int)$product_id . " WHERE `pp`.`recurring_id` = " . (int)$recurring_id . " AND `status` = 1 AND `pp`.`customer_group_id` = " . $customer_group_id)->row;

}

public function getProfiles($product_id) {

if (($this->customer->isLogged()) && (!$this->rwcsv->settings['identical_users'])) {

$customer_group_id = (int)$this->rwcsv->config_customer_group_id;

} else {

$customer_group_id = (int)$this->config->get('config_customer_group_id');

}

return $this->db->query("SELECT `pd`.* FROM `" . DB_PREFIX . "product_recurring` `pp` JOIN `" . DB_PREFIX . "recurring_description` `pd` ON `pd`.`language_id` = " . (int)$this->config->get('config_language_id') . " AND `pd`.`recurring_id` = `pp`.`recurring_id` JOIN `" . DB_PREFIX . "recurring` `p` ON `p`.`recurring_id` = `pd`.`recurring_id` WHERE `product_id` = " . (int)$product_id . " AND `status` = 1 AND `customer_group_id` = " . $customer_group_id . " ORDER BY `sort_order` ASC")->rows;

}

public function getTotalProductSpecials() {

if (($this->customer->isLogged()) && (!$this->rwcsv->settings['identical_users'])) {

$customer_group_id = (int)$this->rwcsv->config_customer_group_id;

} else {

$customer_group_id = (int)$this->config->get('config_customer_group_id');

}

$query = $this->db->query("SELECT COUNT(DISTINCT ps.product_id) AS total FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.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 ps.customer_group_id = '" . $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()))");

if (isset($query->row['total'])) {

return $query->row['total'];

} else {

return 0;

}

}

}

Ссылка на комменирий
Погделиться на других сайих


Выполнил сейчас запрос в phpmyadmin, запрос взял из файла /catalog/model/catalog/product.php из каилога модификаций

Преобразовал его к виду: 

SELECT p.product_id FROM oc_product p LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' ORDER BY p.date_added DESC LIMIT 20

 

Резульит запроса - вернул совершенно другие товары, не те что выводит модуль "Последние". Но вернул он, ксити, правильные товары, самые последние по дате добавления.

Ссылка на комменирий
Погделиться на других сайих


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы осивить комменирий

Создать аккаунт

Зарегистрируйтесь для получения аккауни. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите згдесь.

Войти сейчас
 Погделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обрилитка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфигденциальности.