'Imageflow', 'description' => 'Configure imageflow image galleries.', 'page callback' => 'imageflow_page_preset_list', 'access arguments' => array('administer site configuration'), 'file' => 'includes/imageflow.admin.inc', ); $items['admin/config/media/imageflow/list'] = array( 'title' => 'presets', 'description' => 'List the current imageflow presets.', 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => 1, ); $items['admin/config/media/imageflow/add'] = array( 'title' => 'Add preset', 'description' => 'Add a new imageflow preset.', 'page callback' => 'drupal_get_form', 'page arguments' => array('imageflow_form_preset_add'), 'access arguments' => array('administer site configuration'), 'type' => MENU_LOCAL_ACTION, 'weight' => 1, 'file' => 'includes/imageflow.admin.inc', ); $items['admin/config/media/imageflow/edit/%imageflow_preset'] = array( 'title' => 'Edit preset', 'description' => 'Configure an preset.', 'page callback' => 'drupal_get_form', 'page arguments' => array('imageflow_form_preset_edit', 5), 'access arguments' => array('administer site configuration'), 'file' => 'includes/imageflow.admin.inc', ); $items['admin/config/media/imageflow/delete/%imageflow_preset'] = array( 'title' => 'Delete preset', 'description' => 'Delete an preset.', 'page callback' => 'drupal_get_form', 'page arguments' => array('imageflow_preset_form_delete', 5), 'access arguments' => array('administer site configuration'), 'file' => 'includes/imageflow.admin.inc', ); $items['admin/config/media/imageflow/library'] = array( 'title' => 'Library', 'description' => 'ImageFlow library summary.', 'page callback' => 'drupal_get_form', 'page arguments' => array('imageflow_form_settings'), 'access arguments' => array('administer site configuration'), 'type' => MENU_LOCAL_TASK, 'weight' => 2, 'file' => 'includes/imageflow.admin.inc', ); return $items; } /** * Implements hook_help(). */ function imageflow_help($path, $arg) { switch ($path) { case 'admin/config/media/imageflow': return t('Create reusable presets that can be used to format image fields and views diplays.'); case 'admin/config/media/imageflow/edit/%': return t('A preset defines how an imageflow gallery looks like on your site. For full documentation of all options, refer to the official imageflow documentation.', array('@docs' => url('http://finnrudolph.de/ImageFlow/Documentation'))); case 'admin/config/media/imageflow/library': return t('This page lists some automatically detected files and folders.'); } } /** * Implements hook_theme(). */ function imageflow_theme() { return array( 'imageflow_container' => array( 'variables' => array('items' => array(), 'settings' => array()), 'template' => 'theme/imageflow-container', 'file' => 'theme/theme.inc', ), 'imageflow_form_table' => array( 'render element' => 'form', 'file' => 'includes/imageflow.admin.inc', ), ); } /** * Implements hook_image_default_styles(). * * Provides default image style presets * that can be overridden by site administrators. */ function imageflow_image_default_styles() { $styles = array(); // Image preset for the reflect image. if (module_exists('imagecache_reflect')) { $styles['imageflow_reflect'] = array( 'effects' => array( array( 'name' => 'image_scale', 'data' => array('width' => 220, 'height' => 220, 'upscale' => 1), 'weight' => 0, ), array( 'name' => 'imagecache_reflect', 'data' => array( 'imagecache_reflect_color' => 'Black', 'imagecache_reflect_position' => 'bottom', 'imagecache_reflect_size' => '50%', 'imagecache_reflect_transparent_source' => FALSE, ), 'weight' => 0, ), ), ); } return $styles; } /** * Implements hook_views_api(). * * This tells drupal that there is Views integration file named * imageflow.views.inc */ function imageflow_views_api() { return array( 'api' => 3, ); } /** * Fetches all presets from the database. * * Returns all imageflow presets as an associative array. */ function imageflow_presets() { $presets = db_query("SELECT * FROM {imageflow_preset}")->fetchAllAssoc('name', PDO::FETCH_ASSOC); foreach ($presets as &$preset) { $preset['options'] = empty($preset['options']) ? array() : unserialize($preset['options']); } return $presets; } /** * Load a preset. * * Fetches the given preset and returns it as an associative array * or FALSE, if no set could be found. */ function imageflow_preset_load($preset_name) { $preset = db_query("SELECT * FROM {imageflow_preset} WHERE name = :name", array(':name' => $preset_name))->fetchAssoc(); if ($preset !== FALSE) { $preset['options'] = empty($preset['options']) ? array() : unserialize($preset['options']); } return $preset; } /** * Checks whether an preset with the given name already exists. */ function imageflow_preset_exists($preset_name) { return (imageflow_preset_load($preset_name) !== FALSE); } /** * Save the preset. * * Saves the given preset to the database. * Set the $new flag if this set has not been written before. */ function imageflow_preset_save($preset, $new = FALSE) { $preset += array( 'title' => $preset['name'], 'options' => array(), ); if ($new) { drupal_write_record('imageflow_preset', $preset); } else { drupal_write_record('imageflow_preset', $preset, 'name'); } return $preset; } /** * Deletes the given preset from the database. */ function imageflow_preset_delete($preset) { db_delete('imageflow_preset')->condition('name', $preset['name'])->execute(); return TRUE; } /** * Implements hook_libraries_info. */ function imageflow_libraries_info() { $libraries['imageflow'] = array( 'name' => 'Imageflow library', 'vendor url' => 'http://finnrudolph.de', 'download url' => 'http://finnrudolph.de/ImageFlow/Download', 'version arguments' => array( 'file' => 'imageflow.js', 'pattern' => '@(?i:Version:)\s+([0-9\.]+)@', 'lines' => 5, ), 'files' => array( 'js' => array('imageflow.packed.js'), 'css' => array('imageflow.packed.css'), ), 'variants' => array( 'minified' => array( 'files' => array( 'js' => array('imageflow.packed.js'), 'css' => array('imageflow.packed.css'), ), ), 'source' => array( 'files' => array( 'js' => array('imageflow.js'), 'css' => array('imageflow.css'), ), ), ), ); return $libraries; } /** * Implements hook_field_formatter_info(). * * Adds the imageflow format option within the manage display form of * of an image field. */ function imageflow_field_formatter_info() { return array( 'imageflow' => array( 'label' => t('imageflow'), 'field types' => array( 'image', 'node_reference', 'media', 'field_collection', ), 'settings' => array( 'imageflow_preset' => 'default', 'imageflow_reference_img_src' => NULL, 'imageflow_title_src' => NULL, 'imageflow_image_src' => NULL, 'imageflow_link_src' => NULL, ), ), ); } /** * Implements hook_field_formatter_settings_form(). * * Provides display settings form within the manage display page of * an image field with formatter imageflow. */ function imageflow_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) { $display = $instance['display'][$view_mode]; $settings = $display['settings']; $form = array(); // Show select box for the preset. $presets = array(); foreach (imageflow_presets() as $name => $preset) { $presets[$name] = check_plain($preset['title']); } $form['imageflow_preset'] = array( '#title' => t('preset'), '#type' => 'select', '#options' => $presets, '#default_value' => $settings['imageflow_preset'], ); // Show select box for image fields if formatting a node_reference field. if ($field['type'] == 'node_reference') { // Find all image fields. $image_fields = array(); $fields = field_info_fields(); $ref_node_types = array_filter($field['settings']['referenceable_types']); foreach ($ref_node_types as $ref_node_type) { foreach (field_info_instances('node', $ref_node_type) as $field_name => $field_instance) { if ($fields[$field_name]['type'] == 'image') { $image_fields[$field_name] = $field_name; } } } asort($image_fields); if (count($image_fields) == 0) { drupal_set_message(t('The referenced node type does not contain any valid image field(s).'), 'error'); return FALSE; } elseif (count($image_fields) == 1) { $keys = array_keys($image_fields); $key = $keys[0]; $form['imageflow_reference_img_src'] = array( '#type' => 'hidden', '#value' => $image_fields[$key], ); } elseif (count($image_fields) > 1) { $form['imageflow_reference_img_src'] = array( '#type' => 'select', '#title' => t('Image source field of the referenced content type'), '#options' => $image_fields, '#default_value' => isset($settings['imageflow_reference_img_src']) ? $settings['imageflow_reference_img_src'] : '', ); } } // Show select boxes for fields if we're formatting a field_collection field. if (($field['type'] == 'field_collection') || ($field['type'] == 'media')) { $form['imageflow_title_src'] = array( '#title' => t('Title field'), '#type' => 'select', '#default_value' => $settings['imageflow_title_src'], '#empty_option' => t('None'), '#options' => _imageflow_get_fields(array('text'), $field['type'], $field['field_name']), ); $form['imageflow_image_src'] = array( '#title' => t('Image field'), '#type' => 'select', '#default_value' => $settings['imageflow_image_src'], '#empty_option' => t('None'), '#options' => _imageflow_get_fields(array('image', 'imagefield_crop'), $field['type'], $field['field_name']), '#required' => TRUE, ); $form['imageflow_link_src'] = array( '#title' => t('Link field'), '#type' => 'select', '#default_value' => $settings['imageflow_link_src'], '#empty_option' => t('None'), '#options' => _imageflow_get_fields(array('link_field'), $field['type'], $field['field_name']), ); } return $form; } /** * This function retrieves fields for an entity. */ function _imageflow_get_fields($field_types, $entity_type, $field_name = '') { $links = array(); $fields = field_info_fields(); switch ($entity_type) { case 'media': $bundle = 'file'; $bundle_instance = 'image'; $entity_label = t('Media field:'); break; case 'field_collection': $bundle = 'field_collection_item'; $bundle_instance = $field_name; $entity_label = t('Field Collection field:'); break; } foreach ($fields as $name => $field) { if (in_array($bundle, array_keys($field['bundles'])) && in_array($bundle_instance, $field['bundles'][$bundle]) && in_array($field['type'], $field_types)) { $infos = field_info_instance($bundle, $name, $bundle_instance); $links[$name] = $entity_label . ' ' . $infos['label']; } } return $links; } /** * Implements hook_field_formatter_settings_summary(). * * Displays the summary of the set options of a imageflow formatted image field */ function imageflow_field_formatter_settings_summary($field, $instance, $view_mode) { $display = $instance['display'][$view_mode]; $settings = $display['settings']; $summary = array(); // Load preset. if (!empty($settings['imageflow_preset'])) { $o = imageflow_preset_load($settings['imageflow_preset']); if ($o !== FALSE) { $preset = $o; } } // Build settings summary. $preset = isset($preset) ? $preset['title'] : t('Default settings'); $summary[] = t('preset: %preset', array('%preset' => $preset)); if (isset($settings['imageflow_reference_img_src'])) { $summary[] = t('Image field of the referenced node: %field', array('%field' => $settings['imageflow_reference_img_src'])); } if (!empty($settings['imageflow_title_src'])) { $summary[] = t('Title source: %title', array('%title' => $settings['imageflow_title_src'])); } if (!empty($settings['imageflow_image_src'])) { $summary[] = t('Image source: %image', array('%image' => $settings['imageflow_image_src'])); } if (!empty($settings['imageflow_image_src'])) { $summary[] = t('Link source: %link', array('%link' => $settings['imageflow_link_src'])); } return implode('
', $summary); } /** * Implements hook_field_formatter_view(). * * Prepares a renderable array of images and adds the neccessary JS and CSS */ function imageflow_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) { $settings = $display['settings']; switch ($field['type']) { case 'node_reference': $items = imageflow_get_referenced_images($display['settings']['imageflow_reference_img_src']); break; case 'media': $image_items = array(); foreach ($items as $item) { if ($item['file']->type == 'image') { $file = (array) $item['file']; $file += array('alt' => '', 'title' => ''); $image_items[] = $file; } } $items = $image_items; break; case 'field_collection': $collection_items = array(); foreach ($items as $item) { $collections = (array) field_collection_field_get_entity($item); $collection_item = $collections[$settings['imageflow_image_src']][$langcode][0]; if (!empty($collections[$settings['imageflow_title_src']][$langcode][0]['value'])) { $collection_item['alt'] = $collections[$settings['imageflow_title_src']][$langcode][0]['value']; } if (!empty($collections[$settings['imageflow_link_src']][$langcode][0]['url'])) { $collection_item['attributes']['longdesc'] = $collections[$settings['imageflow_link_src']][$langcode][0]['url']; } $collection_items[] = $collection_item; } $items = $collection_items; break; } $element = array(); if (count($items) > 0) { $element[] = array( '#theme' => 'imageflow_container', '#items' => $items, '#settings' => $display['settings'], ); } return $element; } /** * Get referenced images. * * This function returns all images of an image field * whose name is passed in argument $field. */ function imageflow_get_referenced_images($field) { if (empty($field)) { drupal_set_message(t('The referenced field does not contain any image field.'), 'error'); return FALSE; } $fid_col_name = $field . '_fid'; $alt_col_name = $field . '_alt'; $title_col_name = $field . '_title'; $table = 'field_data_' . $field; $result = db_query('SELECT :fid, :alt, :title FROM {:table}', array( ':fid' => $fid_col_name, ':alt' => $alt_col_name, ':title' => $title_col_name, ':table' => $table, )); $images = array(); while ($row = $result->fetchAssoc()) { $image = (array) file_load($row[$fid_col_name]); $image['alt'] = $row[$alt_col_name]; $image['title'] = $row[$title_col_name]; $images[] = $image; } return $images; } /** * Loads the required JavaScripts and settings for a imageflow instance. */ function imageflow_add_js($id, $preset) { // Add the imageflow library. $library = libraries_detect('imageflow'); $path = $library['library path']; if (!$path) { drupal_set_message(t('The imageflow JavaScript file was not found in its path. Please refer to README.txt for installation instructions.'), 'error'); return; } else { $variant = variable_get('imageflow_library_variant'); libraries_load('imageflow', $variant); } // Add hardcoded JavaScript options. $preset['options']['ImageFlowID'] = 'imageflow-' . $id; $preset['options']['reflections'] = FALSE; if ($preset['lightbox'] != 'normal') { // Make sure colorbox is loaded. if (module_exists('colorbox')) { _colorbox_doheader(); if ($preset['lightbox'] == 'colorbox') { $preset['options']['onClick'] = 'function() {jQuery.colorbox({href:this.url,title:this.title});}'; } elseif ($preset['lightbox'] == 'colorboxiframe') { $preset['options']['onClick'] = 'function() {jQuery.colorbox({href:this.getAttribute("longdesc"),title:this.title,iframe:true,innerWidth:480,innerHeight:390});}'; } } } $js_settings = array( 'imageflow-' . $id => $preset['options'], ); drupal_add_js(array('imageflow' => $js_settings), 'setting'); // Load module js and css. drupal_add_js(drupal_get_path('module', 'imageflow') . '/js/imageflow.load.js'); drupal_add_css(drupal_get_path('module', 'imageflow') . '/css/imageflow.module.css'); }