Ruslan Brest, rb.labtodo.com

Разработка ПО, сайтов и веб-сервисов. CodeIgniter, PHP, MySQL, W3C CSS/XHTML, MaxSite CMS, OpenCart, PrestaShop

Изменяем длину описаний товаров в каталоге OpenCart 1.5.x

Опубликовано: 26 июля 2011.
Автор: Ruslan Brest.

Рубрика: Howto | OpenCart.

Просмотров: 2938.
Подписаться на комментарии по RSS.
Это решение также убирает "черные ромбики" и иероглифы в конце русских описаний товаров в каталоге. В других местах делается аналогично.
Вероятно, вас тоже удивляет, почему описания товаров, которые выводятся при просмотре каталога магазина, так бездарно и коротко обрезаются. Ведь даже в стандартном дизайне OpenCart v1.5 там могло бы поместиться ещё 2-3 таких же строки с весьма полезной информацией как для покупателя, так и для поисковых систем. Впрочем, и для внешнего вида стандартного шаблона польза немалая.

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

Вот как выглядит страница каталога с описаниями товаров до и после предлагаемой модификации:

Чтобы увеличить длину описаний товаров на страницах каталога, необходимо:

  1. Открыть файл catalog/controller/product/category.php
  2. найти поиском строку "substr" (она там одна, OpenCart v1.5.0.5 — 1.5.1.1). Вы увидите небольшой блок из десятка строчек, который начинается с $this->data['products'][] = array(. Перед этой строчкой вставляем 6 строк, приведённых ниже, сразу после этого списка;
  3. Найденную строку '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 (локальная копия файла)

Как сделать, чтобы слова не обрезались посередине

А как сделать чтобы слова не обрезались, а последнее слово дописывалось полностью?

Можно строку внутри { ... } заменить на две:

$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 или может через панель управления.

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru digg.com friendfeed.com liveinternet.ru livejournal.ru yandex.ru del.icio.us

Комментариев: 45

  1. 09.08.2011 в 22:21:00 | #1

    Здорово спасибо! А как сделать чтобы слова не обрезались, а последнее слово дописывалось полностью?:)

  2. Ruslan Brest
    10.08.2011 в 06:00:10 | #2

    Можно строку внутри { ... } заменить на две:

    $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') . ' …';

    Но это мало что даст для наведения красоты.

  3. 10.08.2011 в 09:48:22 | #3

    О классно!! Почему мало что даст? По крайней мере слова не обрезает! Спасибо!

  4. 11.08.2011 в 01:32:31 | #4

    Может если будет время напишешь статейку "как сделать чтобы в разных категориях был разный стиль оформления" :))))

  5. 11.08.2011 в 01:32:54 | #5

    "Но это мало что даст для наведения красоты." очень даже дает! Слова по крайней мере не режет!

  6. Ruslan Brest
    11.08.2011 в 10:45:34 | #6

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

    Навскидку - изменить 2 контроллера, product/category и product/product. Найти там место, где выбирается шаблон и добавить переключение по первому сегменту параметра path=61_67_xxx. Я так понимаю основная цель -- это визуально разделить категории первого уровня? Или остальные тоже интересуют?

  7. 29.08.2011 в 22:45:36 | #7

    Очень полезный пост, а не могли бы вы подсказать как переделать чтоб вместо описания товара в каталоге выводился определённый атрибут товара (краткое описание товара). Интересует для OpenCart 1.5.1 ?

    Заранее спасибо!

  8. Ruslan Brest
    30.08.2011 в 03:15:04 | #8

    Оформил в виде отдельной записи: http://rb.labtodo.com/page/show-attribute-as-description-on-product-category-opencart-15x

    Надеюсь, там всё понятно.

  9. stalker780
    28.10.2011 в 20:32:20 | #9

    Мож кому пригодится 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

  10. Ruslan Brest
    28.10.2011 в 21:26:23 | #10

    Спасибо, добавил в пост. Если против локальной копии - могу убрать.

  11. stalker780
    28.10.2011 в 22:02:49 | #11

    абсолютно не против, даже за

  12. 01.11.2011 в 13:39:33 | #12

    А что делать если в конце строк описания обрезает и на концах иероглифы...

  13. Ruslan Brest
    01.11.2011 в 14:02:02 | #13

    При использовании mbstring это невозможно. Скорей всего вы просто где-то пропустили: в html_entity_decode, strlen или substr. Везде надо применять их mb_ аналоги и указывать для надёжности кодировку.

  14. 01.11.2011 в 16:42:37 | #14

    забавно но решилось прямо противоположно... поменял: 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) . '...',

    а ни кто не пробовал выровнять по ширине т.е. чтобы от края до каря было ровно, а не рвано как сейчас, и чтобы не разрывало вконце слова...

  15. Николай
    03.11.2011 в 22:46:31 | #15

    Привет, Руслан! У меня возникла проблема в том, что не отображаются кириллические (русские) буквы в "Производители". Подробнее на скриншоте (http://i27.fastpic.ru/big/2011/1103/1c/ecb2e97ed31a0f714b446b74c180e81c.png).

  16. Ruslan Brest
    04.11.2011 в 03:51:28 | #16

    Да, было там такое. В 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');

    }

  17. Николай
    04.11.2011 в 07:30:49 | #17

    Огромное спасибо! Дай Бог тебе здоровья, Руслан! Все получилось, дальше буду смотреть, где это выльется ;)

  18. Ruslan Brest
    04.11.2011 в 10:17:49 | #18

    Спасибо :)

  19. 23.11.2011 в 08:50:36 | #19

    Подскажите пожалуйста как сделать для opencart 1.5.1 чтоб в категории в описании товаров под картинкой отображалось наличие товара (есть в наличии или доступен под заказ...)

  20. Ruslan Brest
    23.11.2011 в 12:46:22 | #20

    Написал отдельным постом: http://rb.labtodo.com/page/opencart-151-vyvod-informacii-o-nalichii-pod-kartinkoj-v-kataloge-tovarov

  21. 12.12.2011 в 15:11:56 | #21

    Добрый вечер, очень хороший и нужный у вас сайт - спасибо! Есть такой вопрос: сложно ли будет сделать в списке заказов индикацию в виде заполнения определенным цветом строки обработанного заказа при изменении статуса? Например, ставим статус "выполнено" в "истории заказа" и в списке заказов вся строка выделяется зеленым цветом, а при изменении статуса на "отказ" - красным ну и так далее.

  22. Ruslan Brest
    12.12.2011 в 16:10:39 | #22

    У меня так и сделано - http://rb.labtodo.com/uploads/opencart15/oc151-admin-color-order-status.png

    В других местах статусы отображаются аналогично

    Красить всю строку не получится (связано с гораздо большими переделками). Описывать - сейчас не смогу, занят. Там надо увеличить длину поля в базе, там же их разукрасить (т.е. не редактировать через админку - в ней не предусмотрено, что там HTML коды будут, и не пройдёт валидацию).

  23. 12.12.2011 в 20:05:36 | #23

    Появился очередной вопрос)

    Можно сделать, чтоб описание не выходило за грань цены, то есть, чтоб под ценником не выводились строки а переносились строго до него,а то как-то не эстетично?

  24. Ruslan Brest
    12.12.2011 в 20:29:59 | #24

    Конечно. Но всё это уже определяется вёрсткой и стандартного рецепта поэтому быть не может. В одной теме надо так делать, в другой по-другому и т.п. Это больше к верстальщикам вопросы, я этой темой мало занимаюсь.

    Посмотрите на второй скриншот, там где цены серой рамкой обведены. Там в принципе есть все ответы для стандартной темы: можно просто этот блок в длину повыше сделать, чтобы большинство укороченных описаний заканчивались раньше, чем этот блок. Ну или уже по-другому переверстывать страницу, чтобы текст описания в своем прямоугольном блоке выводился.

  25. 12.12.2011 в 20:42:53 | #25

    спасибо, большое

  26. access
    28.12.2011 в 15:31:03 | #26

    спасибо огромное за статейку, очень помогла на 1,5,1,3. на офф форуме как рыбы молчат. думал двиг другой уже искать.

  27. 13.01.2012 в 17:35:03 | #27

    Не получилось сделать( Стоит Shoppica менял и в ней и в стандартном файле, не вышло.(

  28. Ruslan Brest
    13.01.2012 в 19:04:32 | #28

    Arkoval, к Шоппике и темам вообще ни один файл не имеет отношения. Это всё в контроллерах меняется. Так что где-то совсем не там вы меняли.

  29. 18.01.2012 в 03:45:50 | #29

    Все переделал. У меня в каких-то описаниях есть квадраты, в каких-то нет, от чего зависит, не понимаю.

    http://screenshotuploader.com/s/0wbXTsQx3LD

  30. Ruslan Brest
    18.01.2012 в 13:15:48 | #30

    По скриншоту понятно, что именно 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 или может через панель управления.

  31. 18.01.2012 в 13:42:38 | #31

    Спасибо! Добавил и раскомментил все значения, все сразу стало как надо.

  32. Ruslan Brest
    18.01.2012 в 13:58:54 | #32

    Отлично. Просто этот вариант не универсален и не везде может быть применен, поэтому забываю про него дописать.

  33. 18.01.2012 в 20:10:57 | #33

    Оказывается, что стало не все гладко. С самим сайтом, все окей, но теперь с письмами беда. От письма приходит только тема вот в таком виде:

    =?UTF-8?B?TXVzY2xlIEJybyAtINC30LDQutCw0Lcg0L7QsdC90L7QstC70LXQvSAxMQ==?=

    в .htaccess открывал и закрывал #

    Если строка # php_value mbstring.func_overload 7 - раскомменчена, то на сайте все хорошо а с письмом беда, и наоборот если закомменчена, с письмами все ок, а с описаниями проблема..

  34. Ruslan Brest
    18.01.2012 в 22:12:19 | #34

    Измените 7 на 6

  35. 18.01.2012 в 22:15:14 | #35

    Руслан, большое спасибо Вам за помощь!

  36. 12.02.2012 в 13:17:34 | #36

    Подскажите, пожалуйста, как сделать выравнивание описания не по левому краю, а по ширине области

  37. Ruslan Brest
    12.02.2012 в 13:58:58 | #37

    Стилем "text-align: justify;", но вообще-то всё может очень сильно зависеть от конкретной верстки. Это лучше к более опытным верстальщикам адресовать.

  38. Николай
    18.03.2012 в 16:17:28 | #38

    Всем привет. Скажите плиз а как добавить артикул рядом где обрезанный текст?

    ----

    http://rb.labtodo.com/page/opencart-151-catalog-pokaz-sku-v-spiske-tovarov-productcategory#comment-753 (комментарий #15).

  39. 06.05.2012 в 20:16:30 | #39

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

    В featured.tpl так

  40. 06.05.2012 в 20:22:24 | #40

    Не получается код отправить. Как побороть не в описаниях, а в названиях товаров эту проблему?

  41. Ruslan Brest
    06.05.2012 в 20:44:05 | #41

    Версия какая? В v1512 в featured вообще нет строковых функций (а если так, то проблема с названиями или уже в базе или на этапе отображения - может tpl сохранили не в UTF8. Или UTF8, но с BOM-сигнатурой). А в 1513 давно уже исправили эти проблемы.

  42. 06.05.2012 в 21:06:40 | #42

    Дело в том что шаблон Gecco Shop и там в category.tpl и featured.tpl есть такие строки

    ?php if( strlen( $product['name'] ) < 28

    echo $product['name'];

    else { echo substr( $product['name'],0,25 )."...";

    Не знаю как исправить... (

  43. Ruslan Brest
    06.05.2012 в 21:21:45 | #43

    ВЕРСИЯ КАКАЯ? От этого зависит ответ. Ещё ответ зависит от того, есть ли на сервере поддержка mbstring.

    В любом случае - попробуйте сначала то, что описано в последней секции поста ("Как можно исправить проблему с ромбиками/иероглифами/вопросиками проще, не меняя многие файлы?").

    Если не получится и версия Опенкарт -- 1.5.1.3 и выше, можно дописать "utf8_" к строковым ф-циям (utf8_strlen, utf8_substr).

  44. 06.05.2012 в 21:30:55 | #44

    Версия 1.5.2.1. На сервере поддержка mbstring установлена и оверлоад строковых функций включен. Пробовал все делать, не получается.

    Вот только дописать "utf8_" к строковым ф-циям (utf8_strlen, utf8_substr)еще осталось. Не подскажите, где это надо дописывать?

  45. 06.05.2012 в 21:34:43 | #45

    Спасибо большое! Все получилось. Последним вариантом. Благодарю!

Оставьте комментарий!

Гость
Комментатор / хотите им стать

Чтобы стать комментатором, введите email и пароль. Напишите комментарий. В дальнейшем ваша связка email-пароль позволит комментировать, получать уведомления об ответах и редактировать свои данные. Не забудьте про активацию (инструкция придёт на email, указанный при регистрации).

Авторизация: Facebook. MaxSiteAuth. Loginza

(обязательно)