Opencart 1.5.x (catalog): как в каталоге добавить вывод атрибута к описанию товара
В комментариях к статье об изменении длины описаний в каталоге Opencart 1.5 спросили, можно ли сделать так,
чтобы вместо описания товара в каталоге выводился определённый атрибут товара (краткое описание товара). Интересует для OpenCart 1.5.1
Это несложно, изменения в двух файлах приведены ниже.
Как можно заметить, в файле catalog/controller/product/category.php я добавил текст атрибута к описанию. Не совсем то, что просили, но если надо выводить только атрибут -- думаю, несложно догадаться, как это сделать (заменить строчку на $descr_plaintext = $result['attribute_text'];), а несколько предыдущих строк там могут быть убраны. В общем, при наличии минимальных познаний или аккуратно методом тыка это будет несложно сделать, поэтому не описываю.
Изменения базируются на моём коде, а не чистом OpenCart v1.5: в этом месте была правка, но она задокументирована в упомянутой статье и минимальна. Поэтому, думаю, проблем с нахождением места и внесением изменений не возникнет.
Требуется заменить переменную $attr_id_to_descr = 0; на идентификатор своего атрибута, который должен выводиться. Его можно найти в админ-части магазина, внимательно изучив ссылку редактирования нужного нам атрибута: в адресе после токена (token=...) присутствует переменная ...&attribute_id=9 (например). Вот этот идентификатор и надо указать вместо нуля.
diff --git a/public_html/catalog/controller/product/category.php b/public_html/catalog/controller/product/category.php
index 54ad9bc..f94cc43 100644
--- a/public_html/catalog/controller/product/category.php
+++ b/public_html/catalog/controller/product/category.php
@@ -185,6 +185,8 @@ class ControllerProductCategory extends Controller {
{
$descr_plaintext = mb_substr($descr_plaintext, 0, $cut_descr_symbols, 'UTF-8') . ' …';
}
+ if( !empty($result['attribute_text']) )
+ $descr_plaintext .= '<hr />' . $result['attribute_text'];
$this->data['products'][] = array(
'product_id' => $result['product_id'],
'thumb' => $image,
diff --git a/public_html/catalog/model/catalog/product.php b/public_html/catalog/model/catalog/product.php
index 595bfc6..2b19a72 100644
--- a/public_html/catalog/model/catalog/product.php
+++ b/public_html/catalog/model/catalog/product.php
@@ -11,13 +11,40 @@ class ModelCatalogProduct extends Model {
$customer_group_id = $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 = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) 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 = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) 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 = '" . (int)$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 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') . "'");
-
+ $attr_id_to_descr = 0;
+ if( 0 != $attr_id_to_descr )
+ {
+ $sql_attr1 = " p.product_id AS product_id, pa.text as attribute_text, ";
+ $sql_attr2 = " LEFT JOIN " . DB_PREFIX . "product_attribute pa ON (p.product_id = pa.product_id AND pa.attribute_id=" . $attr_id_to_descr .')';
+ }
+ else
+ {
+ $sql_attr1 = "";
+ $sql_attr2 = "";
+ }
+ $query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer,". $sql_attr1
+ ." (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) 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 = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) 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 = '" . (int)$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"
+ ." 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)"
+ . $sql_attr2
+ ." 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'],
+ 'attribute_text' => ( (0 == $attr_id_to_descr) ? '' : $query->row['attribute_text'] ),
'meta_description' => $query->row['meta_description'],
'meta_keyword' => $query->row['meta_keyword'],
'model' => $query->row['model'],
Еще записи по теме
- Opera: используем свои шрифты на неудобных сайтах
- Opera Dragonfly не работает без интернета? Исправляем
- Opera: добавляем "автоскролл" и быстрое скрытие/показ адресной строки
- Opencart 1.5.1.3 (backend): улучшение поиска в фильтрах - не только с начала строки или по полному совпадению (имя, email, IP, опции, атрибуты)
- Добавлена поддержка Shoppica-и в Quickcheckout со способами оплаты (QCPM.1513)
- Opencart 1.5.x -- 1.5.1.2 (admin): редактирование заказов
- Индикация цен опций товара заменена на абсолютную величину (вместо разницы +X руб, -Y руб)




Комментариев: 7
Большое спасибо, все работает! Только в цитате человек имеел ввиду выод атрибута ВМЕСТО описания. Для этого, думаю, атрибут стоит не присоединять к описанию, а выводить вместо него, т.е.
вместо строки $descr_plaintext .= '' . $result['attribute_text'];
можно написать $descr_plaintext = $result['attribute_text'];
А так все чОтко, респект! ;)
Так и задумано :) Я же специально сделал об этом оговорку: сразу после цитаты в самом начале текста. И аналогичный рецепт по изменению "после" на "вместо" там тоже указан.
Просто описал более универсальный вариант как более интересный, а частный случай мы бы и руками поправили, если того пояснения не хватило бы. Но судя по появившейся сразу вслед за публикацией оценке и отсутствию вопросов, спрашивавшему всё оказалось понятно :)
А если необходимо вывести несколько атрибутов (10), придется повторять код для каждого?
Нет, тогда уже лучше код менять. Чтобы выбирались сразу 10 атрибутов. Но там уже, по-моему, недостаточно будет запрос из этого примера изменить - надо будет дополнительно обрабатывать изменившиеся результаты запроса.
Или выбирать по группе атрибутов.
Ещё лучше взять аналогичные код со страниц вывода товара и переносить по тому же принципу в product/category. Не зная конкретную задачу, сложно сказать, как лучше сделать.
Можете выложить vqmod. данный метод не работает на ocStore :(
На какой именно версии ocStore не работает? Это написано для версий 1.5 (соответственно ocstore от 1.0.1 и выше).
С vqmod не помогу - я им не пользуюсь.
Скажите а как сделать чтобы выводить опции товара в категории?