Пэйджинг для модуля Image

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

Аватар пользователя SaBoNim SaBoNim 15 мая 2008 в 1:08

Первоначальный источник: http://drupal.org/node/214988
Задача: вывести ссылки на предыдущую и следующие фотографии в галерее в виде миниатюр.
В template.php:
/* Image Gallery Pager with thumbnails */

function custom_pager_thumbnails($current_nid, $class = NULL) {
$tid = reset(array_keys(taxonomy_node_get_terms($current_nid)));
$result = db_query(db_rewrite_sql('SELECT 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 = %s AND n.status = 1 AND f.filename = \'%s\' ORDER BY n.sticky DESC, n.created DESC, n.nid DESC'), $tid, 'thumbnail');
while ($node = db_fetch_object($result)) {
$nodes[++$i] = $node;
if ($node->nid == $current_nid) $x = $i;
// image size
$image_info = image_get_info($nodes[$i]->filepath);
$image_width[$i] = $image_info['width'];
$image_height[$i] = $image_info['height'];
}
switch ($x) {
case 1:
// first image
$y = array(2);
break;
case $i:
// last image
$y = array($x-1);
break;
default:
$y = array($x-1,$x+1);
}
if ($i!=1) {
foreach($y as $index => $z) {
if ($z < $x){$class = 'prev_img';}else{$class = 'next_img';}
$output .= '

'.l('filepath)). '" alt="'. check_plain($nodes[$z]->title) . '" width="'. $image_width[$z] .'" height="'. $image_height[$z] .'" />', 'node/'. $nodes[$z]->nid, array('title' => check_plain($nodes[$z]->title)), NULL, NULL, FALSE, TRUE).''.l(check_plain($nodes[$z]->title), 'node/'. $nodes[$z]->nid, array('title' => check_plain($nodes[$z]->title)), NULL, NULL, FALSE, TRUE).'

';
}
}
return $output;
}
?>

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

Вот CSS:

.pager_img .next_img{
  float:right;
  width:45%;
  height:auto;
  text-align:right;
}
.pager_img .prev_img{
  float:left;
  width:45%;
  height:auto;
  text-align:left;
}

Далее создаем для вывода документов типа 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 } ?>

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

Подробнее об изменении функций вывода в модуле image - статья в моем блоге.

Комментарии

Аватар пользователя Zen Zen 15 мая 2008 в 19:21

Зашел на сайт что бы задать вопрос на форуме а тут на главной странице статья с ответом Smile
И говорят потом что чуда не бывает ! )))

Аватар пользователя Zen Zen 15 мая 2008 в 19:48

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

Аватар пользователя SaBoNim SaBoNim 15 мая 2008 в 20:03

Да, замените цикл switch примерно на такое

 switch ($x) {
  case 1:
   // first image
   $y = array(2,3,4,5,6);
  break;
  case $i:
   // last image
   $y = array($x-1);
  break;
  default:
   $y = array($x-1,$x+1,$x+2,$x+3,$x+4,$x+5);
}

$x - номер текущей фотки
$i - номер последней фотки
(настройте все случаи для себя, используя исходную ссылку как пример, где выводятся первая, предыдущая, текущая, следующая и последние миниатюры)

Аватар пользователя SaBoNim SaBoNim 12 июня 2008 в 11:16

А у вас наверное версия в которой можно указать порядок? В таком случае, просто надо поменять сортировку в запросе к базе: ORDER BY n.sticky DESC, n.created DESC, n.nid DESC на ORDER BY n.sticky DESC, n.created , n.nid.
Вот такой код из template.php получится:

<?php
/* Image Gallery Pager with thumbnails */

function custom_pager_thumbnails($current_nid, $class = NULL) {
$tid = reset(array_keys(taxonomy_node_get_terms($current_nid)));
$result = db_query(db_rewrite_sql('SELECT 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 = %s AND n.status = 1 AND f.filename = \'%s\' ORDER BY n.sticky DESC, n.created, n.nid'), $tid, 'thumbnail');
while ($node = db_fetch_object($result)) {
  $nodes[++$i] = $node;
  if ($node->nid == $current_nid) $x = $i;
  // image size
  $image_info = image_get_info($nodes[$i]->filepath);
  $image_width[$i] = $image_info['width'];
  $image_height[$i] = $image_info['height'];
}
switch ($x) {
  case 1:
   // first image
   $y = array(2);
  break;
  case $i:
   // last image
   $y = array($x-1);
  break;
  default:
   $y = array($x-1,$x+1);
}
if ($i!=1) {
  foreach($y as $index => $z) {
   if ($z < $x){$class = 'prev_img';}else{$class = 'next_img';}
      $output .= '<div class="'.$class.'">'.l('<img src="' . check_url(url('system/files/' . $nodes[$z]->filepath)). '" alt="'. check_plain($nodes[$z]->title) . '" width="'. $image_width[$z] .'" height="'. $image_height[$z] .'" />', 'node/'. $nodes[$z]->nid, array('title' => check_plain($nodes[$z]->title)), NULL, NULL, FALSE, TRUE).'<p>'.l(check_plain($nodes[$z]->title), 'node/'. $nodes[$z]->nid, array('title' => check_plain($nodes[$z]->title)), NULL, NULL, FALSE, TRUE).'</p></div>';
  }
}
return $output;
}
?>

Аватар пользователя batbug batbug 11 июля 2008 в 8:19

Вопрос (задаю перед установкой чтобы не делать больно Smile

У меня на сайте изображения можно положить в несколько фотоальбомов. В такой ситуации ваш код как будет работать?

Аватар пользователя SaBoNim SaBoNim 11 июля 2008 в 20:37

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

Аватар пользователя batbug batbug 5 ноября 2010 в 18:15

Под шестёрку нужно заменить лишь одну строку

в самом начале напишите

<?php
$tid 
reset(array_keys(taxonomy_node_get_terms_by_vocabulary($current_nid,1)));
?>

вместо старой строчки.