02.10.2011 Ubercart - скрыть SKU и другие поля (модуль Ubercart Product Power Tools) | Drupal 6 26.09.2011 Пользовательские галереи и хранение файлов на сервере - Drupal 6 22.06.2011 Блок последних комментариев блога - DRUPAL 6 16.06.2011 Показывать блок в определенных типах материалов и на определенных страницах - Drupal 6 16.06.2011 Топ 10 блоггеров - Drupal 6 21.05.2011 Модуль переноса комментариев для Drupal 6 22.03.2011 Подсветка синтаксиса кода в Drupal 6 22.03.2011 Кнопки социальных сетей для Drupal
#78

Пейджинг для Image Gallery (вперед, назад) - Drupal 6

Модуль image включает в себя, на мой взгляд, самую адекватную галерею для Drupal - Image Gallery, простая, удобная, функциональная, без всяких ненужных наворотов.

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

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

В название функции необходимо yourtheme изменить на название вашей темы.

  1. /**
  2.  * Custom theme function for displaying an image node.
  3.  * Implements previous and next buttons for images grouped in a gallery.
  4.  */
  5. function yourtheme_image_body($node, $size) {
  6. //find out term id the node is tagged with (gallery tid)
  7. $result = db_query("SELECT t.tid FROM {term_node} t WHERE t.nid = %d",$node->nid);
  8. $tid = db_result($result);
  9.  
  10. //print out image
  11. $output = image_display($node, $size);
  12.  
  13. //get all images with same tid (same gallery)
  14. $result = db_query("SELECT n.nid FROM {term_node} tn LEFT JOIN {node} n ON n.nid=tn.nid WHERE n.type='image' AND n.status=1 AND tn.tid=%d ORDER BY n.title ASC, n.changed DESC",$tid);
  15. //compose array we need for finding out prev and next
  16. $images = array();
  17. while ($imageNode = db_fetch_object($result)) {
  18. $images[] = $imageNode->nid;
  19. }
  20.  
  21. //get array key for current node
  22. $key = array_search($node->nid,$images);
  23.  
  24. $output .= '<div class="image_navv">';
  25.  
  26. //if there is a key before this node's key, render prev
  27. if(array_key_exists($key-1,$images)) {
  28. $output .= '<ul class="image_nav">';
  29. $output .= ' <li><<< '.l(t('Первое'),'node/'.$images[0]).'</li>';
  30. $output .= ' <li><< '.l(t('Предыдущее'),'node/'.$images[$key-1]).'</li>';
  31. $output .= '</ul>';
  32.  
  33. }
  34.  
  35. //if there is a key after this node's key, render next
  36. if(array_key_exists($key+1,$images)) {
  37. $output .= '<ul class="image_nav">';
  38. $output .= ' <li>'.l(t('Следующее'),'node/'.$images[$key+1]).' >></li>';
  39. $output .= ' <li>'.l(t('Последнее'),'node/'.$images[count($images)-1]).' >>></li>';
  40. $output .= '</ul>';
  41. }
  42.  
  43. $output .= '</div>';
  44.  
  45. return $output;
  46. }

Это еще не все, после того, как я разместил данный код в template.php, появились ссылки перехода, но оказалось, что при просмотре списка изображений в галерее, первое изображение совсем не то, которое выдается при нажатие на кнопку перехода к первому изображению при перелистывании картинок. Я пробовал изменить это с помощью SQL запроса в теле функции, но у меня ничего не вышло, т.к. я, честно говоря, так и не понял по каким критериям Image Gallery сортирует изображения по умолчанию. 

Но как все знают отображение Image Gallery можно настроить с помощью модуля views, что я и сделал, включил этот модуль, и поставил следующие критерии отбора для view image_gallery (данный дисплей появляется автоматически во views при включение модуля image):

Аналогично сделал в SQL запросе функции и все получилось адекватно. Единственное, что омрачает, это модуль Views, который на сайте не используется вообще и поставлен был только ради критериев отбора для галереи.

Также приведу CSS для пейджинга:

  1. div.image_navv {
  2.     text-align: center;
  3.     display: block;
  4.     padding-top: 20px;
  5.     padding-bottom: 20px;
  6. }
  7.  
  8. ul.image_nav {
  9.     display: inline;
  10. }
  11.  
  12. ul.image_nav li {
  13.     display: inline;
  14. }

P.S. У данного метода есть существенный, в некоторых случаях, недостаток, при просмотре какой-либо галереи (к примеру страница image/tid/1) - будет выводится некорректный breadcrumb, следующего вида (при условии что установлены модули taxonomy_breadcrumb и menu_breadcrumb и в настройках этих модулей все пункты включены):
Главная » Галерея картинок » Галерея картинок
Где первая ссылка после главной ведет на галерею, а последняя ссылка ведет на список галерей. Это происходит из-за того, что views также подключается к построению breadcrumbs, если у views есть заголовок. Если убрать заголовок у views, то ситуация становится попроще, но не намного лучше.
Более или менее корректно проблема решается установкой и настройкой модуля custom_breadcrumb 2.0, именно 2.0, т.к. в нем реализована поддержка изменения breadcrumb для views и taxonomy, насколько я понял. Модуль позволяет вручную прописывать необходимый путь, который должен выводиться на странице.


29.03.2011 Пейджинг для Image Gallery (вперед, назад) - Drupal 6 22.03.2011 Форма входа вверху сайта - Drupal 6 22.03.2011 Сниппет поиска по товарам - Drupal 6 22.03.2011 Сниппет вывода самых популярных товаров - Drupal 6 22.03.2011 Сниппет вывода последних новостей в блоке - Drupal 6 03.03.2011 Денвер, Drupal7 19.03.2010 Индивидуальный шаблон для каждой страницы - Drupal 6 31.03.2010 Drupal 6 ошибка 0 /upload/js
О сайте