Teaser Image: автоматическая генерация изображения для тизера

Пусть первый запустит в меня клавиатурой тот, кто заявит, что никогда не мучил свой мозг вопросом оформления и вывода «превьюхи» к тизерам/анонсам статей сайта. Более того, возму на себя так же наглость утверждать, что и сам внешний вид веб-сайта - на 90%(ну фиг с ним - 80) вид анонсов статей, выводимых списком в том или ином месте страницы. Модуль, презентуемый в данной публикации, есть мой вариант решения озвученной задачи.

Давно собираясь раз и навсегда избавить голову от забот о картинках к тизерам путем написания своего модуля «с нуля», совершенно случайно наткнулся на уже готовый и «отрелизенный» код. Говорю я о модуле Teaser Thumbnail, что скромно «заныкался» в «запасниках» сокровищницы drupal.org.

Teaser Thumbnail почти полностью соответствовал моим пожеланиям и нуждам. Почти... Вот что меня в нем точно не устраивало, так это его «железная» привязка к ImageCache. Который, в свою очередь, ни разу «не заведется» без установки еще двух: ImageAPI и Transliteration. Итого - аж четыре модуля для решения одной единственной, несложной, в принципе, задачки. Той, что вполне и полностью решаема встроенным функционалом ядра Drupal. Втройне несерьезно, если «капризный» и непредсказуемый при взаимодействии с Nginx`ом ImageCache нам для других целей или модулей более не нужен вовсе.

Предвижу «справедливые аргументы», что, мол «ImageCache один из самых популярных модулей Drupal`а, наравне с тем же Views». Или де «тумбы элементарно генеряться «элегантной» связкой CCK->FileField->ImageField->ImageCache(с довесками)->Views». Что я на это отвечу? Флаг вам, ребята, в каждую руку и котомку с пайком за плечи, данная публикация не для вас. Мне было бы вобще странно узнать, что написанное на drupalka.ru читают люди, выбравшие стиль общения с движком - «Drupal - это Views, мегасайт на Drupal - Views с дополнениями... ». Может оно так и есть, но мне предпочтительней метод, когда поставленная задача выполняется все ж одним инструментом, а не целой их связкой одновременно. Тем, кому моя философия хоть сколько-нибудь близка, предлагаю вернуться к основной теме, заявленной заголовком.

Teaser Image - «модифицированный» Teaser Thumbnail

Суть модификации состояла в изменении нескольких функций, относящихся к обработке изображений ImageCache`ем. Теперь генерация «превьюх» происходит с помощью «Drupal's image toolkits» - встроенным в ядро CMS инструментарием для взаимодействия оной с графическими библиотеками PHP: GD или ImageMagic. Библиотеки эти, естественно, должны быть включены в конфигурацию PHP вашего сервера и задействованы.

Были добавлены пара-тройка новых настраиваемых параметров и удалены некоторые, сочтенные за «ненужные». Поддержка Views так же была адаптирована с учетом новых обработчиков. В остальном - весь прежний видимый конечному пользователю и админам функционал Teaser Thumbnail оставлен без серьезных изменений. Новое имя модуль получил дабы избежать возможной путаницы в будущем.

Ну и самое «изюмное»: для полноценной и стабильной(косяков покуда не обнаружено) работы модуль требует ныне лишь самого себя, Drupal`а и включенных на сервере GD/ImageMagic-библиотек. И в топку кузнеца все «левые обвесы».

Что делает модуль

Автоматическая генерация уменьшенных копий картинок для тизера происходит во время сохранения новой ноды или изменения уже существующей.

Скрипт «ищет» изображения по заданным настройками параметрам в теле публикации. Первая найденная картинка, соответствующая требованиям, уменьшается(пропорционально или с обрезкой) и сохраняется в той же папке, что и изображение-донор, под тем же именем, но с дополнительной приставкой-суффиксом.

При изменении или удалении публикации, «неактуальные» сгенерированные «превью» удаляются. При необходимости создаются новые.


Установка и настройка модуля

Установка стандартная - путем копирования папки модуля в соответствующую директорию на сервере. В списке модулей на странице администрирования ищите в наборе Общие/Разное.

Настраивается работа модуля глобально и отдельно для каждого типа материала. Основные настройки производятся на странице admin/settings/teaserimage, доступной после включения модуля.

Страница основных настроек модуля

Тут мы настраиваем:

  • добавляемую к имени файла приставку(первое поле настроек). По умолчанию - _tthumb;
  • метод обработки изображения: изменять размер пропорционально или уменьшать и обрезать под заданный размер, по-умолчанию - второе;
  • размеры будущего изображения для тизера: задается цифрами через x, по-умолчанию - 100х100;
  • минимальная ширина и высота изображения в теле ноды, которое будет считаться подходящим для обработки, изначально поля ввода параметров данных - пусты;

Страница основных настроек модуля Teaser Images.

Страница настроек модуля для каждого типа материала

Генерация изображений для тизеров изначально отключена. Включается поддержка данного функционала отдельно для каждого типа материала на странице настроек нужного типа. После включения модуля там появляется новая группа изменяемых параметров - Teaser Image.

На странице редактирования типа публикации так же возможно задать для каждого конкретного типа свои собственные настройки, переписывающие для него установки глобальные (admin/settings/teaserimage).

Индивидуально для каждого типа задается:

  • стоит ли использовать файл(ы)-аттачмент(ы) к ноде в качестве исходных, для последующей генерации превью, файлов;
  • позиция отображения при показе тизера: «перед текстом», «после» и «не отображать»(если выводить сгенерированную картинку вы планируете самостоятельным вызовом в шаблоне ноды;
  • надо ли делать изображение тизера ссылкой на «полный» текст публикации;
  • прикреплять ли сгенерированное превью к выдаче RSS-канала сайта;
  • выравнивание картинки (атрибут align тега IMG);

Настройки модуля Teaser Images на странице редактирования типа материала.

Dalay

Комментарии

Сейчас попробуем :)

Transliteration вовсе не обязателен, а ImageCache обычно используется не только для превьюшек, но и для других целей. Что ж посмотрим, попробуем.

:) кто ж спорит та, как без него

Смотрел последнюю дев-версию IC, Transliteration там обязателен. Ну да фиг с ним, вы еще наверное не попадали в ситуацию, когда c nginx у IC веселье начинается, а доступа к конфигу сервера у владельца сайта нет, например на шареде.

Посмотрела 6.x-2.x-dev, да, там действительно нужен Transliteration и это обидно, так как этот довесок мне совсем не нужен. :(

Нет, таких проблем у меня с IC не было, у меня админ сервера отзывчивый. :)

:) а если его вообще не ставить, то и других не будет.

P.S.: собираетесь на d.org выкладывать?

Нафига, «мопед не мой, я просто разместил обьяву...»
Да и насколько наслышан о репозиторной бюрократии - тот еще геморрой.

Спасибо. Нужен был подобный модуль, не думал даже что существует в природе. Очень пригодился. Радует что работает с Views.

Спасибо! Очень пригодился. Teaser Thumbnail после всех обновлений стал глючить.

Отличный модуль. Можно было бы еще задавать горизонтальные / вертикальные отступы картинки было бы вообще супер!

А CSS на что?

Каким образом например?

Я хоть и отношу себя к тем кто считает, что "«тумбы элементарно генеряться «элегантной» связкой CCK->FileField->ImageField->ImageCache(с довесками)->Views»", т.к. в моей сборке это стандартный набор модулей, но в любом случае еще одно полезное решение не помешает.

может все-таки выложите на drupal.org ?
не хочется чтобы такой хороший модуль неожиданно перестал поддерживаться.

Работает ли данный модуль на Drupal 6?
Вроде установил - выставил основные настойки и настройки для типов материала. После сохранения ноды с картинкой ничего не происходит - обрезанная картинка с суффиксом не создается =( Может подскажете где копать?
И еще вопросик: можно-ли модуль заставить генерировать тизеры для уже созданных нод?

Для шестерки и написан.
Заочно ничего не могу советовать, много чего может быть. Кэш чистили? Крон запускали?
Можно, если пересохранить.

Спасибо, действительно дело было в кроне.
А можно-ли как-нибудь автоматически пересохранить порядка тысячи материалов?

Попробуй таблицу cache_filter очистить, может и без пересохранения прокатит.

Если не поможет, то кодом:

$result = db_query("SELECT nid FROM {node}");
set_time_limit(0);
while ($current_node = db_fetch_array($result)) {
  node_save(node_load($current_node["nid"]));
}

Вот только бы сервак не накрылся белой тряпкой в процессе выполнения... )

Все получилось, код помог. Пришлось выполнять по частям добавив в запрос BETWEEN, дабы слабенькая vds'ка справлялась.
Правильно ли я понимаю, что вывод тизера в ноде осуществляется функцикей theme_teaserimage_thumbnail($node)?

Вывод тизера в ноде осуществляется функциями ядра. Если имелось ввиду «вывод изображения в тизере», то да, этой. Точнее будет сказать, что она «темизирует» вывод имаджа. По дефолту определять ее в ручную не обязательно, отображение тизер-пикчей устанавливается в настройках каждого из существующих на сайте типов нод.

Если же хочется поизвращаться, то грамотней юзать ее(функцию) с атрибутами, иначе смысла в извращениях сих мало.

Пример использования в файле node.tpl.php шаблона (просто пример для понимания сути):

<?php
   $thumbnail = theme('teaserimage_thumbnail', $node, array('class' => 'я_пикчин_класс', 'align' => 'left', 'title'=>'я_пикчин_тайтл'));
if (!empty($thumbnail)) :
?>

<div class="teaserimage">
   
<?php  
   print l($thumbnail, 'node/'. $node->nid, array('attributes'=>array('class'=>'teaserimage', 'title'=>'Читать полностью публикацию: '. $node->title), 'html' => TRUE));
?>

</div>

<?php endif; ?>

Ну и если используется «ручной» вывод, то надобно отключить дефолтовое отображение пикчи в настройках типов/типа. Иначе будут красоваться в тизере две картинки.

Как подружить Teaser Image и Node Image? Картинка с суффиксом не создается в папке определенной для Node Image вида images/[nid].

Никак. Соболезную.

а как связать views и тизеримидж?

Модуль Teaser Image: подключение в модуле Views.

да, спасибо, уже сделал так. но вылезла проблема
warning: Missing argument 4 for _teaserimage_create_thumbnail(), called in /home/site/public_html/site.ru/sites/all/modules/teaserimage/views/views_handler_field_teaserimage.inc on line 53 and defined in /home/site/public_html/site.ru/sites/all/modules/teaserimage/teaserimage.module on line 310.

попробуйте в файле teaserimage.module (строка 310) поменять:

function _teaserimage_create_thumbnail($preset, $path, $alt = '', $suffix, $attributes) {

на

function _teaserimage_create_thumbnail($preset, $path, $alt = '', $suffix = variable_get('teaserimage_thumb_suffix', '_tthumb'), $attributes) {

извиняюсь, в файле teaserimage.module, верхний коммент поправил

сейчас попробую

после данного изменения сайт ушел в down

oleg, мои экстрасенсорные способности на данном этапе исчерпаны

ах да забыл написать, что проблема не только в 4, но и в 5 аргументе, т.е. в суффиксе и атрибутах...

смотрите логи ошибок друпала, там должны быть все ответы

Привет, не могу понять, почему не работает Ваш модуль. И крон запускал и кеш чистил и в настройках и общих и конкретно материала всё включено.
Может ли это быть из-за того, что картинки к статье у меня подгружаются в CKEditor через IMCE? И файлы складываются в отдельные папки каждого пользователи, т.е. в file/user1, file/user5 и т.д.
Если в этом проблема, то нельзя ли слегка переделать модуль, чтобы он картинки складировал в специальную для него папку?
Спасибо за ответ.

по первому пункту:
http://www.drupalka.ru/node/96#comment-371

по второму:
http://www.drupalka.ru/service-and-prices

Я другой Олег :)
И всё же, модуль работает при добавлении картинок через IMCE с расположением их в папках file/user1, file/user5 ?

Суть работы модуля состоит в том, что при сохранении ноды им «ищется» картинка(в теге img) определенных размеров(настраивается в админке модуля) в тексте, и при нахождении таковой генериться ее превью с сохранением в той же папке, но с префиксом. В какую папку заливаются пикчи, как и то, чем они заливаются, модулю перпендикулярно.

Проверьте права на папки. Если с правами все ок, то корень проблемы ищите в работе визивига, точнее в том, как он обрабатывает ноду при сохранении.

проблему с модулем teaserimage.module вкупе с вьюсами так к сожалению и не поборол. просто оключил вывод системных сообщений. т.е. суть отрабаывается нормально, но эти сообщения жить просто мешают :) эх, знал бы пхп сам бы поковырял... так то суть работы модуля мне очень нравится.
но вот возникла еще проблемка но уже на другом сайте. заливаю картинку в статью, превьюха формируется, н опроблема в том, что модуль не создает новую картинку с префиксом, а перезаписывает старую, что мне кажется в корне не верным. хотя настройки все те же самые стоят что и на другом сайте. казалось бы, при одинаковых настройках по разному работает модуль. подскажите куда смотреть?

Смотрите конфигурацию и настройки сервера, может там причина, мне же эмулировать ошибки ваши не удается.

ну сайты на одном серваке и настройки для них одинаковые. я уже смирился с ошибками в 53 и 310 строке, мне теперь не дает покоя настройка которая использует исходное изображение и сохраняет превьюху с имененм исходного изображения. а файл с суффиксом не создается. хотя повторюсь и настройки тизер имиджа одинаковые как глобальные так и в типах материалов. и на серваке права одинаковые на папки. м.б. проблема во вьюсах? на первом сайте я вьюсы не использую поэтому м.б. превьюха с суфиксом создается? а на втором вывод через вьюсы.
или м.б. дело в скедиторе? ну у меня на обоих сайтах скедитор, только релизы немного отличаются...

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

ужос ))

ну так почему же при создании записи перезаписывается существующая картинка к которой применяются свойства превьюхи а не создается новая превьюха?

у меня точно такая же проблема: перезаписывается существующая картинка к которой применяются свойства превьюхи

Без «доступа к телу» понять в чем проблема не смогу. Пришлите адрес сайта хотя бы в личку.

Ещё вчера хотел зарегиться, но все ходят "без проверки", и я не стал выделяться :)
Адрес сайта никакой не секрет, но эксперименты проводил на Денвере. Сегодня начал, очень осторожно, переносить ваш модуль на живой сайт. Предполагаю конфликт с какими-то модулями, которых я понаставил в Денвере туеву кучу. Поэтому переношу только минимум...

Существующую картинку всё равно портит, зато (наконец-то!), создаёт превью с расширением.
Вообще-то готов дать вход в админку, в надежде, что наконец-то удастся сдвинуться с мёртвой точки :(
На самом деле хочу сделать простую вещь: что б при клике на превью
(в выводе Новость3 (кот. формирую в соответствующем вьюсе)),
показывало полную картинку. На том же месте, и без каких-либо извратов - просто исходную картинку, как она задана пользователем...

__s-horoscope.ru/

) Что значит «портит»?

Касательно пункта про «простую вещь»: это действительно простая вещь, модуль же решает совсем иные вопросы.

) Что значит «портит»?
это значит: вместо исходной картинки, размером, например в 30Кб, 250х500, записывает превью - 100х100, размером 3 Кб., и меняет размер файла, естественно. Качество картинки (разрешения и пропорции) - естественно убиваются.
да задача наверняка очень простоя, её смысл - не заставлять пользователя указывать адреса превью и вообще даже думать о превью.
В моём случае я могу только надеяться, что пользователь, в лучшем случае, закачает нужную картинку и нажмёт кнопку вставить. Разговоры о каких-то превью - лишние, это всё сайт должен делать.

Я теряю нить нашего диалога. Зачем что-то указывать конечному пользователю, если настройки отображения превью заданы нужным образом в опциях для типа материала?

Насчет перезаписи имаджа да, надо разобраться, что за хрень, скиньте в приват доступ в админку и к фтп.