kiggo

Мини описание товара в категории (ошибка null) нужна помощь

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

kiggo    0
День добрый. 

 

Сразу прошу ногами не пинать - я только учусь :)

 

Есть необходимость добавить мини описание товара в категории.

 

в category.php

 

$this->data['products'][] = array(
'product_id'  => $result['product_id'],
'thumb'       => $image,
'thumbwidth'  => $imagewidth,
'thumbheight' => $imageheight,
'name'        => $result['name'],
'description' => utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, 300) . '..',
'description_mini' => html_entity_decode ($result['description_mini']),
'price'       => $price,
'special'     => $special,
'tax'         => $tax,
'rating'      => $result['rating'],
'reviews'     => sprintf($this->language->get('text_reviews'), (int)$result['reviews']),
'href'        => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url)
);
}
 
 
в category.tpl добавил по аналогии
html += '<div class="name">' + $(element).find('.name').html() + '</div>';
   html += '<div class="desc_mini">' + $(element).find('.description_mini').html() + '</div>';
var price = $(element).find('.price').html();
 
if (price != null) {
html += '<div class="price">' + price  + '</div>';
}
html += '<div class="description">' + $(element).find('.description').html() + '</div>';
 
 
в результате хотелось бы получить вывод мини описания а получаю null
 
Очень буду благодарен за помощь.
 

post-670964-0-20438700-1417609324_thumb.png

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


Ссылка на сообщение
Поделиться на другие сайты
Tom    2 095
в category.tpl добавил по аналогии
html += '<div class="name">' + $(element).find('.name').html() + '</div>';
   html += '<div class="desc_mini">' + $(element).find('.description_mini').html() + '</div>';
var price = $(element).find('.price').html();

 

 

 

и для сетки и для списка?

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


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

нет. только для сетки

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


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

Все же кто может помочь ?

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


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

Если вы не редактировали модель, то:

Ошибка для начала здесь:

'description_mini' => html_entity_decode ($result['description_mini']),

 

Должно быть, к примеру:

'description_mini' => utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, 100) . '..',

 

И для тплки вы добавили див в нужное место ? <div class="description_mini"><?php echo $product['description_mini]; ?></div>

 

Я так понимаю будет еще вид отображения товаров списком с "полным" описанием?

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

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


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

1. Отредактировал модель:

'description' => utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, 300),

'description_mini' => utf8_substr(strip_tags(html_entity_decode($result['description_mini'], ENT_QUOTES, 'UTF-8')), 0, 15),
 
Ошибка не изменилась.
 
DIV стоит на своем месте.
 
Полое описание будет отображаться в виде сетка, вместе с мини описанием - контент не дублируется.
В моем случае выводиться описание до 15 знаков 

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


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

Если интересно, я мини описание добавил отдельной переменной. Естественно, добавил в таблицу описаний новое поле (short_descr) и сделал его вывод именно в списке товаров категории. Правда у меня этот вывод для списка, а не для сетки. Условие - если короткое описание заполнено - выводится короткое описание, если не заполнено - выводится полное описание.

Необходимо редактировать несколько файлов:

 

Для вывода - сам шаблон вывода, контроллер в папке catalog

\catalog\view\theme\default\template\product\category.tpl

\catalog\controller\product\category.php

Для сохранения через карточку товара - сам шаблон карточки товара и контроллер этой карточки в папке admin

\admin\view\template\catalog\product_form.tpl

\admin\controller\catalog\product.php

Ну и, естественно, языковый файл в папке admin

\admin\language\russian\catalog\product.php

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


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

В шаблоне изначально введена переменная description_mini которая хранит мини описание товара. В карточке она есть. В SQL - храниться.

Вывести не могу :(

post-670964-0-39446000-1417773872_thumb.jpg

post-670964-0-29275700-1417773873_thumb.jpg

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


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

Для вывода я вам написал, какие файлы править.

Находите там место, куда надо выводить и вставляете код вывода.

Вот мой код из файла category.tpl:

<div class="description">
 <?php if (!isset($product['short_descr'])) { ?>
  <?php echo $product['description']; ?>
 <?php } else { ?>
  <?php echo $product['short_descr']; ?>
 <?php } ?>
</div>

У вас будет вместо short_descr description_mini

Ну и условие вывода надо прописывать для сетки, а не для списка

 

Тоже самое, кстати, для поиска не мешает сделать.

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


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

kiggo

 

Тогда выложите здесь под спойлером содержимое трех файлов:

catalog/model/catalog/product.php

catalog/controller/product/category.php

catalog/view/theme/*******/template/product/category.tpl

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


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

catalog/model/catalog/product.php

<?php

class ModelCatalogProduct extends Model {
 
private $FOUND_ROWS;
 
public function getFoundProducts() {
return $this->FOUND_ROWS;
}
 
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()) {
$customer_group_id = $this->customer->getCustomerGroupId();
} else {
$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, 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'],
'seo_title'        => $query->row['seo_title'],
'seo_h1'           => $query->row['seo_h1'],
'name'             => $query->row['name'],
'description'      => $query->row['description'],
'description_mini' => $query->row['description_mini'],
'meta_description' => $query->row['meta_description'],
'meta_keyword'     => $query->row['meta_keyword'],
'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;
}
}
 
public function getProducts($data = array()) {
if ($this->customer->isLogged()) {
$customer_group_id = $this->customer->getCustomerGroupId();
} else {
$customer_group_id = $this->config->get('config_customer_group_id');
}
 
if (!empty($data['coolfilter'])) {
$coolfilter = $data['coolfilter'];
} else {
$coolfilter = 0;
}
 
// Start coolfilter
$currency_value = $this->currency->getValue();
$tax_rate = $this->tax->getTax(100, 9);
 
$sql_add_table_prices = '';
$sql_where_prices = '';
$sql_where_manufacteurs = '';
$sql_add_table_options = '';
$sql_where_options = '';
$sql_add_table_attributes = '';
$sql_where_attributes = '';
//standart filter
$sql_add_table_parameters = '';
$sql_where_parameters = '';
//standart filter
if ($coolfilter) {
 
 
 
 foreach (explode(';', $coolfilter) as $option) {
$values = explode(':', $option);
 
 
if ($values[0] == 'm' && preg_match('/^[\d\,]*$/', $values[1])) {
$sql_where_manufacteurs = ' AND p.manufacturer_id IN (' . $this->db->escape($values[1]) . ')';
}
if (preg_match('/o_\d+/', $values[0]) && preg_match('/^[\d\,]*$/', $values[1])) {
$option_id = $this->db->escape($values[0]);
$sql_add_table_options .= ' LEFT JOIN ' . DB_PREFIX . 'product_option_value pov' . $option_id . ' ON (p.product_id = pov' . $option_id . '.product_id)';
 
$sql_where_options .= ' AND pov' . $option_id . '.option_value_id IN (' . $this->db->escape($values[1]) .') AND (pov' . $option_id . '.subtract=0 OR pov' . $option_id . '.subtract=1 AND pov' . $option_id . '.quantity > 0)';
}
 
 
if (preg_match('/a_\d+/', $values[0])) {
 
 
 
$attribute_id = $this->db->escape($values[0]);
$sql_add_table_attributes .= " LEFT JOIN " . DB_PREFIX . "product_attribute atr" . $attribute_id . " ON (p.product_id = atr" . $attribute_id . ".product_id)";
$get_id = explode("_", $values[0]);
 
$values[1] = explode(",", $values[1]);
for ($i = 0; $i < count($values[1]); $i++) {
$values[1][$i] = $this->db->escape($values[1][$i]);
}
 
$values[1] = "'" . implode("','", $values[1]) . "'";
 
$sql_where_attributes .= " AND (atr" . $attribute_id . ".language_id = '" . (int)$this->config->get('config_language_id') . "' AND atr" . $attribute_id . ".attribute_id = '" . (int)$get_id[1] . "' AND atr" . $attribute_id . ".text IN (" . $values[1] . "))";
}
 
if ($values[0] == 'p') {
 
$values[1] = explode(",", $values[1]);
if (!isset($values[1][0])) {
$values[1][0] = 0;
} else {
$values[1][0] /= $currency_value;
}
 
if (!isset($values[1][1])) {
$values[1][1] = 9999999999;
} else {
$values[1][1] /= $currency_value;
}
 
for ($i = 0; $i < 2; $i++) {
$values[1][$i] = $this->db->escape($values[1][$i]);
}
 
if (!empty($data['coolfilter_category_id'])) {
$category_id = ' AND ct.category_id IN (' . $data['coolfilter_category_id'] . ')';
} else {
$category_id = '';
}
 
$sql_add_table_prices .= " LEFT JOIN (SELECT pr.product_id, pr.price, (SELECT pd2.price FROM `" . DB_PREFIX . "product_discount` pd2 WHERE pd2.product_id = pr.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) discount, (SELECT ps.price FROM `" . DB_PREFIX . "product_special` ps WHERE ps.product_id = pr.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) special FROM `" . DB_PREFIX . "product` pr LEFT JOIN `" . DB_PREFIX . "product_to_category` ct ON (pr.product_id = ct.product_id) WHERE pr.status = '1'" . $category_id . ") tb ON (p.product_id = tb.product_id)";
$sql_where_prices .= "AND tb.price >= '" . $values[1][0] . "' AND (tb.discount IS NULL OR tb.discount >= '" . $values[1][0] . "') AND (tb.special IS NULL OR tb.special >= '" . $values[1][0] . "') AND tb.price <= '" . $values[1][1] . "' AND (tb.discount IS NULL OR tb.discount <= '" . $values[1][1] . "') AND (tb.special IS NULL OR tb.special <= '" . $values[1][1] . "')";
}
//standart filter
if (preg_match('/p_\d+/', $values[0]) && preg_match('/^[\d\,]*$/', $values[1])) {
 
$parameter_id = $this->db->escape($values[0]);
 
 
$sql_add_table_parameters .= " LEFT JOIN " . DB_PREFIX . "product_filter par" . $parameter_id . " ON (p.product_id = par" . $parameter_id . ".product_id) LEFT JOIN  " . DB_PREFIX . "filter_description fd" . $parameter_id . "  ON (par" . $parameter_id . ".filter_id = fd" . $parameter_id . ".filter_id) ";
$get_id = explode("_", $values[0]);
 
$values[1] = explode(",", $values[1]);
for ($i = 0; $i < count($values[1]); $i++) {
$values[1][$i] = $this->db->escape($values[1][$i]);
 
 
}
 
$values[1] = "'" . implode("','", $values[1]) . "'";
 
$sql_where_parameters .= " AND (fd" . $parameter_id . ".language_id = '" . (int)$this->config->get('config_language_id') . "' AND par" . $parameter_id . ".filter_id IN (" . $values[1] . "))";
 
 
}
//standart filter
}
 }
 
 
// End coolfilter
 
$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 = '" . (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"; 
 
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";
}
 
// start coolfilter
$sql .= $sql_add_table_options;
$sql .= $sql_add_table_attributes;
$sql .= $sql_add_table_prices;
$sql .= $sql_add_table_parameters;
// End coolfilter
 
$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\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'])) . "'";
}
 
if (!empty($data['filter_name'])) {
$sql .= " OR LCASE(p.sku) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
}
 
if (!empty($data['filter_name'])) {
$sql .= " OR LCASE(p.upc) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
}
 
if (!empty($data['filter_name'])) {
$sql .= " OR LCASE(p.ean) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
}
 
if (!empty($data['filter_name'])) {
$sql .= " OR LCASE(p.jan) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
}
 
if (!empty($data['filter_name'])) {
$sql .= " OR LCASE(p.isbn) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
}
 
if (!empty($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 .= $sql_where_manufacteurs;
$sql .= $sql_where_attributes;
$sql .= $sql_where_options;
$sql .= $sql_where_prices; //print_r($sql);
//standart filter
$sql .= $sql_where_parameters; //print_r($sql);
//standart filter
 
$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 " . $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 getProductSpecials($data = array()) {
if ($this->customer->isLogged()) {
$customer_group_id = $this->customer->getCustomerGroupId();
} else {
$customer_group_id = $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 = '" . (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())) 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) {
if ($this->customer->isLogged()) {
$customer_group_id = $this->customer->getCustomerGroupId();
} else {
$customer_group_id = $this->config->get('config_customer_group_id');
}
 
$product_data = $this->cache->get('product.latest.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $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'). '.' . $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, 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) {
if ($this->customer->isLogged()) {
$customer_group_id = $this->customer->getCustomerGroupId();
} else {
$customer_group_id = $this->config->get('config_customer_group_id');
}
 
$product_data = $this->cache->get('product.bestseller.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id'). '.' . $customer_group_id . '.' . (int)$limit);
 
if (!$product_data) { 
$product_data = array();
 
$query = $this->db->query("SELECT op.product_id, COUNT(*) 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'). '.' . $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) {
if ($product_option['type'] == 'select' || $product_option['type'] == 'radio' || $product_option['type'] == 'checkbox' || $product_option['type'] == 'image') {
$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'],
'weight'                  => $product_option_value['weight'],
'weight_prefix'           => $product_option_value['weight_prefix']
);
}
 
$product_option_data[] = array(
'product_option_id' => $product_option['product_option_id'],
'option_id'         => $product_option['option_id'],
'name'              => $product_option['name'],
'type'              => $product_option['type'],
'option_value'      => $product_option_value_data,
'required'          => $product_option['required']
);
} else {
$product_option_data[] = array(
'product_option_id' => $product_option['product_option_id'],
'option_id'         => $product_option['option_id'],
'name'              => $product_option['name'],
'type'              => $product_option['type'],
'option_value'      => $product_option['option_value'],
'required'          => $product_option['required']
);
}
}
 
return $product_option_data;
}
 
public function getProductDiscounts($product_id) {
if ($this->customer->isLogged()) {
$customer_group_id = $this->customer->getCustomerGroupId();
} else {
$customer_group_id = $this->config->get('config_customer_group_id');
}
 
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_discount WHERE product_id = '" . (int)$product_id . "' AND customer_group_id = '" . (int)$customer_group_id . "' AND quantity > 1 AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY quantity ASC, priority ASC, price ASC");
 
return $query->rows;
}
 
public function 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 getProductRelated2($product_id) {
$product_data = array();
 
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_related2 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 getArticleRelated($product_id) {
$article_data = array();
$this->load->model('blog/article');
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "blog_related_product np LEFT JOIN " . DB_PREFIX . "article p ON (np.article_id = p.article_id) LEFT JOIN " . DB_PREFIX . "article_to_store p2s ON (p.article_id = p2s.article_id) WHERE np.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) { 
$article_data[$result['article_id']] = $this->model_blog_article->getArticle($result['article_id']);
}
 
return $article_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 false;
}
}
 
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;
}
 
public function getTotalProducts($data = array()) {
if ($this->customer->isLogged()) {
$customer_group_id = $this->customer->getCustomerGroupId();
} else {
$customer_group_id = $this->config->get('config_customer_group_id');
}
 
// Start coolfilter
if (!empty($data['coolfilter'])) {
$coolfilter = $data['coolfilter'];
} else {
$coolfilter = 0;
}
 
 
$currency_value = $this->currency->getValue();
 
$sql_add_table_prices = '';
$sql_where_prices = '';
$sql_where_manufacteurs = '';
$sql_add_table_options = '';
$sql_where_options = '';
$sql_add_table_attributes = '';
$sql_where_attributes = '';
//standart filter
$sql_add_table_parameters  = '';
$sql_where_parameters  = '';
//standart filter
 
if ($coolfilter) {
 
 foreach (explode(';', $coolfilter) as $option) {
$values = explode(':', $option);
 
 
if ($values[0] == 'm' && preg_match('/^[\d\,]*$/', $values[1])) {
$sql_where_manufacteurs = ' AND p.manufacturer_id IN (' . $this->db->escape($values[1]) . ')';
}
if (preg_match('/o_\d+/', $values[0]) && preg_match('/^[\d\,]*$/', $values[1])) {
$option_id = $this->db->escape($values[0]);
$sql_add_table_options .= ' LEFT JOIN ' . DB_PREFIX . 'product_option_value pov' . $option_id . ' ON (p.product_id = pov' . $option_id . '.product_id)';
$values[1] = preg_replace("/[^0-9\,]/", "", $values[1]);
$sql_where_options .= ' AND pov' . $option_id . '.option_value_id IN (' . $this->db->escape($values[1]) .') AND (pov' . $option_id . '.subtract=0 OR pov' . $option_id . '.subtract=1 AND pov' . $option_id . '.quantity > 0)';
}
if (preg_match('/a_\d+/', $values[0])) {
$attribute_id = $this->db->escape($values[0]);
$sql_add_table_attributes .= ' LEFT JOIN ' . DB_PREFIX . 'product_attribute atr' . $attribute_id . ' ON (p.product_id = atr' . $attribute_id . '.product_id)';
$get_id = explode("_", $values[0]);
 
$values[1] = explode(",", $values[1]);
for ($i = 0; $i < count($values[1]); $i++) {
$values[1][$i] = $this->db->escape($values[1][$i]);
}
 
$values[1] = "'" . implode("','", $values[1]) . "'";
 
$sql_where_attributes .= " AND (atr" . $attribute_id . ".language_id = '" . (int)$this->config->get('config_language_id') . "' AND atr" . $attribute_id . ".attribute_id = '" . (int)$get_id[1] . "' AND atr" . $attribute_id . ".text IN (" . $values[1] . "))";
}
if ($values[0] == 'p') {
 
if (isset($values[1])) {
   $values[1] = explode(",", $values[1]);
}
 
if (!isset($values[1][0])) {
$values[1][0] = 0;
} else {
$values[1][0] = $values[1][0]/$currency_value;
 
}
 
if (!isset($values[1][1])) {
$values[1][1] = 9999999;
} else {
$values[1][1] = $values[1][1]/$currency_value;
}
 
for ($i = 0; $i < 2; $i++) {
$values[1][$i] = (float)$values[1][$i];
}
 
if (!empty($data['coolfilter_category_id'])) {
$category_id = ' AND ct.category_id IN (' . $data['coolfilter_category_id'] . ')';
} else {
$category_id = '';
}
 
$sql_add_table_prices .= " LEFT JOIN (SELECT pr.product_id, pr.price, (SELECT pd2.price FROM `" . DB_PREFIX . "product_discount` pd2 WHERE pd2.product_id = pr.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) discount, (SELECT ps.price FROM `" . DB_PREFIX . "product_special` ps WHERE ps.product_id = pr.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) special FROM `" . DB_PREFIX . "product` pr LEFT JOIN `" . DB_PREFIX . "product_to_category` ct ON (pr.product_id = ct.product_id) WHERE pr.status = '1'" . $category_id . ") tb ON (p.product_id = tb.product_id)";
$sql_where_prices .= "AND tb.price >= '" . $values[1][0] . "' AND (tb.discount IS NULL OR tb.discount >= '" . $values[1][0] . "') AND (tb.special IS NULL OR tb.special >= '" . $values[1][0] . "') AND tb.price <= '" . $values[1][1] . "' AND (tb.discount IS NULL OR tb.discount <= '" . $values[1][1] . "') AND (tb.special IS NULL OR tb.special <= '" . $values[1][1] . "')";
}
 
 
//standart filter
 
if (preg_match('/p_\d+/', $values[0]) && preg_match('/^[\d\,]*$/', $values[1])) {
$parameter_id = $this->db->escape($values[0]);
 
$sql_add_table_parameters .= " LEFT JOIN " . DB_PREFIX . "product_filter par" . $parameter_id . " ON (p.product_id = par" . $parameter_id . ".product_id) LEFT JOIN  " . DB_PREFIX . "filter_description fd" . $parameter_id . "  ON (par" . $parameter_id . ".filter_id = fd" . $parameter_id . ".filter_id) ";
$get_id = explode("_", $values[0]);
 
$values[1] = explode(",", $values[1]);
for ($i = 0; $i < count($values[1]); $i++) {
$values[1][$i] = $this->db->escape($values[1][$i]);
 
 
}
 
$values[1] = "'" . implode("','", $values[1]) . "'";
 
$sql_where_parameters .= " AND (fd" . $parameter_id . ".language_id = '" . (int)$this->config->get('config_language_id') . "' AND par" . $parameter_id . ".filter_id IN (" . $values[1] . "))";// 
}
}
 
// End coolfilter
 
$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";
}
 
// start coolfilter
$sql .= $sql_add_table_options;
$sql .= $sql_add_table_attributes;
$sql .= $sql_add_table_prices;
// End coolfilter
//standart filter
$sql .= $sql_add_table_parameters;
//standart filter
 
$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\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'])) . "'";
}
 
if (!empty($data['filter_name'])) {
$sql .= " OR LCASE(p.sku) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
}
 
if (!empty($data['filter_name'])) {
$sql .= " OR LCASE(p.upc) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
}
 
if (!empty($data['filter_name'])) {
$sql .= " OR LCASE(p.ean) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
}
 
if (!empty($data['filter_name'])) {
$sql .= " OR LCASE(p.jan) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
}
 
if (!empty($data['filter_name'])) {
$sql .= " OR LCASE(p.isbn) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
}
 
if (!empty($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 .= $sql_where_manufacteurs;
$sql .= $sql_where_attributes;
$sql .= $sql_where_options;
$sql .= $sql_where_prices; //print_r($sql.'<br><br>');
//standart filter
$sql .= $sql_where_parameters;
//standart filter
 
 
$query = $this->db->query($sql);
 
return $query->row['total'];
}
 
public function getProfiles($product_id) {
if ($this->customer->isLogged()) {
$customer_group_id = $this->customer->getCustomerGroupId();
} else {
$customer_group_id = $this->config->get('config_customer_group_id');
}
 
return $this->db->query("SELECT `pd`.* FROM `" . DB_PREFIX . "product_profile` `pp` JOIN `" . DB_PREFIX . "profile_description` `pd` ON `pd`.`language_id` = " . (int)$this->config->get('config_language_id') . " AND `pd`.`profile_id` = `pp`.`profile_id` JOIN `" . DB_PREFIX . "profile` `p` ON `p`.`profile_id` = `pd`.`profile_id` WHERE `product_id` = " . (int)$product_id . " AND `status` = 1 AND `customer_group_id` = " . (int)$customer_group_id . " ORDER BY `sort_order` ASC")->rows;
 
}
 
public function getProfile($product_id, $profile_id) {
if ($this->customer->isLogged()) {
$customer_group_id = $this->customer->getCustomerGroupId();
} else {
$customer_group_id = $this->config->get('config_customer_group_id');
}
 
return $this->db->query("SELECT * FROM `" . DB_PREFIX . "profile` `p` JOIN `" . DB_PREFIX . "product_profile` `pp` ON `pp`.`profile_id` = `p`.`profile_id` AND `pp`.`product_id` = " . (int)$product_id . " WHERE `pp`.`profile_id` = " . (int)$profile_id . " AND `status` = 1 AND `pp`.`customer_group_id` = " . (int)$customer_group_id)->row;
}
 
public function getProductRelated_by_category($category_id, $limit) {
 
$product_data = array();
 
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_related_wb pr LEFT JOIN " . DB_PREFIX . "product p ON (pr.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pr.category_id = '" . (int)$category_id . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' LIMIT " . (int)$limit); 
 
foreach ($query->rows as $result) { 
$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
}
return $product_data;
}
 
public function getProductRelated_by_manufacturer($manufacturer_id, $limit) {
 
$product_data = array();
 
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_related_mn pr LEFT JOIN " . DB_PREFIX . "product p ON (pr.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pr.manufacturer_id = '" . (int)$manufacturer_id . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' LIMIT " . (int)$limit); 
 
foreach ($query->rows as $result) { 
$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
}
return $product_data;
}
 
public function getTotalProductSpecials() {
if ($this->customer->isLogged()) {
$customer_group_id = $this->customer->getCustomerGroupId();
} else {
$customer_group_id = $this->config->get('config_customer_group_id');
}
 
$query = $this->db->query("SELECT COUNT(DISTINCT ps.product_id) AS total FROM " . DB_PREFIX . "product_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 = '" . (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()))");
 
if (isset($query->row['total'])) {
return $query->row['total'];
} else {
return 0;
}
}
}

?>

 

 

catalog/controller/product/category.php

<?php 
class ControllerProductCategory extends Controller {  
public function index() { 
$this->language->load('product/category');
 
$this->load->model('catalog/category');
 
$this->load->model('catalog/product');
 
$this->load->model('tool/image'); 
 
if (isset($this->request->get['filter'])) {
$filter = $this->request->get['filter'];
$this->document->setRobots('noindex,follow');
} else {
$filter = '';
}
 
if (isset($this->request->get['sort'])) {
$sort = $this->request->get['sort'];
$this->document->setRobots('noindex,follow');
} else {
$sort = 'p.sort_order';
}
 
if (isset($this->request->get['order'])) {
$order = $this->request->get['order'];
} else {
$order = 'ASC';
}
 
if (isset($this->request->get['coolfilter'])) {
       $coolfilter = $this->request->get['coolfilter'];
$this->document->setRobots('noindex,follow');
} else {
       $coolfilter = '';
}
 
if (isset($this->request->get['page'])) {
$page = $this->request->get['page'];
$this->document->setRobots('noindex,follow');
} else { 
$page = 1;
}
 
if (isset($this->request->get['limit'])) {
$limit = $this->request->get['limit'];
$this->document->setRobots('noindex,follow');
} else {
$limit = $this->config->get('config_catalog_limit');
}
 
$this->data['breadcrumbs'] = array();
 
$this->data['breadcrumbs'][] = array(
'text'      => $this->language->get('text_home'),
'href'      => $this->url->link('common/home'),
'separator' => false
);
 
if (isset($this->request->get['path'])) {
$url = '';
 
if (isset($this->request->get['sort'])) {
$url .= '&sort=' . $this->request->get['sort'];
}
 
if (isset($this->request->get['order'])) {
$url .= '&order=' . $this->request->get['order'];
}
 
if (isset($this->request->get['coolfilter'])) {
         $url .= '&coolfilter=' . $this->request->get['coolfilter'];
       }
 
if (isset($this->request->get['limit'])) {
$url .= '&limit=' . $this->request->get['limit'];
}
 
$path = '';
 
$parts = explode('_', (string)$this->request->get['path']);
 
$category_id = (int)array_pop($parts);
 
foreach ($parts as $path_id) {
if (!$path) {
$path = (int)$path_id;
} else {
$path .= '_' . (int)$path_id;
}
 
$category_info = $this->model_catalog_category->getCategory($path_id);
 
if ($category_info || $path_id == 0) {
 
if ($path_id == 0) {
$category_info['name'] = $this->language->get('text_all_products');
}
$this->data['breadcrumbs'][] = array(
'text'      => $category_info['name'],
'href'      => $this->url->link('product/category', 'path=' . $path . $url),
'separator' => $this->language->get('text_separator')
);
}
}
} else {
$category_id = 0;
}
 
$category_info = $this->model_catalog_category->getCategory($category_id);
 
if ($category_info || $category_id == 0) {
if ($category_id == 0) {
$category_info = array('name' => $this->language->get('text_all_products'),
'seo_title' => '',
'meta_description' => '',
'meta_keyword' => '',
'seo_h1' => $this->language->get('text_all_products'),
'image' => '',
'description' => '');
//india style fix
$this->request->get['path'] = 0;
//india style fix
}
 
if ($category_info['seo_title']) {
  $this->document->setTitle($category_info['seo_title']);
} else {
  $this->document->setTitle($category_info['name']);
}
 
$this->document->setDescription($category_info['meta_description']);
$this->document->setKeywords($category_info['meta_keyword']);
 
if ($category_info['seo_h1']) {
$this->data['heading_title'] = $category_info['seo_h1'];
} else {
$this->data['heading_title'] = $category_info['name'];
}
 
$this->document->addScript('catalog/view/javascript/jquery/jquery.total-storage.min.js');
$this->document->addScript('catalog/view/javascript/jquery/jail/jail.min.js');
 
$this->data['text_refine'] = $this->language->get('text_refine');
$this->data['text_empty'] = $this->language->get('text_empty');
$this->data['text_quantity'] = $this->language->get('text_quantity');
$this->data['text_manufacturer'] = $this->language->get('text_manufacturer');
$this->data['text_model'] = $this->language->get('text_model');
$this->data['text_price'] = $this->language->get('text_price');
$this->data['text_tax'] = $this->language->get('text_tax');
$this->data['text_points'] = $this->language->get('text_points');
$this->data['text_compare'] = sprintf($this->language->get('text_compare'), (isset($this->session->data['compare']) ? count($this->session->data['compare']) : 0));
$this->data['text_display'] = $this->language->get('text_display');
$this->data['text_list'] = $this->language->get('text_list');
$this->data['text_grid'] = $this->language->get('text_grid');
$this->data['text_sort'] = $this->language->get('text_sort');
$this->data['text_limit'] = $this->language->get('text_limit');
 
$this->data['button_cart'] = $this->language->get('button_cart');
$this->data['button_wishlist'] = $this->language->get('button_wishlist');
$this->data['button_compare'] = $this->language->get('button_compare');
$this->data['button_continue'] = $this->language->get('button_continue');
 
// Set the last category breadcrumb
$url = '';
 
if (isset($this->request->get['sort'])) {
$url .= '&sort=' . $this->request->get['sort'];
}
 
if (isset($this->request->get['order'])) {
$url .= '&order=' . $this->request->get['order'];
}
 
if (isset($this->request->get['coolfilter'])) {
         $url .= '&coolfilter=' . $this->request->get['coolfilter'];
       }
 
if (isset($this->request->get['page'])) {
$url .= '&page=' . $this->request->get['page'];
}
 
if (isset($this->request->get['coolfilter'])) {
         $url .= '&coolfilter=' . $this->request->get['coolfilter'];
       }
 
if (isset($this->request->get['limit'])) {
$url .= '&limit=' . $this->request->get['limit'];
}
 
$this->data['breadcrumbs'][] = array(
'text'      => $category_info['name'],
'href'      => $this->url->link('product/category', 'path=' . $this->request->get['path']),
'separator' => $this->language->get('text_separator')
);
 
if ($category_info['image']) {
$this->data['thumb'] = $this->model_tool_image->resize($category_info['image'], $this->config->get('config_image_category_width'), $this->config->get('config_image_category_height'));
$this->document->setOgImage($this->data['thumb']);
} else {
$this->data['thumb'] = '';
}
 
$this->data['description'] = html_entity_decode($category_info['description'], ENT_QUOTES, 'UTF-8');
$this->data['compare'] = $this->url->link('product/compare');
 
$url = '';
 
if (isset($this->request->get['filter'])) {
$url .= '&filter=' . $this->request->get['filter'];
}
 
if (isset($this->request->get['sort'])) {
$url .= '&sort=' . $this->request->get['sort'];
}
 
if (isset($this->request->get['order'])) {
$url .= '&order=' . $this->request->get['order'];
}
 
if (isset($this->request->get['coolfilter'])) {
         $url .= '&coolfilter=' . $this->request->get['coolfilter'];
       }
 
if (isset($this->request->get['limit'])) {
$url .= '&limit=' . $this->request->get['limit'];
}
 
$this->data['categories'] = array();
 
$results = $this->model_catalog_category->getCategories($category_id);
 
foreach ($results as $result) {
$data = array(
'filter_category_id'  => $result['category_id'],
'filter_sub_category' => true,
'coolfilter'         => $coolfilter
);
 
$product_total = $this->model_catalog_product->getTotalProducts($data);
 
$this->data['categories'][] = array(
'name'  => $result['name'] . ($this->config->get('config_product_count') ? ' (' . $product_total . ')' : ''),
'count' => $product_total,
'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '_' . $result['category_id'] . $url)
);
}
 
$this->data['products'] = array();
 
$data = array(
'filter_category_id' => $category_id,
'filter_filter'      => $filter, 
'sort'               => $sort,
'order'              => $order,
'start'              => ($page - 1) * $limit,
'limit'              => $limit,
'coolfilter'         => $coolfilter
);
 
$product_total = $this->model_catalog_product->getTotalProducts($data); 
 
$results = $this->model_catalog_product->getProducts($data);
 
foreach ($results as $result) {
if ($result['image']) {
$image = $this->model_tool_image->resize($result['image'], $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height'));
$imagewidth = $this->config->get('config_image_product_width');
$imageheight = $this->config->get('config_image_product_height');
} else {
$image = false;
$imagewidth = '';
$imageheight = '';
}
 
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 = (int)$result['rating'];
} else {
$rating = false;
}
 
$this->data['products'][] = array(
'product_id'  => $result['product_id'],
'thumb'       => $image,
'thumbwidth'  => $imagewidth,
'thumbheight' => $imageheight,
'name'        => $result['name'],
'description' => utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, 300),
/*'description_mini' => utf8_substr(strip_tags(html_entity_decode($result['description_mini'], ENT_QUOTES, 'UTF-8')), 0, 15),*/
'description_mini' => html_entity_decode ($result['description_mini']),
'price'       => $price,
'special'     => $special,
'tax'         => $tax,
'rating'      => $result['rating'],
'reviews'     => sprintf($this->language->get('text_reviews'), (int)$result['reviews']),
'href'        => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url)
);
}
 
$url = '';
 
if (isset($this->request->get['filter'])) {
$url .= '&filter=' . $this->request->get['filter'];
}
 
if (isset($this->request->get['coolfilter'])) {
$url .= '&coolfilter=' . $this->request->get['coolfilter'];
}
 
if (isset($this->request->get['limit'])) {
$url .= '&limit=' . $this->request->get['limit'];
}
 
if (isset($this->request->get['coolfilter'])) {
$url .= '&coolfilter=' . $this->request->get['coolfilter'];
}
 
$this->data['sorts'] = array();
 
$this->data['sorts'][] = array(
'text'  => $this->language->get('text_default'),
'value' => 'p.sort_order-ASC',
'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.sort_order&order=ASC' . $url)
);
 
$this->data['sorts'][] = array(
'text'  => $this->language->get('text_name_asc'),
'value' => 'pd.name-ASC',
'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=pd.name&order=ASC' . $url)
);
 
$this->data['sorts'][] = array(
'text'  => $this->language->get('text_name_desc'),
'value' => 'pd.name-DESC',
'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=pd.name&order=DESC' . $url)
);
 
$this->data['sorts'][] = array(
'text'  => $this->language->get('text_price_asc'),
'value' => 'p.price-ASC',
'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.price&order=ASC' . $url)
); 
 
$this->data['sorts'][] = array(
'text'  => $this->language->get('text_price_desc'),
'value' => 'p.price-DESC',
'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.price&order=DESC' . $url)
); 
 
if ($this->config->get('config_review_status')) {
$this->data['sorts'][] = array(
'text'  => $this->language->get('text_rating_desc'),
'value' => 'rating-DESC',
'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=rating&order=DESC' . $url)
); 
 
$this->data['sorts'][] = array(
'text'  => $this->language->get('text_rating_asc'),
'value' => 'rating-ASC',
'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=rating&order=ASC' . $url)
);
}
 
$this->data['sorts'][] = array(
'text'  => $this->language->get('text_model_asc'),
'value' => 'p.model-ASC',
'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.model&order=ASC' . $url)
);
 
$this->data['sorts'][] = array(
'text'  => $this->language->get('text_model_desc'),
'value' => 'p.model-DESC',
'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.model&order=DESC' . $url)
);
 
$url = '';
 
if (isset($this->request->get['filter'])) {
$url .= '&filter=' . $this->request->get['filter'];
}
 
if (isset($this->request->get['sort'])) {
$url .= '&sort=' . $this->request->get['sort'];
}
 
if (isset($this->request->get['order'])) {
$url .= '&order=' . $this->request->get['order'];
}
 
if (isset($this->request->get['coolfilter'])) {
$url .= '&coolfilter=' . $this->request->get['coolfilter'];
}
 
$this->data['limits'] = array();
 
$limits = array_unique(array($this->config->get('config_catalog_limit'), 25, 50, 75, 100));
 
sort($limits);
 
foreach($limits as $value){
$this->data['limits'][] = array(
'text'  => $value,
'value' => $value,
'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&limit=' . $value)
);
}
 
$url = '';
 
if (isset($this->request->get['filter'])) {
$url .= '&filter=' . $this->request->get['filter'];
}
 
if (isset($this->request->get['sort'])) {
$url .= '&sort=' . $this->request->get['sort'];
}
 
if (isset($this->request->get['order'])) {
$url .= '&order=' . $this->request->get['order'];
}
 
if (isset($this->request->get['limit'])) {
$url .= '&limit=' . $this->request->get['limit'];
}
 
if (isset($this->request->get['coolfilter'])) {
$url .= '&coolfilter=' . $this->request->get['coolfilter'];
}
 
$pagination = new Pagination();
$pagination->total = $product_total;
$pagination->page = $page;
$pagination->limit = $limit;
$pagination->text = $this->language->get('text_pagination');
$pagination->url = $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&page={page}');
 
$this->data['pagination'] = $pagination->render();
 
$this->data['sort'] = $sort;
$this->data['order'] = $order;
$this->data['limit'] = $limit;
 
$this->data['continue'] = $this->url->link('common/home');
 
if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/product/category.tpl')) {
$this->template = $this->config->get('config_template') . '/template/product/category.tpl';
} else {
$this->template = 'default/template/product/category.tpl';
}
 
$this->children = array(
'common/column_left',
'common/column_right',
'common/content_top',
'common/content_bottom',
'common/footer',
'common/header'
);
 
$this->response->setOutput($this->render());
} else {
$url = '';
 
if (isset($this->request->get['path'])) {
$url .= '&path=' . $this->request->get['path'];
}
 
if (isset($this->request->get['filter'])) {
$url .= '&filter=' . $this->request->get['filter'];
}
 
if (isset($this->request->get['sort'])) {
$url .= '&sort=' . $this->request->get['sort'];
}
 
if (isset($this->request->get['order'])) {
$url .= '&order=' . $this->request->get['order'];
}
 
if (isset($this->request->get['page'])) {
$url .= '&page=' . $this->request->get['page'];
}
 
if (isset($this->request->get['limit'])) {
$url .= '&limit=' . $this->request->get['limit'];
}
 
$this->data['breadcrumbs'][] = array(
'text'      => $this->language->get('text_error'),
'href'      => $this->url->link('product/category', $url),
'separator' => $this->language->get('text_separator')
);
 
$this->document->setTitle($this->language->get('text_error'));
 
$this->data['heading_title'] = $this->language->get('text_error');
 
$this->data['text_error'] = $this->language->get('text_error');
 
$this->data['button_continue'] = $this->language->get('button_continue');
 
$this->data['continue'] = $this->url->link('common/home');
 
$this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 404 Not Found');
 
if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/error/not_found.tpl')) {
$this->template = $this->config->get('config_template') . '/template/error/not_found.tpl';
} else {
$this->template = 'default/template/error/not_found.tpl';
}
 
$this->children = array(
'common/column_left',
'common/column_right',
'common/content_top',
'common/content_bottom',
'common/footer',
'common/header'
);
 
$this->response->setOutput($this->render());
}
}
}
?>

 

 

catalog/view/theme/*******/template/product/category.tpl

<?php echo $header; ?>
<div class="<?php if ($column_right) { ?>span9<?php } else {?>span12<?php } ?>">
<div class="row">
<div class="<?php if ($column_left or $column_right) { ?>span9<?php } ?> <?php if ($column_left and $column_right) { ?>span6<?php } ?> <?php if (!$column_right and !$column_left) { ?>span12 <?php } ?>" id="content"><?php echo $content_top; ?>
  <div class="breadcrumb">
<?php foreach ($breadcrumbs as $breadcrumb) { ?>
<?php echo $breadcrumb['separator']; ?><a href="<?php echo $breadcrumb['href']; ?>"><?php echo $breadcrumb['text']; ?></a>
<?php } ?>
  </div>
  <h1 class="style-1"><?php echo $heading_title; ?></h1>
  <?php if ($thumb || $description) { ?>
  <div class="category-info">
<!--<?php if ($thumb) { ?>
<div class="image"><img src="<?php echo $thumb; ?>" alt="<?php echo $heading_title; ?>" /></div>
<?php } ?>-->
<?php if ($description) { ?>
<?php echo $description; ?>
<?php } ?>
</div>
  <?php } ?>
  <?php if ($categories) { ?>
  <div class="box subcat">
<div class="box-heading"><?php echo $text_refine; ?></div>
<div class="box-content">
 
<div class="box-product box-subcat">
<ul class="row"><?php $i=0;?>
<?php foreach ($categories as $category) { $i++; ?>
<?php 
if ($i%3==1) {
$a='first-in-line';
}
elseif ($i%3==0) {
$a='last-in-line';
}
else {
$a='';
}
?>
<li class="cat-height  span2">
<?php if ($category['thumb']) { ?>
<div class="image"><a href="<?php echo $category['href']; ?>"><img src="<?php echo $category['thumb']; ?>" alt="<?php echo $category['name']; ?>" /></a></div>
<?php } ?>
<div class="name subcatname"><a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?></a></div>
</li>
<?php } ?>
</ul>
</div>
</div>
  </div>
  <?php } ?>
  <?php if ($products) { ?>
  <div class="product-filter">
<div class="sort"><b><?php echo $text_sort; ?></b>
 <select onchange="location = this.value;">
<?php foreach ($sorts as $sorts) { ?>
<?php if ($sorts['value'] == $sort . '-' . $order) { ?>
<option value="<?php echo $sorts['href']; ?>" selected="selected"><?php echo $sorts['text']; ?></option>
<?php } else { ?>
<option value="<?php echo $sorts['href']; ?>"><?php echo $sorts['text']; ?></option>
<?php } ?>
<?php } ?>
 </select>
</div>
<div class="limit"><b><?php echo $text_limit; ?></b>
 <select onchange="location = this.value;">
<?php foreach ($limits as $limits) { ?>
<?php if ($limits['value'] == $limit) { ?>
<option value="<?php echo $limits['href']; ?>" selected="selected"><?php echo $limits['text']; ?></option>
<?php } else { ?>
<option value="<?php echo $limits['href']; ?>"><?php echo $limits['text']; ?></option>
<?php } ?>
<?php } ?>
 </select>
</div>
  <div class="product-compare"><a href="<?php echo $compare; ?>" id="compare-total"><?php echo $text_compare; ?></a></div>
<div class="display"><b><?php echo $text_display; ?></b> <?php echo $text_list; ?>  <a onclick="display('grid');"><?php echo $text_grid; ?></a></div>
  </div>
 
  <div class="product-grid">
<ul class="row">
<?php $i=0; foreach ($products as $product) { $i++; ?>
<?php 
if ($i%3==1) {
$a='first-in-line';
}
elseif ($i%3==0) {
$a='last-in-line';
}
else {
$a='';
}
?>
<li class="span3 <?php echo $a?>">
<?php if ($product['thumb']) { ?>
<div class="image"><a href="<?php echo $product['href']; ?>"><img id="img_<?php echo $product['product_id']; ?>" src="<?php echo $product['thumb']; ?>" title="<?php echo $product['name']; ?>" alt="<?php echo $product['name']; ?>" /></a></div>
 <?php } ?>
<div class="name"><a href="<?php echo $product['href']; ?>"><?php echo $product['name']; ?></a></div>
<div class="description"><?php echo $product['description']; ?></div>
<?php if ($product['price']) { ?>
<div class="price">
<?php if ($product['tax']) { ?>
<span class="price-tax"><?php echo $text_tax; ?> <?php echo $product['tax']; ?></span>
<?php } ?>
<?php if (!$product['special']) { ?>
<?php echo $product['price']; ?>
<?php } else { ?><span class="price-new"><?php echo $product['special']; ?></span>
<span class="price-old"><?php echo $product['price']; ?></span> 
<?php } ?>
</div>
<?php } ?>
<div class="cart-button">
<div class="cart"><a onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" title="<?php echo $button_cart; ?>"><!--<i class="icon-shopping-cart"></i>--><span><?php echo $button_cart; ?></span></a></div>
<div class="wishlist"><a class="tooltip-1 " title="<?php echo $button_wishlist; ?>"  onclick="addToWishList('<?php echo $product['product_id']; ?>');"><i class="icon-star"></i></a></div>
<div class="compare"><a class="tooltip-1" title="<?php echo $button_compare; ?>"  onclick="addToCompare('<?php echo $product['product_id']; ?>');"><i class="icon-bar-chart"></i></a></div>
<div class="clear"></div>
</div>
<div class="rating">
<?php if ($product['rating']) { ?>
<img height="13" src="catalog/view/theme/kitchen/image/stars-<?php echo $product['rating']; ?>.png" alt="<?php echo $product['reviews']; ?>" />
<?php } ?>
</div>
</li>
<?php } ?>
</ul>
  </div>
  
  <div class="pagination"><?php echo $pagination; ?></div>
  <?php } ?>
  <?php if (!$categories && !$products) { ?>
  <div class="box-container">
 <div class="content"><?php echo $text_empty; ?></div>
 <div class="buttons">
<div class="right"><a href="<?php echo $continue; ?>" class="button"><span><?php echo $button_continue; ?></span></a></div>
 </div>
  </div>
  <?php } ?>
  <?php echo $content_bottom; ?></div>
  <?php echo $column_left; ?>
</div>
</div>
<?php echo $column_right; ?>
 
<script type="text/javascript"><!--
function display(view) {
if (view == 'list') {
$('.product-grid ').attr('class', 'product-list');
$('.product-list ul').removeClass('row');
$('.product-list ul li').removeClass('span3');
$('.product-list ul li').each(function(index, element) {
html = '';
html += '<div class="row">';
var image = $(element).find('.image').html();
 
if (image != null) {
html += '<div class="image span2">' + image + '</div>';
}
html += '<div class="left span7">';
html += '<div class="name">' + $(element).find('.name').html() + '</div>';
html += '<div class="description">' + $(element).find('.description').html() + '</div>';
var price = $(element).find('.price').html();
if (price != null) {
html += '<div class="price">' + price  + '</div>';
}
html += '<div class="cart-button">';
html += '<div class="cart">' + $(element).find('.cart').html() + '</div>';
html += '<div class="wishlist">' + $(element).find('.wishlist').html() + '</div>';
html += '<div class="compare">' + $(element).find('.compare').html() + '</div>';
html += '<div class="clear">' + $(element).find('.clear').html() + '</div>';
html += '</div>';
var rating = $(element).find('.rating').html();
if (rating != null) {
html += '<div class="rating">' + rating + '</div>';
}
html += '</div>';
html += '</div>';
 
 
 
$(element).html(html);
});
 
$('.display').html('<b><?php echo $text_display; ?></b> <div id="list_b"><i class="icon-list"></i></div> <a id="grid_a" onclick="display(\'grid\');"><i class="icon-th"></i></a>');
 
$.totalStorage('display', 'list'); 
} else {
$('.product-list').attr('class', 'product-grid');
$('.product-grid ul').addClass('row');
$('.product-grid ul li').addClass('span3');
$('.product-grid ul li').each(function(index, element) {
html = '';
 
var image = $(element).find('.image').html();
 
if (image != null) {
html += '<div class="image">' + image + '</div>';
}
html += '<div class="left">';
html += '<div class="name">' + $(element).find('.name').html() + '</div>';
   html += '<div class="desc_mini">' + $(element).find('description_mini').html() + '</div>';
var price = $(element).find('.price').html();
if (price != null) {
html += '<div class="price">' + price  + '</div>';
}
html += '<div class="description">' + $(element).find('.description').html() + '</div>';
 
html += '<div class="cart-button">';
html += '<div class="cart">' + $(element).find('.cart').html() + '</div>';
html += '<div class="wishlist">' + $(element).find('.wishlist').html() + '</div>';
html += '<div class="compare">' + $(element).find('.compare').html() + '</div>';
html += '<div class="clear">' + $(element).find('.clear').html() + '</div>';
html += '</div>';
var rating = $(element).find('.rating').html();
 
if (rating != null) {
html += '<div class="rating">' + rating + '</div>';
}
 
html += '</div>';
$(element).html(html);
});
 
$('.display').html('<b><?php echo $text_display; ?></b> <a id="list_a" onclick="display(\'list\');"><i class="icon-list"></i></a>  <div id="grid_b"><i class="icon-th"></i></i></div>');
 
$.totalStorage('display', 'grid');
}
if ($('body').width() > 940) {
// tooltip demo
$('.tooltip-toggle').tooltip({
selector: "a[data-toggle=tooltip]"
})
$('.tooltip-1').tooltip({
placement:'bottom'
})
$('.tooltip-2').tooltip({
placement:'top'
})
}
 
}
 
view = $.totalStorage('display');
 
if (view) {
display(view);
} else {
display('grid');
}
//--></script> 
<!--<script type="text/javascript">
(function($){$.fn.equalHeights=function(minHeight,maxHeight){tallest=(minHeight)?minHeight:0;this.each(function(){if($(this).height()>tallest){tallest=$(this).height()}});if((maxHeight)&&tallest>maxHeight)tallest=maxHeight;return this.each(function(){$(this).height(tallest)})}})(jQuery)
$(window).load(function(){
if($(".cat-height").length){
$(".cat-height").equalHeights()}
})
</script>-->
 
<?php echo $footer; ?>

 

 

Буду весьма благодарен за помощь.

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


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

catalog/controller/product/category.php

заменить:

'description_mini' => html_entity_decode ($result['description_mini']),

на:

'description_mini' => html_entity_decode($result['description_mini'], ENT_QUOTES, 'UTF-8'),

 

catalog/view/theme/*******/template/product/category.tpl

после:

<div class="description"><?php echo $product['description']; ?></div>

добавить:

<div class="description_mini"><?php echo $product['description_mini']; ?></div>

 

убрать:

html += '<div class="desc_mini">' + $(element).find('description_mini').html() + '</div>';

 

в 2-х местах, после:

html += '<div class="name">' + $(element).find('.name').html() + '</div>';

добавить:

html += '<div class="description_mini">' + $(element).find('.description_mini').html() + '</div>';

 

в CSS добавить стили :

.product-list .description_mini {

display: none;

}

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


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

shchs Спасибо большое. Помогло. Логика понятна.

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


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

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

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

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

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

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

Войти

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

Войти


  • Похожий контент

    • От SergeTkach

      399.00 руб
      Скачать/Купить дополнение


      SEO Tags Generator — автогенерация SEO-тегов для OpenCart 2.x
      Модуль обеспечивает автоматическую SEO оптимизацию мета-тегов всех категорий и товаров, что имеет большое значение для SEO продвижения интернет-магазинов.

      Он избавляет Вас от лишней рутины при добавлении товаров. Модуль SEO Tags Generator делает работу с OpenCart2 проще и комфортнее, что приближает эту CMS к принципам дружелюбного к пользователю движка сайта.
       
      Сделав простую настройку 1 раз, Вы автоматически оптимизируете тысячи страниц 1 махом,по приемлемым для поисковых систему правилам.
       
      Модуль генерирует мета-теги на лету в момент формирования страницы, что исключает ошибки контент-менеджера в момент массовой работы с товарами (к примеру, импорт-экспорт).
       
       
      =============================================
      === Внимание! Условия покупки и использования ===
      =============================================

      Покупая данный модуль, Вы осознаете следующее:
      Автор  дает полную гарантию, что весь заявленный функционал будет работать на тех версиях системы, что заявлены с теми техническими характеристиками хостинга (сервера), что заявлены. В случае неработоспособности из-за ошибок в модуле, обязуется исправить ее в течение 3 рабочих дней. Лицензия выдается на 1 домен (+до 3 отладочных доменов). Во время акций, лицензии выдаются на несколько доменов, но никогда не выдается на бесконечное число доменов. Модуль содержит зашифрованные файлы, обеспечивающие контроль над лицензиями Вы отказываетесь от намерения запрашивать открытый исходный код зашифрованных файлов Модуль представляет собой типичное решение типичной задачи. Все индивидуальные запросы, которые меняют функционал модуля решаются в индивидуальном порядке с конкретным покупателем Вспомогательные модификаторы из папки "additional" являются бонусными. Они не входят в стоимость покупки. Гарантия на них не распространяется.  
       
      =====================================
       === Преимущества модуля ===
      =====================================
       
      Поддержка мультиязычности Автоматическое получение временной лицензии на 10 дней, чтобы Вы могли начать использовать модуль прямо сейчас без никаких простоев Примеры формул составления автоматические генерируемых метатегов прилагаются Модуль работает на специальных поддоменах для разработчиков без необходимости получать новые лицензии 1 формула для всех категорий и 1 формула для всех товаров, что идеально подходит для 90% интернет-магазинов без необходимости переплачивать за невостребованный функционал В версии 1.3 добавлены отдельные формулы для отдельных категорий (!!) Оптимальная цена  
       
      ===========================================
       === Функционал дополнительных расширений ===
      ===========================================
       
      Генерация SEO URL делается через родственный модуль — SEO URL Generator FREE Отмена ввода мета-тега title (в папке "additional" ) Ввод тега H1 (в папке "additional" ) Нумерация страниц в мета-тегах начиная со второй (в папке "additional")  
       
       
      =====================================
       === Как это работает? ===
      =====================================

      Модуль не записывает результат генерации тегов в базу данных!

      То есть, мета-теги формируются в тот же момент, когда формируется сама страница. Это происходит независимо, открыл ли ее человек или "парсит" поисковый паук (!).
      Кроме того, подход без перезаписи позволяет Вам применить формулу для всех товаров, загруженных ДО установки модуля.
       
      ---
      Генерация мета-тегов происходит в 2-ух режимах:
      - Если поле не заполнено
      - Принудительно (переопределение мета-тегов в тех случаях, когда Вы получили на руки магазин с уже неверно заполненным мета-тегами, что особенно актуально для seo-оптимизаторов)

      ---
      Внимание!
      При "разноперой" категории мета-теги для товара генерируются:
      - По главной категории товара, если она указана (!).
      - Если главная категория товара не обозначена, и при этом товар принадлежит только 1 категории, то по формуле этой категории.
      - Иначе генерация идет по общей формулей

       

      ===================================
      === Совместимость ===
      ===================================
      Работает на ветке 2.х начиная с версии OpenCart 2.1.0.1 (ocStore 2.1.0.1)
      PHP 5.4 или выше
      IonCube Loader 5 и выше
       
       

      ===================================
      === Демо версии 1.3 ===
      ===================================

      Демо витрины:
      Категория с общей формулой, Товар с общей формулой; Категория с отдельной формулой (Пример "разноперой" категории), Товар из "разноперой" категории
      Демо админки:
      http://seo-tags-generator-v-1-3.web-jump.in.ua/admin/ (!) Разрешено внесение изменений в настройки модуля, в товары и категорий (!) Логин/Пароль: demo/demo  


      ===================================
      ===  Демо версии 1 ===
      ===================================
      Демо витрины: Категория, Товар
      Демо админки: http://seo-tags-generator.web-jump.in.ua/admin
      Логин/Пароль: demo/demo


      =======================================
      === Примеры сайтов, где работает модуль: ===
      =======================================
      http://www.alpari.ua/
      www.sport-1.ru
      http://www.happylight.com.ua/
      https://adamant-spb.com/
      https://neroceramica.ru
      http://mastersnegir.ru/
      https://lovo.com.ua/
      shop.smartsf.ru
      http://viking-trans.com/
      http://www.palitra360.ru
      http://системы-доступа.рф/
      http://unclevova.com/
      http://makitarus.ru/
      http://olgashpiga.ru/
      http://www.pro-group.kh.ua/
      http://intensashop.ru/


      =======================================
       === Что зашифровано? ===
      =======================================
      Контроллер админки модуля Модель витрины, где происходит замена формул на тексты

      =====================================
       === Пробная версия ===
      =====================================
      Для пробы доступна ранняя версия модуля.

      Важно! После истечения срока временной лицензии пробной версии для совершения
      покупки, обращайтесь на тот сайт, где Вы нашли мой модуль, а не пишите в
      личных сообщениях на почту.

      Скачать пробную версию можно здесь — http://studio.web-jump.in.ua/download/seo-tags-generator/



      ===================================
      === Изменения ===
      ===================================
      /* V1.5
      ----------------------------------------- */
      - Добавлено наследование специфических формул от родительских категорий к дочерним категориям. Актуально и для товаров.
      - Появилась возможность для отдельно взятых категорий и товаров задать мета-описания вручную (галочка "Использовать вручную вписанные мета-теги для данного товара/для данной категории")
      - Модуль теперь можно устанавливать по FTP - установка перенесена из файла install.php в контроллер админки
      - Добавлена принудительная генерации мета-тега Keywords
       
      /* V1.4
      ----------------------------------------- */
      - Добавлен мета-тег Keywords
      - Добавлена совместимость с версией 2.0.3.1
      - Исправлен баг подключения дочерних файлов в admin/view/template/extension/module/seo_tags_generator.tpl
        Раннее, если модуль был модифицирован (к примеру, добавлена кнопка Apply), модуль не мог найти файл с формулами для отдельно взятых категорий
       
      /* V1.3
      ----------------------------------------- */
      - Наконец добавлены разноперые категории, как многие просили. То есть, для отдельно взятых категории можно задать свои шаблоны, тогда как остальные будут использовать общий шаблон генерации мета-тегов)

      - Для чистого OpenCart добавлены синонимы для модели товара и названия бренда (Синоним производителя пока что будет глючить на ocStore!)

      - Для чистого OpenCart добавлена нумерация страниц для пейджинации в категориях и производителях (page-number_v2.2-v2.3.ocmod.xml) - может конфликтовать с SEO мультиязык, где также есть подобный функционал.


      /* v1.2
      ----------------------------------------- */
      Версия не была опубликована, так как сразу же началась работа над следующей версией
      - Добавлена генерация мета-тегов для производителей


       
       
      Добавил SergeTkach Добавлено 03.04.2017 Категория SEO, карта сайта, оптимизация Системные требования PHP 5.4-5.6 с Ioncube Loader v5 или PHP 7.1 с Ioncube Loader v10 Сайт разработчика http://studio.web-jump.in.ua/ Старая цена Метод активации Автоматическая активация Ioncube Loader Требуется OpenCart 2.3
      2.2
      2.1 ocStore 2.3
      2.2
      2.1 OpenCart.Pro, ocShop Opencart.pro 2.3
      Opencart.pro 2.1
      Не проверялось  
    • От PaltonB
      Версия ocStore 2.3.0.2.3. , версия PHP: 5.6.30, MySQL 5.5.

      Нужен совет от экспертов:
      Информационная статья получилась внушительной, боле 50к символов, в основном за счет добавления html-тэгов. При сохранении OpenCart обрезает её. В БД полю "Описание" соответствует поле "description" в таблице oc_information_description с типом text (я так понимаю, длина поля 65535 символов, и это и есть камень преткновения). 

      Вопросы:
      Могу ли я в БД сам, вручную, изменить тип поля с text на MEDIUMTEXT? Если нельзя вручную, то как? Будет ли работать с этим OpenCart? Какие могут быть последствия этих действий? Может быть вы предложите другие варианты решения с длинной текста для информ.статей?  
      Заранее благодарен!
    • От SergeTkach
      Модуль обеспечивает автоматическую SEO оптимизацию мета-тегов всех категорий и товаров, что имеет большое значение для SEO продвижения интернет-магазинов.

      Он избавляет Вас от лишней рутины при добавлении товаров. Модуль SEO Tags Generator делает работу с OpenCart2 проще и комфортнее, что приближает эту CMS к принципам дружелюбного к пользователю движка сайта.
       
      Сделав простую настройку 1 раз, Вы автоматически оптимизируете тысячи страниц 1 махом,по приемлемым для поисковых систему правилам.
       
      Модуль генерирует мета-теги на лету в момент формирования страницы, что исключает ошибки контент-менеджера в момент массовой работы с товарами (к примеру, импорт-экспорт).
       
       
      =============================================
      === Внимание! Условия покупки и использования ===
      =============================================

      Покупая данный модуль, Вы осознаете следующее:
      Автор  дает полную гарантию, что весь заявленный функционал будет работать на тех версиях системы, что заявлены с теми техническими характеристиками хостинга (сервера), что заявлены. В случае неработоспособности из-за ошибок в модуле, обязуется исправить ее в течение 3 рабочих дней. Лицензия выдается на 1 домен (+до 3 отладочных доменов). Во время акций, лицензии выдаются на несколько доменов, но никогда не выдается на бесконечное число доменов. Модуль содержит зашифрованные файлы, обеспечивающие контроль над лицензиями Вы отказываетесь от намерения запрашивать открытый исходный код зашифрованных файлов Модуль представляет собой типичное решение типичной задачи. Все индивидуальные запросы, которые меняют функционал модуля решаются в индивидуальном порядке с конкретным покупателем Вспомогательные модификаторы из папки "additional" являются бонусными. Они не входят в стоимость покупки. Гарантия на них не распространяется.  
       
      =====================================
       === Преимущества модуля ===
      =====================================
       
      Поддержка мультиязычности Автоматическое получение временной лицензии на 10 дней, чтобы Вы могли начать использовать модуль прямо сейчас без никаких простоев Примеры формул составления автоматические генерируемых метатегов прилагаются Модуль работает на специальных поддоменах для разработчиков без необходимости получать новые лицензии 1 формула для всех категорий и 1 формула для всех товаров, что идеально подходит для 90% интернет-магазинов без необходимости переплачивать за невостребованный функционал В версии 1.3 добавлены отдельные формулы для отдельных категорий (!!) Оптимальная цена  
       
      ===========================================
       === Функционал дополнительных расширений ===
      ===========================================
       
      Генерация SEO URL делается через родственный модуль — SEO URL Generator FREE Отмена ввода мета-тега title (в папке "additional" ) Ввод тега H1 (в папке "additional" ) Нумерация страниц в мета-тегах начиная со второй (в папке "additional")  
       
       
      =====================================
       === Как это работает? ===
      =====================================

      Модуль не записывает результат генерации тегов в базу данных!

      То есть, мета-теги формируются в тот же момент, когда формируется сама страница. Это происходит независимо, открыл ли ее человек или "парсит" поисковый паук (!).
      Кроме того, подход без перезаписи позволяет Вам применить формулу для всех товаров, загруженных ДО установки модуля.
       
      ---
      Генерация мета-тегов происходит в 2-ух режимах:
      - Если поле не заполнено
      - Принудительно (переопределение мета-тегов в тех случаях, когда Вы получили на руки магазин с уже неверно заполненным мета-тегами, что особенно актуально для seo-оптимизаторов)

      ---
      Внимание!
      При "разноперой" категории мета-теги для товара генерируются:
      - По главной категории товара, если она указана (!).
      - Если главная категория товара не обозначена, и при этом товар принадлежит только 1 категории, то по формуле этой категории.
      - Иначе генерация идет по общей формулей

       

      ===================================
      === Совместимость ===
      ===================================
      Работает на ветке 2.х начиная с версии OpenCart 2.1.0.1 (ocStore 2.1.0.1)
      PHP 5.4 или выше
      IonCube Loader 5 и выше
       
       

      ===================================
      === Демо версии 1.3 ===
      ===================================

      Демо витрины:
      Категория с общей формулой, Товар с общей формулой; Категория с отдельной формулой (Пример "разноперой" категории), Товар из "разноперой" категории
      Демо админки:
      http://seo-tags-generator-v-1-3.web-jump.in.ua/admin/ (!) Разрешено внесение изменений в настройки модуля, в товары и категорий (!) Логин/Пароль: demo/demo  


      ===================================
      ===  Демо версии 1 ===
      ===================================
      Демо витрины: Категория, Товар
      Демо админки: http://seo-tags-generator.web-jump.in.ua/admin
      Логин/Пароль: demo/demo


      =======================================
      === Примеры сайтов, где работает модуль: ===
      =======================================
      http://www.alpari.ua/
      www.sport-1.ru
      http://www.happylight.com.ua/
      https://adamant-spb.com/
      https://neroceramica.ru
      http://mastersnegir.ru/
      https://lovo.com.ua/
      shop.smartsf.ru
      http://viking-trans.com/
      http://www.palitra360.ru
      http://системы-доступа.рф/
      http://unclevova.com/
      http://makitarus.ru/
      http://olgashpiga.ru/
      http://www.pro-group.kh.ua/
      http://intensashop.ru/


      =======================================
       === Что зашифровано? ===
      =======================================
      Контроллер админки модуля Модель витрины, где происходит замена формул на тексты

      =====================================
       === Пробная версия ===
      =====================================
      Для пробы доступна ранняя версия модуля.

      Важно! После истечения срока временной лицензии пробной версии для совершения
      покупки, обращайтесь на тот сайт, где Вы нашли мой модуль, а не пишите в
      личных сообщениях на почту.

      Скачать пробную версию можно здесь — http://studio.web-jump.in.ua/download/seo-tags-generator/



      ===================================
      === Изменения ===
      ===================================
      /* V1.5
      ----------------------------------------- */
      - Добавлено наследование специфических формул от родительских категорий к дочерним категориям. Актуально и для товаров.
      - Появилась возможность для отдельно взятых категорий и товаров задать мета-описания вручную (галочка "Использовать вручную вписанные мета-теги для данного товара/для данной категории")
      - Модуль теперь можно устанавливать по FTP - установка перенесена из файла install.php в контроллер админки
      - Добавлена принудительная генерации мета-тега Keywords
       
      /* V1.4
      ----------------------------------------- */
      - Добавлен мета-тег Keywords
      - Добавлена совместимость с версией 2.0.3.1
      - Исправлен баг подключения дочерних файлов в admin/view/template/extension/module/seo_tags_generator.tpl
        Раннее, если модуль был модифицирован (к примеру, добавлена кнопка Apply), модуль не мог найти файл с формулами для отдельно взятых категорий
       
      /* V1.3
      ----------------------------------------- */
      - Наконец добавлены разноперые категории, как многие просили. То есть, для отдельно взятых категории можно задать свои шаблоны, тогда как остальные будут использовать общий шаблон генерации мета-тегов)

      - Для чистого OpenCart добавлены синонимы для модели товара и названия бренда (Синоним производителя пока что будет глючить на ocStore!)

      - Для чистого OpenCart добавлена нумерация страниц для пейджинации в категориях и производителях (page-number_v2.2-v2.3.ocmod.xml) - может конфликтовать с SEO мультиязык, где также есть подобный функционал.


      /* v1.2
      ----------------------------------------- */
      Версия не была опубликована, так как сразу же началась работа над следующей версией
      - Добавлена генерация мета-тегов для производителей


       
       
    • От femmill
      Всем привет!
      Кто подскажет как вывести на страницу категорий описание товара с html тегами?
      <?php echo $product['description']; ?> выводит просто текст в абзаце, необходимо вывести с теми же тегами при заполнении товара.
      версия ocStore 2.3.0.2
    • От muha777
      Здравствуйте Друзья!
       
      1) Подскажите пожалуйста, если шаблонно добавить description для всех страниц, нормально это? (тоесть текст будет один а название категории и товара в описании будет отличаться)
      2) Если так можно, то сколько шаблонных текстов должно быть на сайт с 15 тыс товаром? (примерное хотя бы количество шаблонов и для каких страниц)
       
       
       
         
  • Последние посетители   0 пользователей онлайн

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