В этой статье я раскажу как создать и использовать "кастомный" макрос, который будет обрезать нужное нам поле по определенному количеству символов до последнего пробела, не обрезая тем самым слова посередине.
Бывают ситуации когда стандартного поля анонс не хватает, это возникает по многим причинам, например вам нужны разные анонсы для разных страниц, а создавать кучу полей не хочется. Или поле вам нужно одно но в него все равно могут вписать очень длинный анонс, который не вписывается в дизайн. Причин может быть много, но цель одна - обрезать значение поля по нужному количеству символов. Если вы используете шаблонизатор XSLT, то наверняка знаете, там есть функция substring(), но у нее есть несколько недостатков, во-первых она обрезает на середине слова и более существенный недостаток, что она "режет" html-теги. В результате чего может поехать верстка или еще чего хуже. Так что у нас есть единственный вариант - "кастомный макрос". Ниже я приведу код макроса и поясню параметры.
public function getTeaser($elementId, $lenght = 75, $field_name = 'anons') {
$hierarchy = umiHierarchy::getInstance();
$element = $hierarchy->getElement($elementId);
$teaser = $element->getValue($field_name);
$teaser = strip_tags($teaser);
$teaser = mb_substr($teaser, 0, mb_strrpos(mb_substr($teaser, 0, $lenght, 'utf-8'), ' ', 'utf-8'), 'utf-8');
return $teaser;
}
Параметры:
$elementId: id элемента(страницы) для которой нужно создать анонс.
$lenght: длина возвращаемого текста, может получится немного меньше т. к. функция обрезает до пробела, по умолчанию "75".
$field_name: имя поля в котором находится текст, по умолчанию "anons" - поле анонса в элементе "новости".
Функция вернет нам обрезанную строку, не превышающую заданную длину, обрежет по пробелу, а не посередине слова.
Добавляем ее в файл "/classes/modules/custom.php"
Использование в xslt:
<xsl:value-of select="document(concat('udata://custom/getTeaser/', @id, '/100/anons'))/udata" />
Использование в tpl:
%custom getTeaser('%id', 100, 'anons')%