tet Posted June 30, 2014 Report Share Posted June 30, 2014 Здравствуйте. А есть ли возможность обрезать текст по количеству символов, но до точки?Хочу products.tpl отобразить часть описания товара, но без обрезки на самом интересном.Сейчас:Наши раскладушки - самые раскладушные. Выпускаются в 4-х цветах: чёрном, белом, красном и зелёном. Производитель - известная...Хочу:Наши раскладушки - самые раскладушные. Выпускаются в 4-х цветах: чёрном, белом, красном и зелёном. Насколько я понял, нужно писать свою функцию для smarty, не так ли? Quote Link to post Share on other sites
osben Posted June 30, 2014 Report Share Posted June 30, 2014 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 afterTwo Sisters Reunite after---Two Sisters Reunite after EighTwo Sisters Reunite after E...Two Sisters Re..ckout Counter. Quote Link to post Share on other sites
Noxter Posted June 30, 2014 Report Share Posted June 30, 2014 {$product->description|strip_tags|truncate:150} где 150 кол-во символов, или используйте краткое описание для вывода текста в списке товаров. Quote Link to post Share on other sites
tet Posted June 30, 2014 Author Report Share Posted June 30, 2014 Оба ответа - мимо.Как видно из темы, я и так использую модификатор truncate, который к решению задачи никак не подходит. На выходе получаю неосмысленный текст. Мне нужно обрезать текст без использования truncate, строго до точки (например, два предложения) Quote Link to post Share on other sites
tet Posted June 30, 2014 Author Report Share Posted June 30, 2014 Лучше здесь пишите. Quote Link to post Share on other sites
Noxter Posted June 30, 2014 Report Share Posted June 30, 2014 Оба ответа - мимо. Как видно из темы, я и так использую модификатор truncate, который к решению задачи никак не подходит. На выходе получаю неосмысленный текст. Мне нужно обрезать текст без использования truncate, строго до точки (например, два предложения)Ну так что Вам мешает использовать в шаблоне вывод не полного а краткого описания товара с нужным текстом? Не понимаю ваших методов усложнения. Quote Link to post Share on other sites
Noxter Posted June 30, 2014 Report Share Posted June 30, 2014 Лучше здесь пишите.Здесь этот гражданин ничего толкового бесплатно не напишет. Quote Link to post Share on other sites
tet Posted June 30, 2014 Author Report Share Posted June 30, 2014 Ну так что Вам мешает использовать в шаблоне вывод не полного а краткого описания товара с нужным текстом?Не понимаю ваших методов усложнения.Лень. Quote Link to post Share on other sites
tet Posted June 30, 2014 Author Report Share Posted June 30, 2014 Вот моё решение.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} Quote Link to post Share on other sites
tet Posted June 30, 2014 Author Report Share Posted June 30, 2014 Такое решение сократит описание категории до 280 символов, затем найдёт последнюю точку с конца и удалит всё, что после неё.Вопрос у меня другой: как быть, если предложение оканчивается на знак вопроса или восклицательный знак? Тут без регулярных выражений не обойтись. Если кто сможет, подправьте код. Quote Link to post Share on other sites
Tetra Posted December 18, 2017 Report Share Posted December 18, 2017 И нихуя никто не смог. Quote Link to post Share on other sites
Noxter Posted December 18, 2017 Report Share Posted December 18, 2017 И нихуя никто не смог.Неадекватам тут не место, вон двери вон на**р P.S. Для слепых: решение в самом верху топика. Quote Link to post Share on other sites
Tetra Posted December 18, 2017 Report Share Posted December 18, 2017 Ишь какой дерзкий. Внимательней надо быть, никто код не исправил. Quote Link to post Share on other sites
Noxter Posted December 18, 2017 Report Share Posted December 18, 2017 Ишь какой дерзкий. Внимательней надо быть, никто код не исправил.Это ты резкий, дерзкий как понос мерзкий. Quote Link to post Share on other sites
madison21 Posted May 17, 2018 Report Share Posted May 17, 2018 А я пытался найти решение как обрезать не по количеству символов, а по количеству слов..Чтоб например можно было брать только первое слово.но не нашёл.. видимо такой нет функции в truncate Quote Link to post Share on other sites
yr4ik Posted May 17, 2018 Report Share Posted May 17, 2018 если первое слово - то можно что то типа такого: {$words = ' '|explode:($my_string|trim)} Первое слово: {$words[0]} если хотите что то универсальней, то лучше сделать отдельную функцию для smarty.Можете эту взять https://gist.github.com/darryl-snow/3817802 если не хотите отдельную функцию делать - то можете воспользоватся ф-ми php.Вам поможет: explode array_slice implode, регулярные выражения(если знаете) так же может быть полезна функция smarty: count_words (считает количество слов) Quote Link to post Share on other sites
madison21 Posted May 17, 2018 Report Share Posted May 17, 2018 если первое слово - то можно что то типа такого: {$words = ' '|explode:($my_string|trim)} Первое слово: {$words[0]} если хотите что то универсальней, то лучше сделать отдельную функцию для smarty.Можете эту взять https://gist.github.com/darryl-snow/3817802 если не хотите отдельную функцию делать - то можете воспользоватся ф-ми php.Вам поможет: explode array_slice implode, регулярные выражения(если знаете) так же может быть полезна функция smarty: count_words (считает количество слов) Благодарю за наводку и примеры.Буду разбираться.. Quote Link to post Share on other sites
daramal Posted January 24, 2019 Report Share Posted January 24, 2019 Друзья, а как сократить количество символов в свойствах товара, в данном коде: <td>{if {$compare_products.{$product->id}.{$f.id}}}{$compare_products.{$product->id}.{$f.id}}{else}-{/if}</td> Добавляю из того, что выше, ничего не происходит. Подскажите, пожалуйста.Спасибо! Quote Link to post Share on other sites
Noxter Posted January 24, 2019 Report Share Posted January 24, 2019 Друзья, а как сократить количество символов в свойствах товара, в данном коде: <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} Ведь не известно что у вас там хранится в массиве. Quote Link to post Share on other sites
daramal Posted January 25, 2019 Report Share Posted January 25, 2019 Для начала распечатайте результат и скиньте сюда, вот вам в помощь: {$compare_products.{$product->id}.{$f.id}|print_r}Ведь не известно что у вас там хранится в массиве.Спасибо за ответ.В данном случае добавляет "1" ко всем строкам Quote Link to post Share on other sites
daramal Posted January 25, 2019 Report Share Posted January 25, 2019 Для начала распечатайте результат и скиньте сюда, вот вам в помощь: {$compare_products.{$product->id}.{$f.id}|print_r}Ведь не известно что у вас там хранится в массиве.Ваша подсказка помогла )) {$compare_products.{$product->id}.{$f.id}|strip_tags|truncate:70} Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.