Изменяем длину описаний товаров в каталоге OpenCart 1.5.x
Это решение также убирает "черные ромбики" и иероглифы в конце русских описаний товаров в каталоге. В других местах делается аналогично.Вероятно, вас тоже удивляет, почему описания товаров, которые выводятся при просмотре каталога магазина, так бездарно и коротко обрезаются. Ведь даже в стандартном дизайне OpenCart v1.5 там могло бы поместиться ещё 2-3 таких же строки с весьма полезной информацией как для покупателя, так и для поисковых систем. Впрочем, и для внешнего вида стандартного шаблона польза немалая.
В основном, конечно, выигрывает посетитель сайта: уменьшается необходимость открывать каждый товар, а у владельцев магазина появляется возможность вынести в начало описания самую важную информацию и дать покупателю удобный способ просмотра основных характеристик похожих товаров уже на этапе ознакомления с ассортиментом, при навигации.
Вот как выглядит страница каталога с описаниями товаров до и после предлагаемой модификации:
Чтобы увеличить длину описаний товаров на страницах каталога, необходимо:
- Открыть файл catalog/controller/product/category.php
- найти поиском строку "substr" (она там одна, OpenCart v1.5.0.5 — 1.5.1.1). Вы увидите небольшой блок из десятка строчек, который начинается с $this->data['products'][] = array(. Перед этой строчкой вставляем 6 строк, приведённых ниже, сразу после этого списка;
- Найденную строку 'description' => ... заменяем на 'description' => $descr_plaintext,
В результате должно получиться:
$cut_descr_symbols = 400;
$descr_plaintext = strip_tags(html_entity_decode($result['description'],
ENT_QUOTES, 'UTF-8'));
if( mb_strlen($descr_plaintext, 'UTF-8') > $cut_descr_symbols )
{
$descr_plaintext = mb_substr($descr_plaintext, 0,
$cut_descr_symbols, 'UTF-8') . ' …';
}
$this->data['products'][] = array(
'product_id' => $result['product_id'],
'thumb' => $image,
'name' => $result['name'],
'description' => $descr_plaintext,
'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'])
);
Длина описания регулируется переменной $cut_descr_symbols. В зависимости от дизайна вам может потребоваться изменить эту величину.
Что исправлено:
- До модификации строки укорачивались до 100 символов. Описания длиной 300-500 символов выглядят гораздо лучше;
- символы ".." добавлялись даже к полностью поместившимся описаниям: сейчас символ заменён на HTML-ное троеточие и добавляется только к обрезанным описаниям;
- ну и mbstring, разумеется. Про которую англоязычные авторы часто забывают.
Аналогичным образом стоит сразу же изменить файлы:
- catalog/controller/product/search.php
- catalog/controller/product/special.php
- catalog/controller/product/compare.php
- catalog/controller/product/manufacturer.php
То есть найти похожие места (например, по строке "substr") и внести аналогичные изменения.
То же самое для VQmod / Opencart 1.5.1.3.1
- stalker780:
- Мож кому пригодится vqmod для 1.5.1.3.1 http://shop.clicker.com.ua/download/vqmod_product_long_description_1.0_oc_1.5.1.3.1.zip (локальная копия файла)
- Quickcheckout: как сделать необязательным поле email?
- Opencart 1.5.x (admin): показ в списке категорий их SEO Keyword
- OpenCart 1.5.1.x exploited (RFI)
- Opera: используем свои шрифты на неудобных сайтах
- Opencart 1.5.1.3 (admin): пара мелких улучшений Admin Dashboard
- Убираем ограничение 999.99 на вес и размеры в Opencart
- Улучшение поиска в OpenCart 1.5: поиск по описанию, подкатегориям, по модели и SKU
Как сделать, чтобы слова не обрезались посередине
А как сделать чтобы слова не обрезались, а последнее слово дописывалось полностью?
Можно строку внутри { ... } заменить на две:
$descr_plaintext = mb_substr($descr_plaintext, 0, $cut_descr_symbols, 'UTF-8'); $descr_plaintext = mb_substr($descr_plaintext, 0, mb_strripos($descr_plaintext, ' ', 0, 'UTF-8'), 'UTF-8') . ' …';
Не отображаются кириллические (русские) буквы в "Производители"
В версиях 1.5.х до 1.5.1.2 надо в файле catalog/controller/product/manufacturer.php найти строку
$key = '0 - 9';
и её окрестности (должно быть примерно в районе 35-40 строк). И изменить там 2 строки, чтобы результат был такой:
foreach ($results as $result) {
if (is_int(mb_substr($result['name'], 0, 1, 'UTF-8'))) {
$key = '0 - 9';
} else {
$key = mb_substr(mb_strtoupper($result['name'], 'UTF-8'), 0, 1, 'UTF-8');
}
Типичные проблемы, которые решаются этими правками
[...] когда я делаю длинные описания товара (превью описания в разделе) то в конце иногда появляются непонятные символы-иероглифы. [...]
Как можно исправить проблему с ромбиками/иероглифами/вопросиками проще, не меняя многие файлы?
Попробуйте в файл .htaccess в корне сайта вставить строки:
# php_value mbstring.internal_encoding UTF-8 # php_value default_charset UTF-8 # php_value mbstring.http_output UTF-8 # php_value mbstring.encoding_translation On # php_value mbstring.detect_order UTF-8 # php_value mbstring.func_overload 6
Они закомментированы (символ "#" в начале строки). Раскомментируйте их все (в идеале). Если возникнет ошибка - закомментируйте и пробуйте включать по одной строке. Ту, на которой возникает ошибка, оставьте закомментированной. Возможно, это поможет решить проблему проще и быстрее.
Просто не у всех хостеров это работает. Либо спросите в техподдержке, как этот код в .htaccess правильно указать и возможно ли это. У некоторых вместо php_value применяется php_admin_value, у кого-то запрещено совсем. А у кого-то это делается через php.ini или может через панель управления.






Комментариев: 45
Здорово спасибо! А как сделать чтобы слова не обрезались, а последнее слово дописывалось полностью?:)
Можно строку внутри { ... } заменить на две:
$descr_plaintext = mb_substr($descr_plaintext, 0, $cut_descr_symbols, 'UTF-8');
$descr_plaintext = mb_substr($descr_plaintext, 0, mb_strripos($descr_plaintext, ' ', 0, 'UTF-8'), 'UTF-8') . ' …';
Но это мало что даст для наведения красоты.
О классно!! Почему мало что даст? По крайней мере слова не обрезает! Спасибо!
Может если будет время напишешь статейку "как сделать чтобы в разных категориях был разный стиль оформления" :))))
"Но это мало что даст для наведения красоты." очень даже дает! Слова по крайней мере не режет!
Т.е. чтобы чайники выглядели так, а холодильники - иначе? Полностью тему переключить? Даже не задумывался над этим. Думаю, там всё просто. Записал, посмотрю (у меня сейчас много других забот, так что может не сразу).
Навскидку - изменить 2 контроллера, product/category и product/product. Найти там место, где выбирается шаблон и добавить переключение по первому сегменту параметра path=61_67_xxx. Я так понимаю основная цель -- это визуально разделить категории первого уровня? Или остальные тоже интересуют?
Очень полезный пост, а не могли бы вы подсказать как переделать чтоб вместо описания товара в каталоге выводился определённый атрибут товара (краткое описание товара). Интересует для OpenCart 1.5.1 ?
Заранее спасибо!
Оформил в виде отдельной записи: http://rb.labtodo.com/page/show-attribute-as-description-on-product-category-opencart-15x
Надеюсь, там всё понятно.
Мож кому пригодится vqmod для 1.5.1.3.1 http://shop.clicker.com.ua/download/vqmod_product_long_description_1.0_oc_1.5.1.3.1.zip
Спасибо, добавил в пост. Если против локальной копии - могу убрать.
абсолютно не против, даже за
А что делать если в конце строк описания обрезает и на концах иероглифы...
При использовании mbstring это невозможно. Скорей всего вы просто где-то пропустили: в html_entity_decode, strlen или substr. Везде надо применять их mb_ аналоги и указывать для надёжности кодировку.
забавно но решилось прямо противоположно... поменял: mb_substr на utf8_substr и все заработало нормально!
к стати прокатывает и вариант:
'description' => mb_substr( strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, 400, 'UTF-8') . '...',
Тоже работает... уж не знаю чем он лучше и лучше ли чем то что попробовал я :) т.е.:
'description' => utf-8_substr( strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, 400) . '...',
а ни кто не пробовал выровнять по ширине т.е. чтобы от края до каря было ровно, а не рвано как сейчас, и чтобы не разрывало вконце слова...
Привет, Руслан! У меня возникла проблема в том, что не отображаются кириллические (русские) буквы в "Производители". Подробнее на скриншоте (http://i27.fastpic.ru/big/2011/1103/1c/ecb2e97ed31a0f714b446b74c180e81c.png).
Да, было там такое. В 1.5.1.3 не смотрел (там вроде бы всё на свою ф-цию-аналог mbstring поменяли - подобные ошибки должны были исчезнуть), а в версиях 1.5.х до 1.5.1.2 надо в файле catalog/controller/product/manufacturer.php найти строку
$key = '0 - 9';
и её окрестности (должно быть примерно в районе 35-40 строк). И изменить там 2 строки, чтобы результат был такой:
foreach ($results as $result) {
if (is_int(mb_substr($result['name'], 0, 1, 'UTF-8'))) {
$key = '0 - 9';
} else {
$key = mb_substr(mb_strtoupper($result['name'], 'UTF-8'), 0, 1, 'UTF-8');
}
Огромное спасибо! Дай Бог тебе здоровья, Руслан! Все получилось, дальше буду смотреть, где это выльется ;)
Спасибо :)
Подскажите пожалуйста как сделать для opencart 1.5.1 чтоб в категории в описании товаров под картинкой отображалось наличие товара (есть в наличии или доступен под заказ...)
Написал отдельным постом: http://rb.labtodo.com/page/opencart-151-vyvod-informacii-o-nalichii-pod-kartinkoj-v-kataloge-tovarov
Добрый вечер, очень хороший и нужный у вас сайт - спасибо! Есть такой вопрос: сложно ли будет сделать в списке заказов индикацию в виде заполнения определенным цветом строки обработанного заказа при изменении статуса? Например, ставим статус "выполнено" в "истории заказа" и в списке заказов вся строка выделяется зеленым цветом, а при изменении статуса на "отказ" - красным ну и так далее.
У меня так и сделано - http://rb.labtodo.com/uploads/opencart15/oc151-admin-color-order-status.png
В других местах статусы отображаются аналогично
Красить всю строку не получится (связано с гораздо большими переделками). Описывать - сейчас не смогу, занят. Там надо увеличить длину поля в базе, там же их разукрасить (т.е. не редактировать через админку - в ней не предусмотрено, что там HTML коды будут, и не пройдёт валидацию).
Появился очередной вопрос)
Можно сделать, чтоб описание не выходило за грань цены, то есть, чтоб под ценником не выводились строки а переносились строго до него,а то как-то не эстетично?
Конечно. Но всё это уже определяется вёрсткой и стандартного рецепта поэтому быть не может. В одной теме надо так делать, в другой по-другому и т.п. Это больше к верстальщикам вопросы, я этой темой мало занимаюсь.
Посмотрите на второй скриншот, там где цены серой рамкой обведены. Там в принципе есть все ответы для стандартной темы: можно просто этот блок в длину повыше сделать, чтобы большинство укороченных описаний заканчивались раньше, чем этот блок. Ну или уже по-другому переверстывать страницу, чтобы текст описания в своем прямоугольном блоке выводился.
спасибо, большое
спасибо огромное за статейку, очень помогла на 1,5,1,3. на офф форуме как рыбы молчат. думал двиг другой уже искать.
Не получилось сделать( Стоит Shoppica менял и в ней и в стандартном файле, не вышло.(
Arkoval, к Шоппике и темам вообще ни один файл не имеет отношения. Это всё в контроллерах меняется. Так что где-то совсем не там вы меняли.
Все переделал. У меня в каких-то описаниях есть квадраты, в каких-то нет, от чего зависит, не понимаю.
http://screenshotuploader.com/s/0wbXTsQx3LD
По скриншоту понятно, что именно catalog/controller/product/category.php как раз не изменён правильно.
Попробуйте в файл .htaccess в корне сайта вставить строки:
# php_value mbstring.internal_encoding UTF-8
# php_value default_charset UTF-8
# php_value mbstring.http_output UTF-8
# php_value mbstring.encoding_translation On
# php_value mbstring.detect_order UTF-8
# php_value mbstring.func_overload 7
Они закомментированы (символ "#" в начале строки). Раскомментируйте их все (в идеале). Если возникнет ошибка - закомментируйте и пробуйте включать по одной строке и ту, на которой возникает ошибка, оставьте закомментированной. Просто не у всех хостеров это работает. Возможно, это проще и быстрее сможет решить проблему.
Если не получится - давайте адрес сайта и фтп доступ, посмотрю ближе к выходным. Либо спросите у техподдерки своего хостера, как этот код в .htaccess правильно указать и возможно ли это. У некоторых вместо php_value применяется php_admin_value, у кого-то запрещено. У кого-то это делается через php.ini или может через панель управления.
Спасибо! Добавил и раскомментил все значения, все сразу стало как надо.
Отлично. Просто этот вариант не универсален и не везде может быть применен, поэтому забываю про него дописать.
Оказывается, что стало не все гладко. С самим сайтом, все окей, но теперь с письмами беда. От письма приходит только тема вот в таком виде:
=?UTF-8?B?TXVzY2xlIEJybyAtINC30LDQutCw0Lcg0L7QsdC90L7QstC70LXQvSAxMQ==?=
в .htaccess открывал и закрывал #
Если строка # php_value mbstring.func_overload 7 - раскомменчена, то на сайте все хорошо а с письмом беда, и наоборот если закомменчена, с письмами все ок, а с описаниями проблема..
Измените 7 на 6
Руслан, большое спасибо Вам за помощь!
Подскажите, пожалуйста, как сделать выравнивание описания не по левому краю, а по ширине области
Стилем "text-align: justify;", но вообще-то всё может очень сильно зависеть от конкретной верстки. Это лучше к более опытным верстальщикам адресовать.
Всем привет. Скажите плиз а как добавить артикул рядом где обрезанный текст?
----
http://rb.labtodo.com/page/opencart-151-catalog-pokaz-sku-v-spiske-tovarov-productcategory#comment-753 (комментарий #15).
Подскажите пожалуйста! В шаблоне обрезаются ромбиками русские названия продуктов в рекомендованных и в каталоге тоже...
В featured.tpl так
Не получается код отправить. Как побороть не в описаниях, а в названиях товаров эту проблему?
Версия какая? В v1512 в featured вообще нет строковых функций (а если так, то проблема с названиями или уже в базе или на этапе отображения - может tpl сохранили не в UTF8. Или UTF8, но с BOM-сигнатурой). А в 1513 давно уже исправили эти проблемы.
Дело в том что шаблон Gecco Shop и там в category.tpl и featured.tpl есть такие строки
?php if( strlen( $product['name'] ) < 28
echo $product['name'];
else { echo substr( $product['name'],0,25 )."...";
Не знаю как исправить... (
ВЕРСИЯ КАКАЯ? От этого зависит ответ. Ещё ответ зависит от того, есть ли на сервере поддержка mbstring.
В любом случае - попробуйте сначала то, что описано в последней секции поста ("Как можно исправить проблему с ромбиками/иероглифами/вопросиками проще, не меняя многие файлы?").
Если не получится и версия Опенкарт -- 1.5.1.3 и выше, можно дописать "utf8_" к строковым ф-циям (utf8_strlen, utf8_substr).
Версия 1.5.2.1. На сервере поддержка mbstring установлена и оверлоад строковых функций включен. Пробовал все делать, не получается.
Вот только дописать "utf8_" к строковым ф-циям (utf8_strlen, utf8_substr)еще осталось. Не подскажите, где это надо дописывать?
Спасибо большое! Все получилось. Последним вариантом. Благодарю!