Когда то давно писал эти плагины для своего сайта. Но ему не удалось воплотиться в реальность. Возможно эти плагины пригодятся и вам. Найдут применение не только в Smarty.
1. При нахождении в в тексте определенного тега, происходит вывод текста только до этого тега.
Так как текст на входе может содержать html-теги, то также происходит запись всех тегов в массив, с последующим удалением тех тегов, что не нуждаются в закрытии, либо уже закрытых. Также есть возможность задавать текст ссылки. Может пригодится при выводе новостей, статей и прочего.
<?php
/**
* Smarty modifier plugin
* Function: read more
* Truncates a string after teg <anchor>habracut</anchor>, optionally taking into account HTML tags.
*
* Parameters:
* $text - String to shorten.
* $ending - What to place at the end, e.g. "...".
* $html - Auto-close cut-off HTML tags?
*
* Author:
* becon,Russia, 2009
*
*/
function smarty_modifier_readmore( $text, $url , $ending = 'Read more', $html = true)
{
if (!is_string($text) or !is_string($url) or !preg_match("/<cut>/", $text)) {
return $text;
} else {
$text = substr($text,0,strpos($text, '<cut>'));
if (is_array($ending))
extract($ending);
if ($html) {
$openTags = array();
preg_match_all("/(<\/?([\w+]+)[^>]*>)?([^<>]*)/", $text, $tags, PREG_SET_ORDER);
foreach ($tags as $tag) {
if (!preg_match('/img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param/s', $tag[2])
and preg_match('/<[\w]+[^>]*>/s', $tag[0]))
array_unshift($openTags, $tag[2]);
elseif (preg_match('/<\/([\w]+)[^>]*>/s', $tag[0], $closeTag)) {
$pos = array_search($closeTag[1], $openTags);
if ($pos !== false)
array_splice($openTags, $pos, 1);
}
}
foreach ($openTags as $tag)
$text .= '</'.$tag.'>';
}
$text .= '<a href='.$url.'class="read_more">'.$ending.'</div>';
return $text;
}
}
?>
2.Правильные окончания у множественных форм слов.
К примеру: 3 комментария, 5 комментариев. В интернете существует много вариаций на эту тему, но в то время было интересно это сделать самому.
<?php
/**
* Smarty modifier plugin
*
* Type: modifier<br>
* Example: {$var|plural:'штука':'штуки':'штук'}
* если $var =1, то выводится штука
* если $var =2, то выводится штуки
* если $var =6, то выводится штук
* и так для любой числовой переменной и слова(к примеру:литр пива,литра пива,литров пива)
* вроде подходит и для украинских слов
* Date: 22 Май , 2009
* @author becon
* @version 1.0
* @param string
* @param string
* @return string
*/
function smarty_modifier_plural( $count, $form1, $form2, $form3)
{
$count = str_replace (' ', '', $count);
if ($count > 10 && floor(($count % 100) / 10) == 1) {
return $form3;
} else {
switch ($count % 10) {
case 1: return $form1;
case 2:
case 3:
case 4: return $form2;
default: return $form3;
}
}
}
?>
Писалось давно, приведено немного в порядок при использовании вместе с Twig.