@KonstantinVasilev
вебмастер

Как отменить вывод товаров из некоторых подкатегорий в Opencart 3?

Здравствуйте. Сделал вывод всех товаров в подкатегориях в родительской, но нужно исключить товары из некоторых категорий. (В списке генераторов не должно быть АВР и альтернаторов).

Насколько понимаю, нужно добавить условия: если категория — не генераторы и у товара нет исключённых категорий.

В модели товара в функции getProducts() скопировал, добавил и переделал:

} else if (!empty($data['filter_category_id'] AND $data['filter_category_id'] == 61)) {

			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) WHERE p2c.category_id NOT IN ('909', '53')";
			} 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)";
			}


Комментарий: добавил: WHERE p2c.category_id NOT IN ('909', '53') (909 и 53 — id исключённых категорий) и в начале — проверку на id открытой категории (61).

Но возникает ошибка, только у этой категории:

Fatal error: Uncaught Exception: Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN oc_product p ON (p2c.product_id = p.product_id) LEFT JOIN oc_product_d' at line 1<br />Error No: 1064<br />SELECT p.product_id, (SELECT AVG(rating) AS total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM oc_product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '1' 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 oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' 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 LIMI in /home/c/ca34391/storage1/modification/system/library/db/mysqli.php on line 43


Я не уверен, что в правильном месте вставил проверку на исключённые категории.
  • Вопрос задан
  • 60 просмотров
Решения вопроса 1
@KonstantinVasilev Автор вопроса
вебмастер
Программист написал такой модификатор:

<?xml version="1.0" encoding="utf-8"?>
<modification>
    <name>Fix Category</name>
    <code>Fix</code>
    <version>1.0</version>
    <author>q3dm0</author>
	<link>http://www.opencart.com</link>
    
    <file path="catalog/model/catalog/product.php">
		<operation error="skip">
			<search><![CDATA[$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') . "'";]]></search>
			<add position="after"><![CDATA[
				if (!empty($data['filter_category_id']) && $data['filter_category_id'] == 18) {
					$sql .= " AND p2c.product_id NOT IN (SELECT product_id FROM " . DB_PREFIX . "product_to_category WHERE category_id IN ('46','20'))";
				}
			]]></add>	
		</operation>
	</file>
	    

</modification>


Здесь 18 заменить на ID родительской категории:
$data['filter_category_id'] == 18)

Здесь перечислить ID вложенных категорий, которые нужно скрыть:
WHERE category_id IN ('46','20'))";
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы