dimanov911

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

Рекомендуемые сообщения

dimanov911    2

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
hoolygan    81

Ну как минимум нужно 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. Попробовать сделать выборку товаров напрямую в мускуле - посмотреть, какие дадты у последних при сортировке, может какой модуль стоит автообновления товаров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
dimanov911    2

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

 

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,
});

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
hoolygan    81

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
dimanov911    2

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
dimanov911    2

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
hoolygan    81

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

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

Изменено пользователем hoolygan

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
dimanov911    2

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
hoolygan    81

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

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

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

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

 

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

Изменено пользователем hoolygan

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
dimanov911    2

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
hoolygan    81

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
dimanov911    2

Посмотрел как в копии записано. Один в один совпадает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
dimanov911    2

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
hoolygan    81

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

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

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

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

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
dimanov911    2

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
dimanov911    2

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
igon    9

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

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
dimanov911    2

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

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

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

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

 

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

Изменено пользователем dimanov911

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
dimanov911    2

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
hoolygan    81

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
dimanov911    2

Вот код файла 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);
}
}
}
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
hoolygan    81

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

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

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 - и его код тоже под спойлер желательно, оттуда как раз выборка идет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
igon    9
...
$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() как индикаторы прохождения контрольных точек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
dimanov911    2
И посмотрите, что напишет в журнал ошибок. Должно показать Ваши товары в выборке.

Потом еще посмотрите есть ли в модификациях файлик /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;

}

}

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
dimanov911    2

Выполнил сейчас запрос в 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

 

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

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу