'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');
}