YiiConf 2017 всё ближе! Не забудьте купить билет.

Расширяем CFormatter

Задача

Расширить CFormatter, таким образом: при выводе длинных предложений
наш фильтр резал текст и на выходе отдавал 5 первых слов с добавлением многоточия.

Вступление

В том же GridView или DetailView мы частенько задаём тип поля, например:
'type' => 'raw', 'type' => 'text' и т.д.

Для GridView это может выглядеть так:

array(
	'name' => 'text',
	'type' => 'raw',
),

Для DetailView так:

array(
	'label' => 'Email',
	'value' => ' email@email.com',
	'type' => 'email',
	'template' => "<tr class=\"{class}\"><th>{label}</th><td>{value}</td></tr>\n"
),

Но, в основном, используется типы такие, как: raw, email, image да url.

Решение

В папке protected/components создадим новый файл CCFormatter.php с содержимым:

<?php
class CCFormatter extends CFormatter {
	public $numOfWords = 5;

	public function formatTtext($value) {
		$value = CHtml::encode($value);

		$lenBefore = strlen($value);

		if($this->numOfWords){
			if(preg_match("/\s*(\S+\s*){0,$this->numOfWords}/", $value, $match)){
				$value = trim($match[0]);
			}
			if(strlen($value) != $lenBefore){
				$value .= ' ...';
			}
		}

		return $value;
	}
}

В файл config/main.php секцию components добавим три строчки:

'format' => array(
	'class' => 'application.components.CCFormatter'
),

После всех этих несложных манипуляций проверим работоспособность в CDetailView:

array(
	'label' => 'Текст',
	'value' => 'Lorem Ipsum - это текст-"рыба", часто используемый в печати и
				вэб-дизайне. Lorem Ipsum является стандартной "рыбой" для
				текстов на латинице 	с начала XVI века.',
	'type' => 'ttext',
	'template' => "<tr class=\"{class}\"><th>{label}</th><td>{value}</td></tr>\n"
),

Стоит изучить


  • Автор: Сергей Жолобов, Xpycm (monoray.ru).