суббота, 11 декабря 2010 г.

Обрезаем названия материалов в видах

snippet_1_0

Обрезаем названия материалов в списках views

Вы создали новый вид (с помощью модуля views), который выводит список название всех материалов Вашего сайта в виде ссылок. Однако нередко названия бывают очень длинными, что может не вписываться в дизайн Вашего сайта. Для этого есть решение и в рамках модуля views, но как часто бывает не все нюансы могут быть решены в рамках модуля.

Чтобы обрезать самые длинные названия материалов в Вашем виде, необходимо создать новый шаблон views:

Перейдите на вкладку "Изменить вид" странице /admin/build/views/edit/test) и нажмите кнопку "Theme: Information”.

Views предоставляет нам список возможных шаблонов для данного вида, которые можно использовать. Нас, прежде всего, интересует шаблон, который отвечает за вывод самого списка названий материалов. Это шаблон views-view-field--test--title.tpl.php. Создаем одноименный файл в папке темы Вашего сайта. В нем прописываем следующий код:

<?php
// $Id: views-view-field.tpl.php,v 1.1 2008/05/16 22:22:32 merlinofchaos Exp $
/**
  * This template is used to print a single field in a view. It is not
  * actually used in default Views, as this is registered as a theme
  * function which has better performance. For single overrides, the
  * template is perfectly okay.
  *
  * Variables available:
  * - $view: The view object
  * - $field: The field handler object that can process the input
  * - $row: The raw SQL result that can be used
  * - $output: The processed output that will normally be used.
  *
  * When fetching output from the $row, this construct should be used:
  * $data = $row->{$field->field_alias}
  *
  * The above will guarantee that you'll always get the correct data,
  * regardless of any changes in the aliasing that might happen if
  * the view is modified.
  */
?>

<?php print $output; ?>

Теперь, когда шаблон готов, мы можем изменять конечное отображение нашего вида.

Наш список названий материалов выводиться через переменную

<?php print $output; ?>

Чтобы обрезать конечное отображаемое пользователям название материалов, мы используем функцию truncate_utf8, изменив код в шаблоне views-view-field--test--title.tpl.php на следующий:

<?php
$output
= truncate_utf8($output,25,FALSE,TRUE);
print
$output;
?>

Однако, хотя это будет работать хорошо, если список названий будет отображаться просто как текст, а не как ссылки на соответствующие материалы. названия просто (не-Link) текст.

Это происходит потому, что функция truncate_utf8 подсчитывает длину всей строки, в том числе и HTML, а не только тот текст который мы видим на экране. Например, следующее название материала будет обрезано некорректно

<a href="/node/1" title="My Test Page With A Really Really Really Really Really Really Really Really Really Really Really Really Really Really Long Title" alt="My Test Page With A Really Really Really Really Really Really Really Really Really Really Really Really Really Really Long Title">My Test Page With A Really Really Really Really Really Really Really Really Really Really Really Really Really Really Long Title</a>

После обрезания текста:

<a href="/node/1" tit ...

В целях успешной процедура усечения названия, мы должны сделать так, чтобы функция truncate_utf8 обрезала только конечный текст, не трогая html код. Мы можем сделать это, используя следующий код в наш новый шаблон:

<?php
$title
= strip_tags($output); //title (no tags)
$title_trunc = truncate_utf8($title,25,FALSE,TRUE); //title (no tags) truncated
$output = str_replace($title,$title_trunc,$output); //new link
print $output;
?>

Таким образом мы добились нужного результата и наш список названий имеет одинаковую длину, а все длинные названия материалов корректно обрезаются.

Оригинал статьи: http://www.startdrupal.com/node/145