Пытаюсь сделать красивый вывод анонсов и ничего не получается.
С помощью views сделал вывод:
Стиль - "Без форматирования"
Стиль строки - "Поля"
Вывожу поля "Материал-заголовок", "Материал -Фото" (поле ССК) и "Матреиал -Аннотация".
В поле "Материал - Аннотация" пришлось средствами views сделать обрезку до 160 символов, потому как в Друпале в "настройках публикации" минимально можно установить 200, а мне это много. Но это к моему вопросу скорее всего не относится.
При таком выводе выводится только аннотация, а ссылки "читать далее" просто нет. Сделать ее (например из повторного вывода поля "Материал - Заголовок" проблем не вызывает, но как сделать, чтобы она показывалась, только в том случае когда анонс меньше, чем содержимое?
И второй самый главный вопрос - как сделать, чтобы это поле выводилось не с новой строки, а сразу после текста анонса?
Комментарии
Самый простой способ - в 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, который будет производить сравнение прямо в базе, ибо загружать все материалы, при том, что вы их даже не показываете, - не очень хорошая идея с точки зрения производительности.
Можно поставить обрезание на 160 символов вместо 200 напрямую в базе в таблице variables, строка teaser_length.
Спасибо, проэкспериментирую, но как я понял увы этот параметр считает тупо все символы ХТМЛ в тексте ноды, а мне хотелось бы не все, а реально отображаемые, а то одна ссылка в тексте и размер вывода получается кардинально меньше. Как обойти это вроде понял, но обрезать все равно придется в таком случае не от анонса, а от полного текста.
Спасибо!
а можно поподробнее для новичка пошагово)?
Для новичков есть тип вывода node. Я сам, хоть уже и не новичек, после всех экспериментов с fields для "лент" анонсов материалов вернулся к его использованию. Это на порядок проще, чем переписывать интеграции всех модулей, которые вставляют контекстные ссылки в links к анонсам. И потеря производительности в данном случае оправдана.