CMS Eleanor - Поиск
Полная версия этой страницы: Официальный форум Eleanor CMS » Дополнения в класс Strings
Официальный форум Eleanor CMS » Поддержка пользователей системы Eleanor CMS » Секреты и советы
Easy-Web
Шалом други!
Хочу поделиться новыми фичами для класса Strings (не белье)

1. Модификация функции CutStr которая отрезает от текстового блока начальный кусок фиксированных размеров.
Как известно, в UTF8 она режет некрасиво несмотря на использование функций для многобайтных кодировок. В месте отреза появляется нечитаемый символ. Да и некрасиво, когда разрез происходит посреди слова. Мой вариант этой функции режет только в конце слова, на которое выпадает первоначальное место разреза, определяемое переменной $cnt :

	public static function CutStr($str,$cnt=30,$end='...')
	{
		if(mb_strlen($str)>$cnt)
		{
			$str=preg_replace('#[&<][^;>]*$#','',$str);
			$prevlimit = $cnt;
			while (($prevlimit+100> $cnt) and (mb_substr($str,$cnt,1) != ' ')) {
				$cnt++;
			}
			$str=mb_substr($str,0,$cnt).$end;
		}
		return $str;
	}


Функцию нужно вставить вместо прежней в файл class_strings.php вызывается она следующим образом

Strings::CutStr( ТЕКСТ, ЧИСЛО СИМВОЛОВ ОГРАНИЧЕНИЯ, СТРОКА ВСТАВЛЯЮЩАЯСЯ В КОНЦЕ ОБРЕЗКИ)




2, Далее функция наподобие HumanDate но которая возвращает не абсолютную а относительную человекоподобную дату, например "чуть более минуты назад", "час назад", "три дня назад" и т.п.

	public static function RelativeDate($time_value='') {
	$time_stamp = strtotime($time_value);
		$delta=time()-$time_stamp;
	    if ($delta < 60) {
	        return 'минуту назад';
	    } elseif ($delta < 120) {
	        return 'чуть более минуты назад';
	    } elseif ($delta < (45 * 60)) {
	        $declOfNum = self::declOfNum(($delta / 60), array(' минуту назад ', ' минуты назад', ' минут назад'));
	        return intval($delta / 60).$declOfNum;
	    } elseif ($delta < (90 * 60)) {
	        return 'примерно час назад';
	    } elseif ($delta < (24 * 60 * 60)) {
	        $declOfNum = self::declOfNum(($delta / 3600), array(' час назад ', ' часа назад', ' часов назад'));
	        return intval($delta / 3600).$declOfNum;
	    } elseif ($delta < (48 * 60 * 60)) {
	        return 'вчера';
	    } else {
	        $declOfNum = self::declOfNum(($delta / 86400), array(' день назад ', ' дня назад', ' дней назад'));
	        return intval($delta / 86400).$declOfNum;
	    }
	}
	protected static function declOfNum($number, $titles) {
		$cases = array(2, 0, 1, 1, 1, 2);
		return $titles[($number % 100 > 4 && $number % 100 < 20) ? 2 : $cases[($number % 10 < 5) ? $number % 10 : 5]];
	}


вторая функция "declOfNum" требуется для служебных целей.

Все это хозяйство помещается в файл class_strings.php и вызывается следующим образом Strings::RelativeDate( ДАТА ) где ДАТА в виде "ГГГГ-ММ-ДД ЧЧ:ММ:СС"







Easy-Web
Фигасе никому не надо???
KeSSLeR
Easy-Web, надо. Через неделю - две комунить до понадобится.
Alexander
Easy-Web, благодарю, полезные внедрения. Думаю, найдутся те, кто обязательно воспользуется Вашими трудами.
Loader
Easy-Web , спасибо!
Мне лично очень пригодилось взамен substr.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.