Кастомизация модуля 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. Надеюсь, этот материал покажется кому-то полезным.