'. t('Image galleries can be used to organize and present groups of images. Galleries may be nested. To add a new gallery click the "add gallery" tab.') .'
'; } } function image_gallery_perm() { return array('administer images'); } function image_gallery_menu($may_cache) { $items = array(); if ($may_cache) { $items[] = array( 'path' => 'image', 'title' => t('Image galleries'), 'access' => user_access('access content'), 'type' => MENU_SUGGESTED_ITEM, 'callback' => 'image_gallery_page', ); $items[] = array( 'path' => 'admin/content/image', 'title' => t('Image galleries'), 'access' => user_access('administer images'), 'callback' => 'image_gallery_admin', 'description' => t('Create and manage image galleries.'), ); $items[] = array( 'path' => 'admin/content/image/list', 'title' => t('List'), 'access' => user_access('administer images'), 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10, ); $items[] = array( 'path' => 'admin/content/image/add', 'title' => t('Add gallery'), 'access' => user_access('administer images'), 'callback' => 'image_gallery_admin_add', 'type' => MENU_LOCAL_TASK, ); $items[] = array( 'path' => 'admin/settings/image/image_gallery', 'title' => t('Image gallery'), 'access' => user_access('administer site configuration'), 'callback' => 'drupal_get_form', 'callback arguments' => array('image_gallery_admin_settings'), 'description' => t('Configure appearance of image galleries.'), 'type' => MENU_LOCAL_TASK, ); } elseif (is_numeric(arg(4))) { $term = taxonomy_get_term(arg(4)); if ($term) { $items[] = array( 'path' => 'admin/content/image/edit', 'title' => t('Edit image gallery'), 'callback' => 'image_gallery_admin_add', 'callback arguments' => array((array)$term), 'access' => user_access('administer images'), 'type' => MENU_CALLBACK, ); } } return $items; } /** * Test whether we're using Views to generate galleries or not */ function image_gallery_is_using_views() { if (module_exists('views')) { // If the variable isn't set then nothing is disabled, if it's set it needs to be enabled. $views_status = variable_get('views_defaults', array()); return (!isset($views_status['image_gallery']) || $views_status['image_gallery'] == 'enabled'); } return FALSE; } function image_gallery_admin_settings() { _image_check_settings(); if (image_gallery_is_using_views()) { $form['info'] = array( '#type' => 'item', '#title' => t('Image galleries are being provided by the Views module'), ); if (module_exists('views_ui')) { $form['info']['#value'] = t('To change the way galleries are displayed, override the default image_gallery view on the Views administration page.', array('!views-link' => url('admin/build/views'))); } else { $form['info']['#value'] = t('To change the way galleries are displayed, enable the Views UI module on the Modules administration page, then override the default image_gallery view.', array('!modules-link' => url('admin/build/modules', NULL, 'edit-status-views-ui'))); } return $form; } $form['gallery'] = array( '#type' => 'fieldset', '#title' => t('Gallery settings'), ); $form['gallery']['image_images_per_page'] = array( '#type' => 'textfield', '#title' => t('Images per page'), '#default_value' => variable_get('image_images_per_page', 6), '#size' => 3, '#description' => t('Sets the number of images to be displayed in a gallery page.'), ); $form['gallery']['image_gallery_node_info'] = array( '#type' => 'checkbox', '#title' => t('Display node info'), '#default_value' => variable_get('image_gallery_node_info', 0), '#description' => t("Checking this will display the \"Posted by\" node information on the gallery pages."), ); $form['gallery']['image_gallery_sort_order'] = array( '#type' => 'radios', '#title' => t('Image display sort order'), '#default_value' => variable_get('image_gallery_sort_order', IMAGE_GALLERY_SORT_CREATE_DESC), '#options' => array( IMAGE_GALLERY_SORT_CREATE_DESC => t('Create date, newest first'), IMAGE_GALLERY_SORT_CREATE_ASC => t('Create date, oldest first'), IMAGE_GALLERY_SORT_FILENAME => t('File name'), IMAGE_GALLERY_SORT_TITLE => t('Image title'), ), ); return system_settings_form($form); } /** * Implementation of hook_taxonomy. If our vocabulary gets deleted, delete our * variable pointing to it. */ function image_gallery_taxonomy($op, $type, $array) { if ($op == 'delete' && $type == 'vocabulary') { $vid = variable_get('image_gallery_nav_vocabulary', ''); if ($vid == $array['vid']) { variable_set('image_gallery_nav_vocabulary', ''); } } } function image_gallery_term_path($term) { return 'image/tid/'. $term->tid; } function image_gallery_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) { switch ($op) { case 'view': if ($page && !$teaser && $node->type == 'image') { $vid = _image_gallery_get_vid(); $terms = taxonomy_node_get_terms_by_vocabulary($node->nid, $vid); $term = array_pop($terms); if ($term) { $vocabulary = taxonomy_get_vocabulary($vid); // Breadcrumb navigation $breadcrumb = array(); $breadcrumb[] = array('path' => 'image', 'title' => $vocabulary->name); if ($parents = taxonomy_get_parents_all($term->tid)) { $parents = array_reverse($parents); foreach ($parents as $p) { $breadcrumb[] = array('path' => 'image/tid/'. $p->tid, 'title' => $p->name); } } $breadcrumb[] = array('path' => 'node/'. $node->nid); menu_set_location($breadcrumb); } } break; } } /** * Image gallery callback, displays an image gallery */ function image_gallery_page($type = NULL, $tid = 0) { $galleries = taxonomy_get_tree(_image_gallery_get_vid(), $tid, -1, 1); for ($i=0; $i < count($galleries); $i++) { $galleries[$i]->count = taxonomy_term_count_nodes($galleries[$i]->tid, 'image'); $tree = taxonomy_get_tree(_image_gallery_get_vid(), $galleries[$i]->tid, -1); $descendant_tids = array_merge(array($galleries[$i]->tid), array_map('_taxonomy_get_tid_from_term', $tree)); // The values of $descendant_tids should be safe for raw inclusion in the // SQL since they're all loaded from integer fields in the database. $sql = "SELECT n.nid FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid IN (". implode(',', $descendant_tids) .") AND n.type = 'image' AND n.status = 1 ORDER BY n.sticky DESC, n.created DESC"; if ($nid = db_result(db_query_range(db_rewrite_sql($sql), 0, 1))) { $galleries[$i]->latest = node_load(array('nid' => $nid)); } } $images = array(); if ($tid) { /* Depending on whether the Views module is enabled, either: * - Build (and theme) the image gallery ourselves. * - Embed a view to show the image gallery, appending it to the themed * child gallery list. */ if (image_gallery_is_using_views()) { $view = views_get_view('image_gallery'); } else { // Allow images to be sorted in a useful order. $query = "SELECT n.nid FROM {term_node} t INNER JOIN {node} n ON t.nid = n.nid WHERE n.status = 1 AND n.type = 'image' AND t.tid = %d "; $count_query = "SELECT COUNT(DISTINCT(n.nid)) FROM {term_node} t INNER JOIN {node} n ON t.nid = n.nid WHERE n.status = 1 AND n.type = 'image' AND t.tid = %d "; $args = array($tid); switch (variable_get('image_gallery_sort_order', IMAGE_GALLERY_SORT_CREATE_DESC)) { case IMAGE_GALLERY_SORT_CREATE_DESC: $query .= 'ORDER BY n.sticky DESC, n.created DESC'; break; case IMAGE_GALLERY_SORT_CREATE_ASC: $query .= 'ORDER BY n.sticky DESC, n.created ASC'; break; case IMAGE_GALLERY_SORT_FILENAME: $query = "SELECT n.nid FROM {term_node} t INNER JOIN {node} n ON t.nid = n.nid INNER JOIN {image} i ON n.nid = i.nid INNER JOIN {files} f ON i.fid = f.fid WHERE n.status = 1 AND n.type = 'image' AND t.tid = %d AND f.filename = '%s' ORDER BY n.sticky DESC, f.filepath"; $args[] = IMAGE_ORIGINAL; break; case IMAGE_GALLERY_SORT_TITLE: $query .= 'ORDER BY n.sticky DESC, n.title ASC'; break; } $result = pager_query(db_rewrite_sql($query), variable_get('image_images_per_page', 6), 0, db_rewrite_sql($count_query), $args); while ($node = db_fetch_object($result)) { $images[] = node_load(array('nid' => $node->nid)); } } $gallery = taxonomy_get_term($tid); $parents = taxonomy_get_parents($tid); foreach ($parents as $parent) { $breadcrumb[] = array('path' => 'image/tid/'. $parent->tid, 'title' => $parent->name); } $breadcrumb[] = array('path' => 'image', 'title' => t('Image galleries')); $breadcrumb = array_reverse($breadcrumb); drupal_set_title(check_plain($gallery->name)); } $breadcrumb[] = array('path' => $_GET['q']); menu_set_location($breadcrumb); $content = theme('image_gallery', $galleries, $images); if ($view) { $content .= views_build_view('embed', $view, array($tid), $view->use_pager, $view->nodes_per_page, 0, 0); } return $content; } function image_gallery_admin() { _image_check_settings(); $header = array(t('Name'), t('Operations')); $tree = taxonomy_get_tree(_image_gallery_get_vid()); if ($tree) { foreach ($tree as $term) { $rows[] = array(str_repeat(' -- ', $term->depth) .' '. l($term->name, "image/tid/$term->tid"), l(t('edit gallery'), "admin/content/image/edit/$term->tid")); } return theme('table', $header, $rows); } else { return t('No galleries available'); } } function image_gallery_admin_add($edit = array()) { if ($_POST['op'] == t('Delete') || $_POST['confirm']) { return drupal_get_form('image_gallery_confirm_delete', $edit['tid']); } return drupal_get_form('image_gallery_admin_form', $edit); } function image_gallery_admin_form($edit = array()) { if (empty($edit)) { $edit['vid'] = _image_gallery_get_vid(); } $form['name'] = array( '#type' => 'textfield', '#title' => t('Gallery name'), '#default_value' => $edit['name'], '#size' => 60, '#maxlength' => 64, '#description' => t('The name is used to identify the gallery.'), '#required' => TRUE, ); $form['description'] = array( '#type' => 'textarea', '#title' => t('Description'), '#default_value' => $edit['description'], '#cols' => 60, '#rows' => 5, '#description' => t('The description can be used to provide more information about the image gallery.'), ); $form['parent']['#tree'] = TRUE; $form['parent'][0] = _image_gallery_parent_select($edit['tid'], t('Parent'), 'forum'); $form['weight'] = array( '#type' => 'weight', '#title' => t('Weight'), '#default_value' => $edit['weight'], '#delta' => 10, '#description' => t('When listing galleries, those with with light (small) weights get listed before containers with heavier (larger) weights. Galleries with equal weights are sorted alphabetically.'), ); $form['vid'] = array( '#type' => 'hidden', '#value' => _image_gallery_get_vid(), ); $form['submit' ] = array( '#type' => 'submit', '#value' => t('Submit'), ); if ($edit['tid']) { $form['delete'] = array( '#type' => 'submit', '#value' => t('Delete'), ); $form['tid'] = array( '#type' => 'hidden', '#value' => $edit['tid'], ); } $form['#base'] = 'image_gallery_admin'; return $form; } function image_gallery_admin_submit($form_id, $form_values) { $status = taxonomy_save_term($form_values); switch ($status) { case SAVED_NEW: drupal_set_message(t('Created new gallery %term.', array('%term' => $form_values['name']))); break; case SAVED_UPDATED: drupal_set_message(t('The gallery %term has been updated.', array('%term' => $form_values['name']))); break; case SAVED_DELETED: drupal_set_message(t('The gallery %term has been deleted.', array('%term' => $form_values['name']))); break; } return 'admin/content/image'; } function image_gallery_confirm_delete($tid) { $term = taxonomy_get_term($tid); $form['tid'] = array('#type' => 'value', '#value' => $tid); $form['name'] = array('#type' => 'value', '#value' => $term->name); return confirm_form($form, t('Are you sure you want to delete the image gallery %name?', array('%name' => $term->name)), 'admin/content/image', t('Deleting an image gallery will delete all sub-galleries. This action cannot be undone.'), t('Delete'), t('Cancel')); } function image_gallery_confirm_delete_submit($form_id, $form_values) { taxonomy_del_term($form_values['tid']); drupal_set_message(t('The image gallery %term and all sub-galleries have been deleted.', array('%term' => $form_values['name']))); return 'admin/content/image'; } function _image_gallery_parent_select($tid, $title) { $parents = taxonomy_get_parents($tid); if ($parents) { $parent = array_shift($parents); $parent = $parent->tid; } else { $parent = 0; } $children = taxonomy_get_tree(_image_gallery_get_vid(), $tid); // A term can't be the child of itself, nor of its children. foreach ($children as $child) { $exclude[] = $child->tid; } $exclude[] = $tid; $tree = taxonomy_get_tree(_image_gallery_get_vid()); $options[0] = '<'. t('root') .'>'; if ($tree) { foreach ($tree as $term) { if (!in_array($term->tid, $exclude)) { $options[$term->tid] = str_repeat(' -- ', $term->depth) .' '. $term->name; } } } return array( '#type' => 'select', '#title' => $title, '#default_value' => $parent, '#options' => $options, '#description' => t('Image galleries may be nested below other galleries.'), '#required' => TRUE ); } /** * Theme a gallery page */ function theme_image_gallery($galleries, $images) { drupal_add_css(drupal_get_path('module', 'image_gallery') .'/image_gallery.css'); $size = image_get_sizes(IMAGE_THUMBNAIL); $content = ''; if (count($galleries)) { $content .= ''. format_plural($gallery->count, 'There is 1 image in this gallery', 'There are @count images in this gallery') ."
\n"; if (isset($gallery->latest) && $gallery->latest->changed) { $content .= ''. t('Last updated: %date', array('%date' => format_date($gallery->latest->changed))) ."
\n"; } $content .= "