Jump to content

Recommended Posts

Здравствуйте. А есть ли возможность обрезать текст по количеству символов, но до точки?

Хочу products.tpl отобразить часть описания товара, но без обрезки на самом интересном.

Сейчас:

Наши раскладушки - самые раскладушные. Выпускаются в 4-х цветах: чёрном, белом, красном и зелёном. Производитель - известная...

Хочу:

Наши раскладушки - самые раскладушные. Выпускаются в 4-х цветах: чёрном, белом, красном и зелёном.

 

Насколько я понял, нужно писать свою функцию для smarty, не так ли?

Link to post
Share on other sites

http://www.smarty.net/docs/en/language.modifier.truncate.tpl
 

where template is:

{$articleTitle}
{$articleTitle|truncate}
{$articleTitle|truncate:30}
{$articleTitle|truncate:30:""}
{$articleTitle|truncate:30:"---"}
{$articleTitle|truncate:30:"":true}
{$articleTitle|truncate:30:"...":true}
{$articleTitle|truncate:30:'..':true:true}
 

This will output:

Two Sisters Reunite after Eighteen Years at Checkout Counter.
Two Sisters Reunite after Eighteen Years at Checkout Counter.
Two Sisters Reunite after...
Two Sisters Reunite after
Two Sisters Reunite after---
Two Sisters Reunite after Eigh
Two Sisters Reunite after E...
Two Sisters Re..ckout Counter.
 

Link to post
Share on other sites

{$product->description|strip_tags|truncate:150} где 150 кол-во символов, или используйте краткое описание для вывода текста в списке товаров.

Link to post
Share on other sites

Оба ответа - мимо.

Как видно из темы, я и так использую модификатор truncate, который к решению задачи никак не подходит. На выходе получаю неосмысленный текст. Мне нужно обрезать текст без использования truncate, строго до точки (например, два предложения)

Link to post
Share on other sites

Оба ответа - мимо.

Как видно из темы, я и так использую модификатор truncate, который к решению задачи никак не подходит. На выходе получаю неосмысленный текст. Мне нужно обрезать текст без использования truncate, строго до точки (например, два предложения)

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

Не понимаю ваших методов усложнения.

Link to post
Share on other sites

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

Не понимаю ваших методов усложнения.

Лень.

Link to post
Share on other sites

Вот моё решение.

modifier.trim.php

<?php
function smarty_modifier_trim($string, $length = 80, $etc = '.')
{
    if ($length == 0)
        return '';
    if (is_callable('mb_strlen')) {
        if (mb_detect_encoding($string, 'UTF-8, ISO-8859-1') === 'UTF-8') {
            // $string has utf-8 encoding
            if (mb_strlen($string) > $length) {
                $length -= min($length, mb_strlen($etc));
                $string = preg_replace('/\s+?(\S+)?$/u', '', mb_substr($string, 0, $length + 1));
				$string = substr ($str, 0, strrpos($str, $etc)+1);
            } else {
                return $string;
            } 
        } 
    } 
    // $string has no utf-8 encoding
    if (strlen($string) > $length) {
        $length -= min($length, strlen($etc));
        $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length + 1));
		$string = substr ($str, 0, strrpos($str, $etc)+1);
    } else {
        return $string;
    } 
} 

?>

Пример использования:

{$category->description|strip_tags|trim:280}

Link to post
Share on other sites

Такое решение сократит описание категории до 280 символов, затем найдёт последнюю точку с конца и удалит всё, что после неё.

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

Link to post
Share on other sites
  • 3 years later...
  • 4 months later...

А я пытался найти решение как обрезать не по количеству символов, а по количеству слов..
Чтоб например можно было брать только первое слово.
но не нашёл.. видимо такой нет функции в truncate 

Link to post
Share on other sites

если первое слово - то можно что то типа такого:

{$words = ' '|explode:($my_string|trim)}
Первое слово: {$words[0]}
 
если хотите что то универсальней, то лучше сделать отдельную функцию для smarty.
Можете эту взять https://gist.github.com/darryl-snow/3817802
 
 
если не хотите отдельную функцию делать - то можете воспользоватся ф-ми php.
Вам поможет: explode array_slice implode,  регулярные выражения(если знаете)
 
так же может быть полезна функция smarty: count_words (считает количество слов)
 
 
Link to post
Share on other sites

 

если первое слово - то можно что то типа такого:

{$words = ' '|explode:($my_string|trim)}
Первое слово: {$words[0]}
 
если хотите что то универсальней, то лучше сделать отдельную функцию для smarty.
Можете эту взять https://gist.github.com/darryl-snow/3817802
 
 
если не хотите отдельную функцию делать - то можете воспользоватся ф-ми php.
Вам поможет: explode array_slice implode,  регулярные выражения(если знаете)
 
так же может быть полезна функция smarty: count_words (считает количество слов)
 
 

Благодарю за наводку и примеры.

Буду разбираться..

Link to post
Share on other sites
  • 8 months later...

Друзья, а как сократить количество символов в свойствах товара, в данном коде:

<td>{if {$compare_products.{$product->id}.{$f.id}}}{$compare_products.{$product->id}.{$f.id}}{else}-{/if}</td>

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

Спасибо!

Link to post
Share on other sites

Друзья, а как сократить количество символов в свойствах товара, в данном коде:

 

<td>{if {$compare_products.{$product->id}.{$f.id}}}{$compare_products.{$product->id}.{$f.id}}{else}-{/if}</td>

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

Спасибо!

Для начала распечатайте результат и скиньте сюда, вот вам в помощь:

{$compare_products.{$product->id}.{$f.id}|print_r}

Ведь не известно что у вас там хранится в массиве.

Link to post
Share on other sites

 

Для начала распечатайте результат и скиньте сюда, вот вам в помощь:

{$compare_products.{$product->id}.{$f.id}|print_r}

Ведь не известно что у вас там хранится в массиве.

Спасибо за ответ.

В данном случае добавляет "1" ко всем строкам

Link to post
Share on other sites

 

Для начала распечатайте результат и скиньте сюда, вот вам в помощь:

{$compare_products.{$product->id}.{$f.id}|print_r}

Ведь не известно что у вас там хранится в массиве.

Ваша подсказка помогла ))

{$compare_products.{$product->id}.{$f.id}|strip_tags|truncate:70}
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...