Ссылка "Читать далее"

Главные вкладки

Аватар пользователя Alex_R Alex_R 7 мая 2010 в 17:47

Пытаюсь сделать красивый вывод анонсов и ничего не получается. Sad
С помощью views сделал вывод:
Стиль - "Без форматирования"
Стиль строки - "Поля"

Вывожу поля "Материал-заголовок", "Материал -Фото" (поле ССК) и "Матреиал -Аннотация".

В поле "Материал - Аннотация" пришлось средствами views сделать обрезку до 160 символов, потому как в Друпале в "настройках публикации" минимально можно установить 200, а мне это много. Но это к моему вопросу скорее всего не относится.

При таком выводе выводится только аннотация, а ссылки "читать далее" просто нет. Сделать ее (например из повторного вывода поля "Материал - Заголовок" проблем не вызывает, но как сделать, чтобы она показывалась, только в том случае когда анонс меньше, чем содержимое?

И второй самый главный вопрос - как сделать, чтобы это поле выводилось не с новой строки, а сразу после текста анонса?

Комментарии

Аватар пользователя Crea Crea 7 мая 2010 в 18:10

Сделать ее (например из повторного вывода поля "Материал - Заголовок" проблем не вызывает, но как сделать, чтобы она показывалась, только в том случае когда анонс меньше, чем содержимое?

Самый простой способ - в View выводить и аннотацию и полный материал, а потом в preprocess функции для row template сравнивать значения этих полей, и вставлять в аннотацию ссылку, если надо.

И второй самый главный вопрос - как сделать, чтобы это поле выводилось не с новой строки, а сразу после текста анонса?

Можно взять модуль Read More и использовать его функцию обработки. Правда, гораздо лучше использовать node стиль вывода. Он хоть и тормознее, но зато все функции работают из коробки.

Ниже мой пример. Подразумевается, что эта функция вставляется в ваш модуль под названием custom, и ваш View содержит оба поля - и анонс и полный материал.

<?php
function custom_preprocess_views_view_fields(&$variables, $hook) {
if ($variables['view']->base_table == 'node') {
$nid = $variables['row']->nid;
// Place Read More link into teaser field.
if (isset($variables['fields']['body']->content)
&& isset($variables['fields']['teaser']->content)
&& module_exists('ed_readmore')
&& variable_get('ed_readmore_placement', ED_READMORE_PLACEMENT_DEFAULT) == 'disable'
&& strlen($variables['fields']['body']->content) > strlen($variables['fields']['teaser']->content)) {
// Construct pseudo node for the ed_readmore module.
$node = new stdClass;
$node->nid = $nid;
$node->content['body']['#value'] = &$variables['fields']['teaser']->content;
$variables['fields']['teaser']->content = ed_readmore_link_place($variables['fields']['teaser']->content, $node, $display);
}

}
}
?>

Предупреждаю - это "неправильный способ", ибо он по сути обманывает модуль Read More подсовывая ему псевдо-ноду. Правильнее будет написать свою аналогичную функцию. А самый лучший способ (но и самый сложный) - написать специальный Views handler, который будет производить сравнение прямо в базе, ибо загружать все материалы, при том, что вы их даже не показываете, - не очень хорошая идея с точки зрения производительности.

Аватар пользователя Alex_R Alex_R 8 мая 2010 в 13:37

edhel wrote:
Можно поставить обрезание на 160 символов вместо 200 напрямую в базе в таблице variables, строка teaser_length.

Спасибо, проэкспериментирую, но как я понял увы этот параметр считает тупо все символы ХТМЛ в тексте ноды, а мне хотелось бы не все, а реально отображаемые, а то одна ссылка в тексте и размер вывода получается кардинально меньше. Как обойти это вроде понял, но обрезать все равно придется в таком случае не от анонса, а от полного текста.
Спасибо!

Аватар пользователя MaximumofmaX MaximumofmaX 17 мая 2011 в 14:05

"Crea" wrote:
Самый простой способ - в View выводить и аннотацию и полный материал, а потом в preprocess функции для row template сравнивать значения этих полей, и вставлять в аннотацию ссылку, если надо.

а можно поподробнее для новичка пошагово)?

Аватар пользователя Crea Crea 17 мая 2011 в 18:16

MaximumofmaX wrote:
"Crea" wrote:
Самый простой способ - в View выводить и аннотацию и полный материал, а потом в preprocess функции для row template сравнивать значения этих полей, и вставлять в аннотацию ссылку, если надо.

а можно поподробнее для новичка пошагово)?

Для новичков есть тип вывода node. Я сам, хоть уже и не новичек, после всех экспериментов с fields для "лент" анонсов материалов вернулся к его использованию. Это на порядок проще, чем переписывать интеграции всех модулей, которые вставляют контекстные ссылки в links к анонсам. И потеря производительности в данном случае оправдана.