Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


Recommended Posts

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

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



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

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

Надіслати
Поділитися на інших сайтах


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

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

 

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

Надіслати
Поділитися на інших сайтах


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

Надіслати
Поділитися на інших сайтах


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

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

Надіслати
Поділитися на інших сайтах


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

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

 

Тут она:

/catalog/controller/product/category.php
Надіслати
Поділитися на інших сайтах

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

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

Змінено користувачем afwollis
Надіслати
Поділитися на інших сайтах


Задача решена исправлением (а точнее заменой) функции 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 терминов.

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

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

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

Надіслати
Поділитися на інших сайтах


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

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

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

Надіслати
Поділитися на інших сайтах


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

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

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

Надіслати
Поділитися на інших сайтах


Можно считать что решено.
Я оставил функцию 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
  • +1 1
Надіслати
Поділитися на інших сайтах


  • 3 years later...
В 23.01.2016 в 22:09, Klaus сказал:

Можно считать что решено.
Я оставил функцию 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:

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

 

на os 2.3 не пошло. 

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.