ImageCache: простое размещение картинки в произвольном месте

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

Аватар пользователя Lex-DRL Lex-DRL 16 ноября 2009 в 22:23

Погуглил и поикал по форуму, но решения так и не нашёл.

Задача проста: размещать картинки, обработанные ImageCache, не общей кучей в конце, а поодиночке в любом месте страницы.
Может, есть какой простой токен типа [image=1 align=right], который позволял бы указывать, какую картинку куда вставлять?
Используются: Drupal 6, FileField, ImageField, ImageCache.

Пока что я вижу несколько решений, но все они - жуткие извращения с filefield.
Есть вариант с использованием представлений и Insert View, но это извращение ещё хлеще, да и нагрузка из-за вьюшек дико возрастёт.

Я просто не могу понять, зачем вообще нужен ImageCache (тем более, почему он так популярен), если созданные им картинки никак нельзя расположить на странице.
А альтернативу ImageCache я как-то не смог найти.

Комментарии

Аватар пользователя gumk gumk 16 ноября 2009 в 23:48

1) устанавливаете модуль , устанавливаете любой визивинг редактор, который поддерживает этот модуль
2) создаете поле imagefield, разрешаете загрузку нескольких изображений (при этом можно будет указать пресеты imagecache которые можно будет выбирать при вставке картинки, но я без imagecache в настройках поля указываю чтобы картинки обрезались при загрузки на ширину колонки с текстом)
3) ставим модуль ,этот модуль автоматом обрезает картинку до размеров, которые вы задали картинке в визивинг редакторе, не забываем добавить фильтр этого модуля в настройках фильтров.

Аватар пользователя Lex-DRL Lex-DRL 17 ноября 2009 в 1:42

Благодарю за ответы.

"volocuga" wrote:
Не умеете (облом) искать
http://drupal.org/node/163561[/quote]
Вообще-то, первым делом я полез в доки (в т.ч. англоязычные). По этой ссылке - объяснение работы с ImageCache, а не того, как вставлять созданные им картинки в произвольное место контента. Наверное, я не очень ясно поставил вопрос. Проблема - не в том, как настроить сам ImageCache (это элементарно), а в том, как сделать возможным свободное расположение на странице созданных им пар "превью-zoom on click".

gumk, отличный способ - возьму на заметку. Однако, в данном случае это всё же не совсем то, что нужно:

  • им невозможно вставить именно превью со ссылкой на полное изображение
  • через image_resize_filter возможно изменение размера - но вручную, а не по заданному шаблону (что нарушит "стандартность" отображания на сайте)
  • в дальнейшем всё это должно интегрироваться с LightBox, что с данным методом я не представляю, как реализовать
Аватар пользователя volocuga volocuga 17 ноября 2009 в 3:38

Понятно,сорри,не понял

Нашёл с первого раза это http://drupal.org/project/inline (не пробовал,но звучит как вам нужно)

Также люди для вставки картинок "inline" часто используют это http://drupal.org/project/img_assist

Я этими двумя штуками не пользуюсь,предпочитаю напрямую через fckeditor

Аватар пользователя gumk gumk 10 ноября 2015 в 11:46

>им невозможно вставить именно превью со ссылкой на полное изображение
есть ковыряйте внимательней настройи модуля image_resize_filter (если конечно нет не обходимости чтобы эти изображения были отдельной нодой)
>через image_resize_filter возможно изменение размера - но вручную, а не по заданному шаблону (что нарушит "стандартность" отображания на сайте)
при установленном insert при редактировании настроек поля можно указать чекбоксами, через какие пресеты imagecache можно вставлять изображения (смотри прикрепленный файл)
>в дальнейшем всё это должно интегрироваться с LightBox, что с данным методом я не представляю, как реализовать
пока он эта связка может интегрироваться с shoutbox, что не намного хуже LightBox, если есть желание и руки под LightBox не сложно переделать

скринкаст по этой теме http://mustardseedmedia.com/podcast/episode29

Аватар пользователя Lex-DRL Lex-DRL 17 ноября 2009 в 18:29

gumk,
Да, действительно, как оказалось, интеграция как с лайтбоксом, так и с любыми подобными возможна - это делается в настройках активированного фильтра image resize (там можно прописать атрибут rel).
Скриншот, что Вы показали - это настройки insert, а не image resize. Да, он может вставить уже отресайзеное изображение по шаблону от imagecache (я это и тогда понял) - однако это будет не пара "превью-ссылка на изображение", а просто превью. Соответственно, безо всякого лайтбокса. Чтобы было превью со ссылкой в лайтбоксе, надо вставлять оригинальную картинку, которую потом вручную ресайзить в визивиг-редакторе.

volocuga,
Да, это именно оно! Уже готов был памятник воздвигнуть Вам нерукотворный, да оказалось, что inline работает только с Upload (а Filefield и ImageField не видит).

Итого: связка Insert + Image Resize, к сожалению, не подходит, как ни крути.
Решение проблемы теперь видится только через Inline (либо то извращение с Insert View, до которого я сам додумался). Поэтому вопрос по-прежнему открыт, но тему имеет смысл продолжать здесь: http://www.drupal.ru/node/35393

Аватар пользователя Xermit Xermit 29 мая 2010 в 4:19

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

Вариант от gumk попробовал, но

Все эти модули типа insert и тот же tinyMCE и другие, вставляют тэг и определяют url в конечном варианте на момент вставки. Совершенно не предполагая, что сайт может менять свое местоположение, домен, пути, ставит абсолютную ссылку и все тут. Как вариант можете сказать что тогда делай каждое изображение как ноду, но это из пушки по воробьям (а то бы image_filter давно применил) или а не фиг типа каталоги двигать и так далее.

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

А все эти tinyMCE должны корректно видеть такие вставки и уметь их отрендерить сделав запрос к Drupal, а не отображать как есть. Плюс из wysiwyg редактора оперативно менять alt, title, preset как говорится у картинки. Но в чистом коде никаких [img]abosulte_url[/img] быт не должно.

Что нибудь типа:
[img]nid|synonym#number_images|md5,preset[/img]

Сейчас вот как раз читаю про Custom Filter -ы, там как раз пару примеров дано что можно просто регулярным выражением поймать такую вставку и выполнить свой php код, и думаю я скорее сам напишу php код, который по такому форматеру, запросит нужную картинку у imagecache, чем дождусь готового модуля. Ну и свой же javascript к tinyMCE придется прикрутить.

Аватар пользователя Xermit Xermit 29 мая 2010 в 4:44

Посмотрел на видео с image_resize_filter, и понимаю все что нужно, это чтобы
image_resize_filter и imagefield договорились о способе идентификации изображения, не по url или пути к файлу. Кстати, в image_resize_filter это почти сделано, они когда из вне картинку грузят, в качестве ключа используется url к картинке, вовремя рендернга они походу из бд вытягивают md5, чтобы знать что пресету скормить. А потом подставляет ссылку на пресет и все.
Но там все равно присутствует путь к файлу. Хотя понимаю что парни с image_resize_filter, почти сделали то что как раз мне нужно, жаль только идентификацию сделали по пути все таки. То есть из другой ноды мне придется ссылаться на картинку как files/trampampam, а вдруг путь изменится?
И даже в демо видно как все равно вставляют путь к изображению, а не просто выбрать уже загруженную картинку.

Теперь уже думаю что мне просто нужно свой фильтр написать который запуститься раньше фильтра
image_resize_filter Smile и подставит вместо ноды с идентификатором изображения полный путь к картинке, а потом уже путь image_resize_filter работает Biggrin

Аватар пользователя Xermit Xermit 29 мая 2010 в 5:25

Уря, я нашел что хотел Biggrin надо только будет осмыслить

дошел я на сайте друпала вот до этой страницы

http://drupal.org/node/342186

и до модуля Linodef http://drupal.org/project/linodef

Все что мне осталось сделать

это сказать чтобы применился фильтр Linodef к моему типу материала

и вставить вот такую строчку

[#340:field_image_cache:1,formatter="image_plain"]

собственно таким образом я сказал, что отобразить мне 2-й элемент (1-й с 0 начинается) поля field_image_cache из 340 ноды, через CCK форматтер image_plain, этот форматтер как раз поставляется с imagefield

кроме того сам этот форматтер является темизируемым да еще докучи внутри вызывает другую функцию
темизации imagefield_image

да и никто не запрещает написать свой cck форматтер, он ведь такой простой

function theme_imagefield_formatter_image_plain($element) {
  // Inside a view $element may contain null data. In that case, just return.
  if (empty($element['#item']['fid'])) {
    return '';
  }

  $field = content_fields($element['#field_name']);
  $item = $element['#item'];

  $item['data']['alt'] = isset($item['data']['alt']) ? $item['data']['alt'] : '';
  $item['data']['title'] = isset($item['data']['title']) ? $item['data']['title'] : NULL;

  $class = 'imagefield imagefield-'. $field['field_name'];
  return  theme('imagefield_image', $item, $item['data']['alt'], $item['data']['title'], array('class' => $class));
}

function theme_imagefield_formatter_image_nodelink($element) {
  // Inside a view $element may contain null data. In that case, just return.
  if (empty($element['#item']['fid'])) {
    return '';
  }

  $node = $element['#node'];
  $imagetag = theme('imagefield_formatter_image_plain', $element);
  $class = 'imagefield imagefield-nodelink imagefield-'. $element['#field_name'];
  return l($imagetag, 'node/'. $node->nid, array('attributes' => array('class' => $class), 'html' => TRUE));
}

заодно можно заставить картинку выводить хоть в lightbox наверное