Кастомизация модуля Image

Что это за модуль такой и с чем его едят? И какие у него возможности?

Наверное любой, кто знаком с Drupal, хоть раз себе на локальном сервере и не только ставил этот модуль. Я не буду здесь переводить документацию, но просто расскажу об особенностях и удобстве этого модуля.

Входящие модули:

  • Image - собственно сам модуль image, который создает новый тип документа image, в котором появляется поле для загрузки изображения.
  • Остальные модули идут вместе с ним и представляют собой средства, расширяющие главный модуль.

  • Image Attach - Позволяет прикрепить одно изображение к любому документу любого типа. При этом если изображение, которое вы хотели бы показать в документе уже загружалось ранее, можно выбрать его по названию из выпадающего списка.
  • Image Gallery - Создает словарь Image Galleries, а галереи, которые вы создадите с помощью модуля, будут являться терминами этого словаря. То есть присутствует множественная вложенность. Галерея может содержать и фотографии, и другие галереи.
  • Image Import - Полезный модуль для массового создания документов типа image.
    1. Загружаете в папку files/image/import ваши фотографии (через FTP клиент),
    2. переходите на страницу Содержание → Импорт изображений,
    3. отмечаете те фотографии, которые хотите импортировать флажками (только не забудьте, а-то после того как вы введете названия и описания для каждой, но ничего не отметите, ваши усилия пропадут зря),
    4. редактируете заголовок и описание ваших фотографий,
    5. выбираете в какую галерею всех их поместить
    6. нажимаете на кнопку Импорт.

    Вот и все. В галерее появятся все эти фотографии, начиная с самой нижней (то есть нижняя в списке при импорте будет на самом верху в галерее)

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

Итак, что же мы хотим изменить в стандартных возможностях, предоставленных этими модулями?

  1. Конечно же, добавить ссылку на галерею у прикрепленного изображения. Мол, посмотреть это путешествие можно в такой-то галерее.
  2. Сделать сносное листание фотографий в рамках одной галереи. Без Ajax, конечно, но чтобы симпатично. Например, основная фотография по центру, а ниже: предыдущая в виду миниатюры слева и следующая в виде миниатюры справа.
  3. И чтобы было так: в дневнике прикрепленное изображение небольшого размера, а в галерее у всех фотографий максимальный размер, то есть чтобы посмотреть во всю ширину колонки каждый раз не приходилось жать на ссылку "Оригинал".

Не знаю, понятно ли я объяснила последний пункт, но вот что мы имеем в данном модуле по умолчанию:

Существует возможность настроить 3 размера для изображения. Все они хранятся в папке files/image:

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

Настроить их можно на странице Настройка → Изображение. Там же можно указать, показывать ли ссылки на другие размеры (три опции: Same Window, New Window и Hidden, что, соответственно, означает: Открывать в том же окне, Открывать в новом окне (это будет ссылка на файл JPG) или не показывать ссылку вообще.

Также есть возможность указать, в каком размере показывать фотографию в тизере и в полной ноде каждого типа документа, к которому вы прикрепляете изображения с помощью Image Attach. Для этой настройки пройдите на страницу Содержание → Типы документов и нажмите "редактировать".

Допустим, в тизере у нас будет Preview, в полной ноде тот же размер - Preview. Но мы хотим, чтобы при переходе по этой картинке в просмотр изображения в галерее нам показывался не Preview, а Original. И при листании изображении тоже всегда был Original. Стандартно это сделать нельзя. Модуль будет направлять вас на страницу с тем размером, который был в полной ноде. И при листании фотографий тоже будет одно Preview. Только ссылка Original даст возможность посмотреть полную версию фото.

Вот поэтому нужно заглянуть в код модуля Image, чтобы найти функцию вывода изображения и поменять значение на нужное вам.
795 строка файла image.module:

<?php
/**
* Theme a body
*/
function theme_image_body($node, $size) {
  return
image_display($node, $size);
}
?>

Что говорит нам эта функция? Что она отображает фотографию в заданном размере. То есть нам всего лишь нужно заменить размер и вместо theme написать phptemplate:

<?php
/**
* Theme a body of image node
*/
function phptemplate_image_body($node, $size) {
  return
image_display($node, IMAGE_ORIGINAL);
}
?>

Такие функции, предназначенные для вывода информации, можно найти в каждом модуле, и, чтобы не править непосредственно сами файлы модуля, чтобы потом иметь проблемы при обновлении, хорошим тоном будет перекрывать их в файле template.php вашей темы. (За это я очень люблю Drupal!)

Теперь выведем ссылку под фотографией при показе прикрепленного изображения. Для этого нужно знать номер (vid) словаря Image Galleries и перекрыть функцию вывода изображения в полной ноде.
Заходим в папку modules/image/contrib/image_attach, находим файл image_attach.module и в 463 строке видим функцию theme_image_attach_body($node). Немного разобравшись в том, что в ней означает $node->iid, мы получаем:

Я сама начинающий программист. Что мне помогает? Умение искать информацию и смекалка. Я сходила на http://api.drupal.org/, посмотрела функции, содержащие слово term, затем набрала в Поисковике по drupal.org фразу в кавычках "taxonomy_node_get_terms_by_vocabulary" и по примеру написала для себя. Вы тоже так можете если не знаете PHP хорошо.

Ну и напоследок десерт: листание страниц. То, что предлагается в drupal.handbook громоздкое и тяжелое. Я выбрала облегченный вариант и облегчила для себя еще больше. Получился отдельный сниппет.

Что он делает: формирует массив фотографий для отображения внизу документа типа Image. Формирует ссылки на них в виде миниатюры и названия (оно отображается под миниатюрой). И еще определяет, куда ведет ссылка - следующее или предыдущее фото - и облекает в соответствующий div.

Далее создаем для вывода документов типа image node-image.tpl.php (если у вас его нет, то скопируйте node.tpl.php и измените имя).

Рекомендую облечь <?php print $content ?> в div, отличный от того, что по умолчанию в node.tpl.php и прописать у него css {text-align:center;margin:0 0 20px;}, чтобы основная фотография была по центру, и чтобы миниатюры не напирали на нее.
А после закрытия этого div нужно вставить вот такой код:

<?php if ($page != 0 && $terms) { ?>
  <div class="pager_img">
   <?php print custom_pager_thumbnails($node->nid); ?>
  </div>
<?php } ?>

Именно он выведет наши миниатюры.

Вот мы и разобрались со всем, что хотели.
Такие возможности есть у нас по умолчанию:

  1. Возможность создавать неограниченное количество галерей, в том числе вложенных.
  2. Возможность создавать много документов типа image на лету, при это они все будут помещены в галерею, у каждого будет название и даже описание.
  3. Возможность прикрепить к другим типам документов изображение - загрузить при создании материала (правда в этом случае нет возможности поместить его в галерею сразу) или выбрать из уже загруженных.

И, дополнительно потрудившись, мы добились:

  1. Возможность перехода на следующее и предыдущее изображение в галерее по клику на миниатюре.
  2. Просмотр максимального размера фотографии в галерее без необходимости нажимать на ссылку "Оригинал". Даже если мы пришли на страницу по клику на фотографии небольшого размера.
  3. Ссылка под прикрепленным изображением приведет нас в галерею, которой оно принадлежит.
  4. Надеюсь, этот материал покажется кому-то полезным.

Евгений Колосов

Очень интересно Вы пишете о Drupal! И это здорово, ведь для этой замечательной системы так мало руководств по тонкой настройке.

> Надеюсь, этот материал покажется кому-то полезным.

Очень полезным! Спасибо.

sa_bo_nim

Спасибо большое. Вот бы еще побольше комментариев оставляли мои читатели, было бы вообще супер!

Гость

а перевода этого модуля нет?

sa_bo_nim

Все свежие переводы ищите на Drupaler.ru

Shagi

А если у нас три типа материала типа имидж:
фото 1 (имидж по умолчанию)
фото 2 (клон 1)
фото 3 (клон 2)
Будет ли тогда работать галлерея?
По крайней мере, у меня сейчас добавляются типы материалов все, а вот галлерея показывает только с типом материала по умолчанию.

Shagi

А где вообще настраивается вид галлереи?
Ну могу изменить количество фотографий, ну добавить кто запостил...
А вот, если я не хочу чтоб заголовки показывались?
Или ваще у меня превьюхи не показываются...
что тогда?

sa_bo_nim

Я не могу догадаться с какой версией вы работаете, поэтому подсказать по вашим вопросам мне трудно. Если не нашли настроек в модуле для решения ваших задач, тогда берите template.php вашей темы и пытайтесь переопределять функции вывода (как делать на примере показано выше в посте).
Вообще помню что информацию об авторе можно выводить, отметив где-то галку.
Кол-во фото на странице галереи тоже можно настроить в админке.
Насчет клонов типа материала я не знаю...

Shagi

Версия стоит 5-я.
Меня интересует два вопроса:
1. Где подключаются превьюшки на странице галлерей.
То есть, есть список галлерей, фходим туда, где есть фотки. И там под заголовками стоят превьюшки. То есть должны быть, но их там нет Расстроенный, грустный
Просто раньше у меня галлерея была создана на таксономии, но она использует стандартную вьюху. А мне эту вьюху нужно использовать не только для галлереи, но и для вывода различных списков. Поэтому обратился к этой галлереи. Но столкнулся с проблемами.
2. Галлерея работает только с одним типом материалов (имидж). Я создал подобных два. С теми же параметрами и полями. Но если галлерея на основе таксономии работала без проблем (там вьюха все контролировала), то стандартная - нет. А вот три материала как раз и нужны. Для разных типов пользователей.
Вот и мучаюсь. Не знаю что делать Расстроенный, грустный

sa_bo_nim

То что галерея пишется по английски как gallery не значит что она пишется так же и по русски))
Модуль image_gallery базируется на таксономии. При создании галереи вы должны будете увидеть в словарях что появился новый словарь. Может быть вам создать еще 2 словаря таких же и чтобы они были настроены на ваши отдельные типы материалов?
Вообще-то я тут вам мало чем помогу... честно я не знаю как сделать.

Почему превьюшки исчезли - может вам пересохранить все материалы типа image?

Shagi

Аня, Вы филолог?
Я вообще татарин. Как говорится, нам татарам...
Но по работе приходится писать статьи по украински... Хотя русский язык - мой родной Улыбка
Вообще буду знать как пишется слово "галерея" Улыбка
К слову. В гугле 3 330 000 запросов по слову "галлерея". Видимо не я один такой безграмотный Расстроенный, грустный
Если по делу, то создан словарь Image Galleries
Он привязан к трем типам материала:
Фотография в архив (исходный имидж)
Фотография пользователя (клон)
Фотография в блогах (клон)
Галерея работает только с первый типом. Хотя, если через Импорт, я вставляю фотографии других типов - они в галерею попадают. А если через добавление каждого типа, то в списке нодов они есть, а в галереи - нет Расстроенный, грустный
А если модуль image_gallery базируется на таксономии, то какая вьюха за него отвечает? Если б я добрался до нее, то смог бы что-то сделать...

Shagi

Ой. Писал в тексте ": )", а получил страшную иконку - Улыбка

Shagi

Еще вопрос.
"Возможность прикрепить к другим типам документов изображение - загрузить при создании материала (правда в этом случае нет возможности поместить его в галерею сразу) или выбрать из уже загруженных."
Это цитата на этой странице.
Можно подробнее?
что значит нет возможности поместить сразу?
А когда можно?
Что для этого надо сделать?

sa_bo_nim

Возможность прикреплять изображения к другим типам материалов - функционал модуля image_attach. Включаете его, идете в те типы материалов, к которым хотели бы прикреплять картинки, включаете опцию прикреплять изображения, и вуаля. При таком прикреплении создается вторая нода типа image, картинка не лежит ни в одной галерее, поэтому я и сказала, что ее сразу нельзя поместить в галереи. Только если хакнуть модуль image_attach, но я уже не знаю сама как. Это надо в issues к модулю глядеть. Я помню пыталась такое реализовать, но не получилось сходу. Модуль так же позволяет прикреплять к материалам уже загруженные изображения типа image. Тогда появляется выпадающий список со списком ваших картинок. Если их много, то он будет очень длинным.
Вообще насчет разграничений прав к материалам - может быть вам не разные типы контента создавать, а найти модуль по разграничению прав на категории (термины в словаре). Честно не знаю как решить вашу проблему. Спросите насчет того, как сделать вывод картинок разных типов материала в виде галереи с помощью Views на Друпал.ру (без упоминания об image модуле). Я думаю вам помогут Подмигивающий

Shagi

На счет модуля по разграничению прав на категории (термины в словаре) хорошая идея.
Я тоже думал об этом. Спрошу.

Спасибо за ответ и за советы Улыбка

А можно еще вопрос?
В настройках модуля галереи я могу поменять количество фоток на странице, вывести кто запостил.
А то я еще могу поменять и где это делается?
Например я хочу заголовок поставить под фоткой или еще чего-нибудь.
Может вьюха какая то отвечает за это?
У меня в списках вьюс ничего такого нет Расстроенный, грустный
а в блоках есть только Latest image, Random image.

sa_bo_nim

Только эти два параметра и можно редактировать тут - /admin/settings/image_gallery
А чтобы заголовок поставить под фото, надо переопределить функцию вывода theme_image_gallery_img($image, $size) в файле template.php вашей темы. Вместо theme поставьте phptemplate и измените ее тело как вам угодно.
Пример такого изменения написан в посте на этой странице Улыбка

Гость

Я как раз про эти параметры и спрашивал Улыбка

alexd

Привет!
В фукции function (themename)_image_gallery($galleries, $images) есть код для отображения картинок в галерее:

$content .= 'МОЙ ТЕКСТ';
$content .= '<div class="images">';
    foreach ($images as $image) {
      $content .= theme('image_gallery_img', $image, $size);
    }
    $content .= "</div></center>\n";
  }

  if ($pager = theme('pager', NULL, variable_get('image_images_per_page', 6), 0)) {
    $content .= $pager;
  }

  if (count($images) + count($galleries) == 0) {
      $content .= '<p class="count">'. format_plural(0, 'There is 1 image in this gallery.', 'There are @count images in this gallery.') ."</p>\n";
  }

Как можно вставить вместо "МОЙ ТЕКСТ" информацию о галерее (описание, название и т.п.)?

Эдуард Карасев

Премного благодарен:) Классная тема, пишите чаше - у вас отлично получается Улыбка

Геннадий

А вот вопрос такой!!

Друпал 6

Есть блок который выводится в отдельном регионе! И собирает картинки (миниатюры) к ноде (аргумент во view) из n количества галерей принадлежащих одной родительской!
Я ограничил их вывод (5 картинок) и сделал стандартными методами view их пролистывание.

А вот желание другое!
Как вывести список детей (галерей)(отдельным блоком) и при клике пакетом менять в блоке картинки (миниатюры) принадлежащие той или другой категории!

Как вывести блок списка детей (галерей) относящихся к ноде я как нить соображу!!

А Вот Как сделать то что описал выше! Как грубо говоря заменить кнопки туда сюда
ссылками к галереям но выводить их в блоке

Кирилл

Здравствуйте. Нужна помощь. Где и что нужно переписать в image_import что бы он искал галереи не модуля Image, а Node_galery?
вообще PHP не знаю, но если подскажете, то разберусь.

Гость

Не работает на Drupal 6.20!
Выдает ошибку:
Unknown column 'f.nid' in 'on clause' query: SELECT DISTINCT n.nid, n.title, f.filepath FROM node n INNER JOIN term_node tn INNER JOIN files f ON n.nid = tn.nid AND n.nid = f.nid WHERE tn.tid = 37 AND n.status = 1 AND f.filename = 'thumbnail' ORDER BY n.sticky DESC, n.created DESC, n.nid DESC в файле template.php в строке 6.
Не понятно, как организована связь с базой files.

Гость
Гость

Благодарю! На одном из сайтов на 6-ке у меня используется такая галерея с модулем image. Ваша статья натолкнула на мысли об её совершенствованиию Спа-си-бо! Улыбка

потерянный

Привет, отличная статья, вот думаю браться ли лопатить такой объём работ, может кто даст ссылку на конечный результат?