You are here

grid_field_formatter.module in Grid Field Formatter 7

Module that gives you a field formatter, which enables field layout with Grid contents to a destination.

File

grid_field_formatter.module
View source
<?php

/**
 * @file
 * Module that gives you a field formatter, which enables field layout with 
 * Grid contents to a destination.
 */
define('GRID_FIELD_FORMATTER_DEFAULT_COLUMNS', 1);

/**
 * Implements hook_menu().
 */
function grid_field_formatter_menu() {
  $items = array();
  $items['admin/config/content/grid-field-formatter'] = array(
    'title' => 'Grid Field Formatter Settings',
    'description' => 'Configuration form page for the Grid Field Formatter supported field types.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'grid_field_formatter_settings',
    ),
    'file' => 'grid_field_formatter.admin.inc',
    'access arguments' => array(
      'administer site configuration',
    ),
  );
  return $items;
}

/**
 * Implements hook_field_formatter_info_alter().
 */
function grid_field_formatter_field_formatter_info_alter(&$infos) {
  $field_types = variable_get('grid_field_formatter_field_types', array());

  // Only alter formatter forms for selected field types.
  if (empty($field_types)) {
    return;
  }
  $enable_field_type = array_filter($field_types);
  $enabled_field_formatter = array();
  foreach ($infos as $formatter_name => &$info) {

    // Add a settings array if no settings were found.
    if (!isset($info['settings']) || !is_array($info['settings'])) {
      $info['settings'] = array();
    }

    // Ensure the 'field types' index exists before processing formatters.
    if (isset($info['field types'])) {
      $info_types = $info['field types'];
      foreach ($info_types as $type) {
        if (in_array($type, $enable_field_type)) {

          // Add two properties to field formatter settings.
          $info['settings'] += array(
            'grid_field_formatter' => array(
              'grid_enable' => FALSE,
              'columns' => GRID_FIELD_FORMATTER_DEFAULT_COLUMNS,
            ),
          );
          $enabled_field_formatter[] = $formatter_name;
        }
      }
    }
  }
  $enabled_field_formatter = array_unique($enabled_field_formatter);

  // Cache the enabled field formatter.
  cache_set('enabled_field_formatter', serialize($enabled_field_formatter));
}

/**
 * Implements hook_field_formatter_settings_summary_alter().
 */
function grid_field_formatter_field_formatter_settings_summary_alter(&$summary, $context) {
  $enabled_field_formatter = array();
  $enabled_field_formatter = grid_field_formatter_get_enabled_field_formatter();
  $display = $context['instance']['display'][$context['view_mode']];
  $settings = $display['settings'];
  $type = $display['type'];

  // Break when no grid_enable field settings were found.
  if (!isset($settings['grid_field_formatter']) || !in_array($type, $enabled_field_formatter)) {
    return;
  }
  elseif (empty($settings['grid_field_formatter']['grid_enable'])) {
    $summary .= ' ';
    return;
  }

  // Normalize the settings.
  $grid_enable = $settings['grid_field_formatter']['grid_enable'];
  $columns = $settings['grid_field_formatter']['columns'];
  $summary_items = array();
  $summary_items[] = $summary;
  $summary_items[] = t('Multi-value Grid display: enabled');
  $summary_items[] = t('Number of columns: @columns', array(
    '@columns' => $columns,
  ));
  $summary = implode('<br/>', $summary_items);
}

/**
 * Implements hook_field_formatter_settings_form_alter().
 * 
 * Add additional field settings for the Grid Field Formatter.
 */
function grid_field_formatter_field_formatter_settings_form_alter(&$settings_form, $context) {
  $enabled_field_formatter = array();
  $enabled_field_formatter = grid_field_formatter_get_enabled_field_formatter();
  $field = $context['field'];
  $entity_type = $context['instance']['entity_type'];
  $display = $context['instance']['display'][$context['view_mode']];
  $settings = $display['settings'];
  $type = $display['type'];

  // Break when no Grid Field Formatter settings were found.
  if (!isset($settings['grid_field_formatter']) || !in_array($type, $enabled_field_formatter)) {
    return;
  }
  $settings['grid_field_formatter']['grid_enable'] = isset($settings['grid_field_formatter']['grid_enable']) ? $settings['grid_field_formatter']['grid_enable'] : FALSE;
  $settings['grid_field_formatter']['columns'] = isset($settings['grid_field_formatter']['columns']) ? $settings['grid_field_formatter']['columns'] : '';
  $settings_form['grid_field_formatter'] = array(
    '#type' => 'container',
    '#attributes' => array(
      'class' => array(
        'grided-field-wrapper',
      ),
    ),
  );

  // Add a checkbox to the formatter settings form to enabled a grid layout.
  $settings_form['grid_field_formatter']['grid_enable'] = array(
    '#title' => t('Enable multi-value field display with a grid layout.'),
    '#type' => 'checkbox',
    '#default_value' => $settings['grid_field_formatter']['grid_enable'],
  );

  // Add a conditional text field for the number of columns of the grid.
  $settings_form['grid_field_formatter']['columns'] = array(
    '#title' => t('Grid layout number of columns'),
    '#type' => 'textfield',
    '#default_value' => isset($settings['grid_field_formatter']['columns']) ? $settings['grid_field_formatter']['columns'] : GRID_FIELD_FORMATTER_DEFAULT_COLUMNS,
    '#description' => t('Enter the number of columns for each row for the grid table layout.'),
    '#element_validate' => array(
      'grid_field_formatter_element_validate_columns',
    ),
    '#states' => array(
      'visible' => array(
        'input[name$="[settings][grid_field_formatter][grid_enable]"]' => array(
          'checked' => TRUE,
        ),
      ),
    ),
  );
}

/**
 * Implements hook_field_attach_view_alter().
 */
function grid_field_formatter_field_attach_view_alter(&$output, $context) {
  foreach (element_children($output) as $field_name) {
    $enabled_field_formatter = array();
    $enabled_field_formatter = grid_field_formatter_get_enabled_field_formatter();
    $element = $output[$field_name];
    $instance = field_info_instance($element['#entity_type'], $field_name, $element['#bundle']);
    $display = isset($instance['display'][$context['view_mode']]) ? $instance['display'][$context['view_mode']] : $instance['display']['default'];
    $settings = $display['settings'];
    $type = $display['type'];
    $field = field_info_field($field_name);

    // Continue when no Grid Field Formatter settings were found.
    if (!isset($settings['grid_field_formatter']) || empty($settings['grid_field_formatter']['grid_enable']) || !in_array($type, $enabled_field_formatter)) {
      continue;
    }

    // Override field theme with grid_field_formatter.
    $output[$field_name]['#theme'] = 'grid_field_formatter';

    // Columns is a property so it should start with a #, see drupal_render.
    $output[$field_name]['#columns'] = isset($settings['grid_field_formatter']['columns']) ? $settings['grid_field_formatter']['columns'] : 1;
  }
}

/**
 * Form element validation handler for columns field in settings form.
 */
function grid_field_formatter_element_validate_columns($element, &$form_state) {
  $value = $element['#value'];

  // The number of columns must be valid number and greater than 0.
  if (!(is_numeric($value) && $value > 0)) {
    form_error($element, t('The number of columns must be valid number and greater than 0.'));
  }
}

/**
 * Implements hook_theme().
 */
function grid_field_formatter_theme($existing, $type, $theme, $path) {
  return array(
    'grid_field_formatter' => array(
      'render element' => 'element',
      'template' => 'grid-field-formatter',
    ),
  );
}

/**
 * Theme preprocess function for grid_field_formatter. 
 *
 * This function essentially extends the core field module theming methods, in
 * particular template_preprocess_field. It also introduces new field template
 * suggestions such as:
 *   - grid-field-formatter.tpl.php
 *   - grid-field-formatter--[FIELD_TYPE].tpl.php
 *   - grid-field-formatter--[FIELD_NAME].tpl.php
 *   - grid-field-formatter--[FIELD_NAME]--[BUNDLE].tpl.php
 *
 * @see grid-field-formatter.tpl.php
 */
function template_preprocess_grid_field_formatter(&$variables, $hook) {

  // Extend the core field module theming functions.
  template_preprocess_field($variables, $hook);
  $variables['columns'] = $variables['element']['#columns'];

  // Add specific suggestions that can override the default implementation.
  $variables['theme_hook_suggestions'] = array(
    'grid_field_formatter__' . $variables['element']['#field_type'],
    'grid_field_formatter__' . $variables['element']['#field_name'],
    'grid_field_formatter__' . $variables['element']['#field_name'] . '__' . $variables['element']['#bundle'],
  ) + $variables['theme_hook_suggestions'];
}

/**
 * Helper function: Get enabled the field formatter.
 * 
 * Get all enabled the field formatter.
 * 
 * @return array
 *   Return all enabled the field formatter.
 */
function grid_field_formatter_get_enabled_field_formatter() {
  $enabled_field_formatter_cache = cache_get('enabled_field_formatter');
  $enabled_field_formatter = isset($enabled_field_formatter_cache->data) ? unserialize($enabled_field_formatter_cache->data) : array();
  return $enabled_field_formatter;
}

/**
 * Helper function: Get an array of all fields formatted for an options list.
 * 
 * @return array
 *   A formatted array of options with value and label.
 */
function grid_field_formatter_field_types_options_list() {
  $options = array();
  foreach (field_info_field_types() as $type_name => $type) {
    $options[$type_name] = $type['label'];
  }
  return $options;
}

Functions

Constants

Namesort descending Description
GRID_FIELD_FORMATTER_DEFAULT_COLUMNS @file Module that gives you a field formatter, which enables field layout with Grid contents to a destination.