diff --git a/galleria.module b/galleria.module index 0605ce8..0d67c6b 100644 --- a/galleria.module +++ b/galleria.module @@ -346,6 +346,8 @@ function galleria_field_formatter_info() { 'optionset' => 'default', 'title_field' => '', 'alt_field' => '', + 'link_field' => '', + 'layer_field' => '', 'referenced_fields' => array(), ), ), @@ -401,6 +403,20 @@ function galleria_field_formatter_settings_form($field, $instance, $view_mode, $ '#options' => $options, '#default_value' => isset($settings['title_field']) ? $settings['title_field'] : '' ); + $form['link_field'] = array( + '#description' => t('Select an optional field to draw image links from.'), + '#title' => t('Link field'), + '#type' => 'select', + '#options' => $options, + '#default_value' => isset($settings['link_field']) ? $settings['link_field'] : '' + ); + $form['layer_field'] = array( + '#description' => t('Select an optional field to draw image layers from.'), + '#title' => t('Layer field'), + '#type' => 'select', + '#options' => $options, + '#default_value' => isset($settings['layer_field']) ? $settings['layer_field'] : '' + ); } } @@ -468,7 +484,9 @@ function galleria_field_formatter_settings_summary($field, $instance, $view_mode if ($field['type'] == 'file') { // Prepare options list. if (!empty($settings['alt_field']) || - !empty($settings['title_field'])) { + !empty($settings['title_field']) || + !empty($settings['link_field']) || + !empty($settings['layer_field'])) { $bundles = field_info_instances('file'); // Determine if there are additional fields on the image instance. if (isset($bundles['image']) && !empty($bundles['image'])) { @@ -484,6 +502,12 @@ function galleria_field_formatter_settings_summary($field, $instance, $view_mode if (!empty($settings['title_field'])) { $summary[] = t('Title field: @title', array('@title' => $options[$settings['title_field']])); } + if (!empty($settings['link_field'])) { + $summary[] = t('Link field: @title', array('@title' => $options[$settings['link_field']])); + } + if (!empty($settings['layer_field'])) { + $summary[] = t('Layer field: @title', array('@title' => $options[$settings['layer_field']])); + } } // For node_reference fields: Referenced image fields @@ -629,6 +653,8 @@ function galleria_prepare_file_images($items, $settings, $langcode) { $image_fids = array(); $alt_field = empty($settings['alt_field']) ? FALSE : $settings['alt_field']; $title_field = empty($settings['title_field']) ? FALSE : $settings['title_field']; + $link_field = empty($settings['link_field']) ? FALSE : $settings['link_field']; + $layer_field = empty($settings['layer_field']) ? FALSE : $settings['layer_field']; // First pass, fetch the fids. We pass twice so we can minimize calls to // entity_load which is expensive to call multiple times. foreach ($items as $delta => $item) { @@ -643,7 +669,7 @@ function galleria_prepare_file_images($items, $settings, $langcode) { } } $file_entities = entity_load('file', $image_fids); - // Second pass, set the alt/title tag. + // Second pass, set the alt/title tag and layers/links. foreach ($items as $delta => $item) { if ($item['type'] == 'image') { $file_entity = $file_entities[$item['fid']]; @@ -659,6 +685,25 @@ function galleria_prepare_file_images($items, $settings, $langcode) { $items[$delta]['title'] = $title_field_items[0]['safe_value']; } } + if ($link_field) { + $link_field_items = field_get_items('file', $file_entity, $link_field, $langcode); + // Get link from link field url. + if (!empty($link_field_items[0]['url'])) { + $items[$delta]['link'] = $link_field_items[0]['url']; + } + // Or use unsanitized value from textfield and check if it's a valid url. + elseif (!empty($link_field_items[0]['value'])) { + if (valid_url($link_field_items[0]['value'])) { + $items[$delta]['link'] = $link_field_items[0]['value']; + } + } + } + if ($layer_field) { + $layer_field_items = field_get_items('file', $file_entity, $layer_field, $langcode); + if (!empty($layer_field_items[0]['safe_value'])) { + $items[$delta]['layer'] = $layer_field_items[0]['safe_value']; + } + } } } return $items; diff --git a/includes/views_plugin_style_galleria.inc b/includes/views_plugin_style_galleria.inc index cb85293..d984bd9 100644 --- a/includes/views_plugin_style_galleria.inc +++ b/includes/views_plugin_style_galleria.inc @@ -16,8 +16,7 @@ class views_plugin_style_galleria extends views_plugin_style { $options = parent::option_definition(); $options += array( - 'galleria_optionset' => array('default' => 'default'), - 'galleria_theme' => array('default' => 'classic'), + 'optionset' => array('default' => 'default'), ); return $options; @@ -38,12 +37,13 @@ class views_plugin_style_galleria extends views_plugin_style { foreach (galleria_optionsets_load_all() as $name => $optionset) { $optionsets[$name] = check_plain($optionset->title); } - $form['galleria']['galleria_optionset'] = array( + $form['galleria']['optionset'] = array( '#title' => t('Option set'), '#type' => 'select', '#options' => $optionsets, - '#default_value' => $this->options['galleria_optionset'], + '#default_value' => $this->options['optionset'], ); + // @TODO: Add form options for mapping fields to alt, title, link and layer in views. } /** @@ -58,11 +58,12 @@ class views_plugin_style_galleria extends views_plugin_style { } /** - * Searches for the image field to use. + * Searches for the galleria field to use. */ - function find_image_field() { + function find_galleria_field() { + $types = array('image', 'file'); foreach ($this->view->display_handler->get_handlers('field') as $id => $handler) { - if (($handler instanceof views_handler_field_field) && ($handler->field_info['type'] == 'image')) { + if (($handler instanceof views_handler_field_field) && (in_array($handler->field_info['type'], $types))) { return $id; break; } @@ -74,9 +75,9 @@ class views_plugin_style_galleria extends views_plugin_style { * Render the display in this style. */ function render() { - $image_field = $this->find_image_field(); - if ($image_field === FALSE) { - drupal_set_message(t('Style @style requires an image field to be added.', array('@style' => $this->definition['title'])), 'error'); + $galleria_field = $this->find_galleria_field(); + if ($galleria_field === FALSE) { + drupal_set_message(t('Style @style requires an image or file (media) field to be added.', array('@style' => $this->definition['title'])), 'error'); return; } @@ -90,10 +91,11 @@ class views_plugin_style_galleria extends views_plugin_style { array( 'view' => $this->view, 'options' => $this->options, - 'img_field_name' => $image_field, + 'galleria_field_name' => $galleria_field, 'rows' => $rows, - 'title' => $title) - ); + 'title' => $title + ) + ); } return $output; } diff --git a/theme/galleria-container.tpl.php b/theme/galleria-container.tpl.php index a8e5690..253aa11 100644 --- a/theme/galleria-container.tpl.php +++ b/theme/galleria-container.tpl.php @@ -4,6 +4,4 @@ * Default output for a galleria node. */ ?> -
- -
+
diff --git a/theme/theme.inc b/theme/theme.inc index ec1e7c4..5885ed8 100644 --- a/theme/theme.inc +++ b/theme/theme.inc @@ -9,6 +9,9 @@ /** * Template preprocess handler for 'galleria_container' theme. + * + * Builds the items "data" array. + * @see http://galleria.io/docs/references/data/ */ function template_preprocess_galleria_container(&$vars) { // Each Galleria instance gets a unique id @@ -24,55 +27,80 @@ function template_preprocess_galleria_container(&$vars) { $optionset = galleria_optionset_load('default'); } - // Attach Galleria JavaScript - galleria_add_js($galleria_id, $optionset); - // Prepare image elements $items = $vars['items']; - $vars['items'] = array(); - $thumb_style = empty($optionset->imagestyle_thumb) ? 'galleria_thumb' : $optionset->imagestyle_thumb; + + // All files, text, and html will be added via our "data" array + $data = array(); + + // Cycle through $items and add them to our data array foreach ($items as $delta => $item) { // Stop errors for empty URI. See issue [#1319268] for details. if (empty($item['uri'])) { continue; } - // Get URL for "normal" image - if (empty($optionset->imagestyle_normal)) { - $normal_url = file_create_url($item['uri']); - } - else { - $normal_url = image_style_url($optionset->imagestyle_normal, $item['uri']); - } + // If our $item is an "image" add this to the data array + if ($item['type'] == 'image') { + // Get URL for "thumbnail" image + if (empty($optionset->imagestyle_thumb)) { + $data[$delta]['thumb'] = file_create_url($item['uri']); + } + else { + $data[$delta]['thumb'] = image_style_url($optionset->imagestyle_thumb, $item['uri']); + } - // Get URL for "big" image (for lightbox and fullscreen) - if (empty($optionset->imagestyle_big)) { - $big_url = file_create_url($item['uri']); - } - elseif ($optionset->imagestyle_big != $optionset->imagestyle_normal) { - $big_url = image_style_url($optionset->imagestyle_big, $item['uri']); + // Get URL for "normal" image + if (empty($optionset->imagestyle_normal)) { + $data[$delta]['image'] = file_create_url($item['uri']); + } + else { + $data[$delta]['image'] = image_style_url($optionset->imagestyle_normal, $item['uri']); + } + + // Get URL for "big" image (for lightbox and fullscreen) + if (empty($optionset->imagestyle_big)) { + $data[$delta]['big'] = file_create_url($item['uri']); + } + else { + $data[$delta]['big'] = image_style_url($optionset->imagestyle_big, $item['uri']); + } + + // Get slide "title" + if (!empty($item['title'])) { + $data[$delta]['title'] = $item['title']; + } + + // Get slide "description" + if (!empty($item['alt'])) { + $data[$delta]['description'] = $item['alt']; + } + + // Get slide "link" + if (isset($item['link'])) { + $data[$delta]['link'] = $item['link']; + } + + // Get slide "layer" + if (isset($item['layer'])) { + $data[$delta]['layer'] = $item['layer']; + } } - if (!empty($big_url)) { - $options = array( - 'attributes' => array( - 'rel' => $big_url, - ) + // If our $item is a "video" add this to the data array + elseif ($item['type'] == 'video') { + $data[$delta] = array( + 'video' => file_create_url($item['uri']), + 'title' => $item['filename'], ); } - else { - $options = array(); - } - $vars['items'][$delta] = array( - '#theme' => 'image_formatter', - '#item' => $item, - '#image_style' => $thumb_style, - '#path' => array( - 'path' => $normal_url, - 'options' => $options, - ), - ); } + + // Add "data" array to galleria option "dataSource" + $optionset->options['dataSource'] = $data; + + // Attach Galleria JavaScript + galleria_add_js($galleria_id, $optionset); } /** @@ -82,14 +110,14 @@ function theme_views_view_galleria($vars) { $items = array(); $view = $vars['view']; - $img_field_name = $vars['img_field_name']; + $galleria_field_name = $vars['galleria_field_name']; foreach ($vars['rows'] as $row) { $lang = $row->_field_data[$view->base_field]['entity']->language; - // omit rows without image field. - if (!isset($row->_field_data[$view->base_field]['entity']->{$img_field_name})) { + // omit rows without image or file field. + if (!isset($row->_field_data[$view->base_field]['entity']->{$galleria_field_name})) { continue; } - $item = $row->_field_data[$view->base_field]['entity']->{$img_field_name}[$lang][0]; + $item = $row->_field_data[$view->base_field]['entity']->{$galleria_field_name}[$lang][0]; $items[] = $item; }