Klaus

[Решено?..] Обрезка описания товара, с сохранением целостности слов

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

Klaus    2

Описание товара перед выводом в карточку товара на странице категории обрезается вот этим кодом

utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, 90) . '..'



однако при этом обрезаются слова (описание может обрываться на полуслове), что не очень красиво и правильно.
Хотелось бы сделать так чтобы слова не обрезались, т.е. обрезка текста происходила по пробелу. (можно вообще не буквы считать, а пробелы, и по, скажем 5му, пробелу обрезать текст)

Наверняка можно  красиво это решить.
 

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


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

Можно, но проще это решить через short_description (при вменяемом количестве товаров)

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


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

Можно, но проще это решить через short_description (при вменяемом количестве товаров)

То есть делать отдельное описание для вывода на странице категорий? Ил что имеется в виду?

 

Не понял к чему это

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


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

Я подобное уже находил в инете, но мне не совсем понятно, как это применить. Функция utf8_substr уже создана в OC, поидее её бы подправить. Но  вот не могу понять, где эта функция лежит.

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


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

Я подобное уже находил в инете, но мне не совсем понятно, как это применить. Функция utf8_substr уже создана в OC, поидее её бы подправить. Но  вот не могу понять, где эта функция лежит.

У Вас какая версия движка?

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


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

У Вас какая версия движка?

 

1.5.6.4

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


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

Функция utf8_substr уже создана в OC, поидее её бы подправить. Но  вот не могу понять, где эта функция лежит.

А откуда вы её в первое сообщение скопировали?

 

Тут она:

/catalog/controller/product/category.php

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


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

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

взять хотябы пример, на который дал ссылку sv2109  выше - там сколько строк, чтобы функцию описать? а у нас всё в одной строке

Изменено пользователем afwollis

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


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

Нет, это вся функция и есть.

 

Можно ещё вот так сделать.

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


Ссылка на сообщение
Поделиться на другие сайты
afwollis    1 091
Klaus, в utf8-helper`e.

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


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

Задача решена исправлением (а точнее заменой) функции utf8_substr
Сама функция находится в system/helper/utf8.php примерно 17строка (спасибо OC Team - подсказал где искать)

Находим функцию:

function utf8_substr($string, $offset, $length = null) {
			return mb_substr($string, $offset, utf8_strlen($string));
		} else {
			return mb_substr($string, $offset, $length);
		}
	}

и заменяем её полностью на:

function utf8_substr($string, $offset, $length = null, $etc = '...',
								  $break_words = false, $middle = false) {
	if ($length === null)
		return '';

	if (strlen($string) > $length) {
		$length -= strlen($etc);
		if (!$break_words && !$middle) {
			$string = preg_replace('/\s+?(\S+)?$/', '', mb_substr($string, 0, $length+1));
		}
		if(!$middle) {
			return mb_substr($string, 0, $length).$etc;
		} else {
			return mb_substr($string, 0, $length/2) . $etc . mb_substr($string, -$length/2);
		}
	} else {
		return $string;
	}
}

Функцию я сам не разрабатывал (я не программист и в php ничего не смыслю). Взял готовый вариант в интернете на php форуме и немного подправил его с учётом используемых в OC терминов.

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

Не забываем убрать лишнее многоточие в контроллере, там где применена данная функция (в моём случае в контроллере категорий)

Тему можно закрыть

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


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

Какие сложности :)

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

Первой строкой обрезали, чтобы было "не более чем", второй - убрали возможные обрезки справа до первого пробела.

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


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

Вышла лажа. Из за правки файла system/helper/utf8.php перестал работать загрузчик файлов.

Вот такой глюк. причём такая картина во всех папках. Вернул на родину функцию utf8_substr - загрузчик фоток заработал в штатном режиме. Т.е. они как-то связанны получается.

post-20654-0-66438400-1453548153_thumb.jpg

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


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

Можно считать что решено.
Я оставил функцию utf8_substr без изменения.
А ту функцию о которой я писал выше я переименовал в myutf8_substr. Т.е. в файле system/helper/utf8.php сразу после функции utf8_substr я добавил другую функцию

    function myutf8_substr($string, $offset, $length = null, $etc = '...',
    								  $break_words = false, $middle = false) {
    	if ($length === null)
    		return '';
     
    	if (strlen($string) > $length) {
    		$length -= strlen($etc);
    		if (!$break_words && !$middle) {
    			$string = preg_replace('/\s+?(\S+)?$/', '', mb_substr($string, 0, $length+1));
    		}
    		if(!$middle) {
    			return mb_substr($string, 0, $length).$etc;
    		} else {
    			return mb_substr($string, 0, $length/2) . $etc . mb_substr($string, -$length/2);
    		}
    	} else {
    		return $string;
    	}
    }

Затем в контроллере категорий, там где для описания применяется функция utf8_substr, я просто вместо utf8_substr написал myutf8_substr и удалил многоточие

В принципе меня такое решение устраивает. Теперь если мне нужно будет где-то ещё подработать функцию utf8_substr, я просто в контроллере заменю её на myutf8_substr

Блин по 10 раз одно и тоже написал :oops:

Всех благодарю. Тему можно закрывать как решённую!

Изменено пользователем Klaus

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


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

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

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

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

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

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

Войти

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

Войти


  • Последние посетители   0 пользователей онлайн

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