Первоначальный источник: 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 .= '
';
}
}
return $output;
}
?>
Что он делает: формирует массив фотографий для отображения внизу документа типа Image. Формирует ссылки на них в виде миниатюры и названия (оно отображается под миниатюрой). И еще определяет, куда ведет ссылка - следующее или предыдущее фото - и облекает в соответствующий div.
Вот CSS:
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
, чтобы основная фотография была по центру, и чтобы миниатюры не напирали на нее.
А после закрытия этого div нужно вставить вот такой код:
<div class="pager_img">
<?php print custom_pager_thumbnails($node->nid); ?>
</div>
<?php } ?>
Именно он выведет наши миниатюры.
Подробнее об изменении функций вывода в модуле image - статья в моем блоге.
Комментарии
Очень хорошо!
Спасибо.
Зашел на сайт что бы задать вопрос на форуме а тут на главной странице статья с ответом
И говорят потом что чуда не бывает ! )))
У меня всегда так - то, что я публикую, сразу находит тех, кому это надо прямо сейчас.
А можно как то сделать что бы показывалась не только предыдущая и следующая фото а например в ряд 5 следующих фото и одна предыдущая
Да, замените цикл switch примерно на такое
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 - номер последней фотки
(настройте все случаи для себя, используя исходную ссылку как пример, где выводятся первая, предыдущая, текущая, следующая и последние миниатюры)
просто супер! спасибо!
А для разбиения большой книги на страницы в drupal6 это подойдет?
Нет, вам нужен модуль paging - http://drupal.org/node/220427 для друпал 6.2
Огромное спасибо!
Просто супер!
Наконец то нашел то что искал, огромное спасибо!
Мечты сбываются )))) Спасибо!
а почему у меня выводится слева следующая фото а справа предыдущая? я где то напорол боков?
А у вас наверное версия в которой можно указать порядок? В таком случае, просто надо поменять сортировку в запросе к базе: ORDER BY n.sticky DESC, n.created DESC, n.nid DESC на ORDER BY n.sticky DESC, n.created , n.nid.
Вот такой код из 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, 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;
}
?>
Вопрос (задаю перед установкой чтобы не делать больно
У меня на сайте изображения можно положить в несколько фотоальбомов. В такой ситуации ваш код как будет работать?
Я не тестила его в таких условиях, поэтому ничего сказать не могу. Но кажется, что будет листать в альбоме который по весу выше всех остальных. Так как это просто термин таксономии и обычно происходит именно так.
Понятно, большое спасибо, буду пробовать!
Дамы и господа! Хотел бы иметь сабж под шестерку. Свои познания не дают результата. Поможете? Заранее благодарен.
поддерживаю предыдущего автора)
Под шестёрку нужно заменить лишь одну строку
в самом начале напишите
<?php
$tid = reset(array_keys(taxonomy_node_get_terms_by_vocabulary($current_nid,1)));
?>
вместо старой строчки.