Навигация в модуле image_gallery
Столкнулся недавно с интересной проблемой. Суть её заключается в том, чтобы сделать навигацию для галереи в модуле Image.
Сама галерея основана на терминах таксономии и позволяет создавать множество галерей, в том числе и вложенных. Опробовав несколько других галерей, я решил остановиться на модуле Image, а точнее Image_gallery. Работа с галереей меня устроила. Её отображение легко можно настроить с помощью модуля Views. Моссовую загрузку изображений можно обеспечить с помощью модуля Image_import. Всё казалось бы хорошо, но навигация по галерее не предусмотрена. При просмотре следующей (предыдущей) фотографии из просмотра отдельной фотографии необходимо вернуться в галерею.
Решение я нашел на сайте Drupal.org. К сожалению, оно оказалось не рабочим для версии 6.20. Пришлось дорабатывать существующее решение. В итоге я получил навигацию из пяти фотографий (две вперед, две назад и одна текущая) внизу просматриваемой фотографии. Плюсом к фотогалерее было прикручено голосование vote_up_down, с сортировкой по количеству голосов. При отборе фотографий необходимо это учитывать.
Файл template.php:
<?php
function custom_pager_thumbnails($current, $class = NULL) {
$tid = reset(array_keys(taxonomy_node_get_terms($current)));
$result = db_query(db_rewrite_sql('SELECT n.nid, n.title, f.filepath FROM {node} n INNER JOIN {term_node} tn INNER JOIN {image} i INNER JOIN {files} f ON n.nid = tn.nid AND n.nid = i.nid AND i.fid = f.fid WHERE tn.tid = %s AND n.status = 1 AND f.filename = \'%s\' ORDER BY (SELECT COUNT(*) FROM votingapi_vote v WHERE v.content_id = n.nid) ASC, 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: $y = array(3, 2, 1, $i, $i-1); break;
case 2: $y = array(4, 3, 2, 1, $i); break;
case $i: $y = array(2, 1, $i, $i-1, $i-2); break;
case $i-1: $y = array(1, $i, $i-1, $i-2, $i-3); break;
default: $y = array($x+2, $x+1, $x, $x-1, $x-2);
}
foreach($y as $index => $z) {
if ($index == 2) {
$output .= '<div class="active"><img src="' . check_url(url('system/files/' . $nodes[$z]->filepath)) . '" alt="'. check_plain($nodes[$z]->title) . '" width="'. $image_width[$z] .'" height="'. $image_height[$z] .'" /></div>';
} else {
$output .= '<div>'. 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('html' => true)) .'</div>';
}
}
return $output;
}
?>Отличия от исходного примера:
- SQL-запрос. В исходном не учитывалась база image, предназначенная для связи node и files. Добавлена сортировка с учётом результата голосования за фотографии.
- В качестве $current берется узел, а не его идентификатор. Для процедуры taxonomy_node_get_terms нужен именно узел, а не его идентификатор.
- Исправлены условия отбора нужных фотографий, в нужном порядке.
- Исправлено отображение фотографий. Все фотографии помещаются внутрь тега div.
Функция taxonomy_node_get_terms:
<?php
function taxonomy_node_get_terms($node, $key = 'tid') {
static $terms;
if (!isset($terms[$node->vid][$key])) {
$result = db_query(db_rewrite_sql('SELECT t.* FROM {term_node} r INNER JOIN {term_data} t ON r.tid = t.tid INNER JOIN {vocabulary} v ON t.vid = v.vid WHERE r.vid = %d ORDER BY v.weight, t.weight, t.name', 't', 'tid'), $node->vid);
$terms[$node->vid][$key] = array();
while ($term = db_fetch_object($result)) {
$terms[$node->vid][$key][$term->$key] = $term;
}
}
return $terms[$node->vid][$key];
}
?>
Функция l:
<?php function l($text, $path, $options = array()) { global $language; // Merge in defaults. $options += array( 'attributes' => array(), 'html' => FALSE, ); // Append active class. if (($path == $_GET['q'] || ($path == '<front>' && drupal_is_front_page())) && (empty($options['language']) || $options['language']->language == $language->language)) { if (isset($options['attributes']['class'])) { $options['attributes']['class'] .= ' active'; } else { $options['attributes']['class'] = 'active'; } } // Remove all HTML and PHP tags from a tooltip. For best performance, we act only // if a quick strpos() pre-check gave a suspicion (because strip_tags() is expensive). if (isset($options['attributes']['title']) && strpos($options['attributes']['title'], '<') !== FALSE) { $options['attributes']['title'] = strip_tags($options['attributes']['title']); } return '<a href="'. check_url(url($path, $options)) .'"'. drupal_attributes($options['attributes']) .'>'. ($options['html'] ? $text : check_plain($text)) .'</a>'; } ?>
Для отображения внутри ссылки html кода необходимо установить параметр html. Сделать это можно указав массив:
array('html' => true)В файл node-image.tpl.php нужно после <?php print $content ?> вставить строчку:
<div class="pager"><?php if ($page != 0 && $terms) { print custom_pager_thumbnails($node); } ?></div>
Содержимое файла style.css будет зависеть от вашего дизайна. Для отображения фотографий в строку можно добавить следующее:
.pager div{ float:left; }
Комментарии
А можно "на пальцах" объяснить что куда вставлять, помогите пожалуйста, буду очень признателен!
В файл node-image.tpl.php нужно после <?php print $content ?> вставить строчку:
<div class="pager"><?php if ($page != 0 && $terms) { print custom_pager_thumbnails($node); } ?></div>Содержимое файла style.css будет зависеть от вашего дизайна. Для отображения фотографий в строку можно добавить следующее:
.pager div{ float:left; }Всё очень просто! Но это работает только на 6-й версии.
Функция taxonomy_node_get_terms и Функция l, куда их вставлять
Их никуда не надо вставлять. Они используются в template.php. И приведены в статье только для информации.
В template.php вставил данный код, и в node-image.tpl.php вставил строчку, на странице с изображением появились "квадратики" 5шт, а сверху изображения пишет какую то ошибку, ссылаясь на 4 строку данного кода
Напишите текст ошибки
Наверное, ошибка из-за того что у вас не включено голосование. Замените 4-ю строку на эту:
$result = db_query(db_rewrite_sql('SELECT n.nid, n.title, f.filepath FROM {node} n INNER JOIN {term_node} tn INNER JOIN {image} i INNER JOIN {files} f ON n.nid = tn.nid AND n.nid = i.nid AND i.fid = f.fid 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');Огромное спасибо, заработало! А как включить голосование?
Я использовал модуль vote_up_down.
После проведённых манипуляций появилась такая проблемка, после добавления или удаления материала страница становится пустой, приходиться возвращаться назад, материал обновляется, но это как то не очень удобно.
Посмотрите в журнале на предмет ошибок.
Прикольно!
Комментировать