You are here

field_multiple_classes.module in Field multiple classes 7

Provides formatter settings for classes on multi-value fields.

Based on Field Multiple Limit module (http://drupal.org/project/field_multiple_limit).

File

field_multiple_classes.module
View source
<?php

/**
 * @file
 * Provides formatter settings for classes on multi-value fields.
 *
 * Based on Field Multiple Limit module (http://drupal.org/project/field_multiple_limit).
 */

/**
 * Implements hook_field_formatter_info_alter().
 */
function field_multiple_classes_field_formatter_info_alter(&$info) {

  // Added to all formatters.
  foreach ($info as $formatter_key => &$formatter) {
    $formatter['settings']['field_multiple_classes'] = 0;
    $formatter['settings']['field_multiple_classes_every'] = 3;
  }
}

/**
 * Implements hook_field_formatter_settings_summary_alter().
 */
function field_multiple_classes_field_formatter_settings_summary_alter(&$summary, $context) {
  if ($context['field']['cardinality'] > 1 || $context['field']['cardinality'] == FIELD_CARDINALITY_UNLIMITED) {
    $settings = $context['instance']['display'][$context['view_mode']]['settings'];
    if (!empty($summary)) {
      $summary .= '<br />';
    }
    if (!empty($settings['field_multiple_classes']) && $settings['field_multiple_classes'] == 1) {
      $summary .= t('Add first and last classes to field-item div.');
    }
    else {
      $summary .= t('Do not add first and last classes into field-item div.');
    }
    if (!empty($settings['field_multiple_classes']) && $settings['field_multiple_classes'] == 1) {
      $summary .= '<br />' . t('Add last class every @n item', array(
        '@n' => $settings['field_multiple_classes_every'],
      ));
    }
  }
}

/**
 * Implements hook_field_formatter_settings_form_alter().
 */
function field_multiple_classes_field_formatter_settings_form_alter(&$settings_form, $context) {
  if ($context['field']['cardinality'] > 1 || $context['field']['cardinality'] == FIELD_CARDINALITY_UNLIMITED) {
    $settings = $context['instance']['display'][$context['view_mode']]['settings'];
    $settings_form['field_multiple_classes'] = array(
      '#type' => 'checkbox',
      '#title' => t('Add first and last class to field-item div'),
      '#default_value' => $settings['field_multiple_classes'],
    );
    $settings_form['field_multiple_classes_every'] = array(
      '#type' => 'select',
      '#title' => t('Add last class every n item'),
      '#options' => drupal_map_assoc(range(2, 10)),
      '#default_value' => $settings['field_multiple_classes_every'],
    );
  }
}

/**
 * Implements hook_preprocess_field().
 *
 * @todo make $delimiter available as a template variable
 *    combine with count($items) to determine if multivalue
 *    provide a new field.tpl.php ?
 */
function field_multiple_classes_preprocess_field(&$variables, $hook) {
  $count = count($variables['items']);
  if (!isset($variables['items'][0]['#display_settings']['field_multiple_classes'])) {
    return;
  }
  $multiple_classes_enabled = $variables['items'][0]['#display_settings']['field_multiple_classes'];
  if ($multiple_classes_enabled == 0 || $count < 2) {
    return;
  }
  $every = $multiple_classes_enabled = $variables['items'][0]['#display_settings']['field_multiple_classes_every'];
  $start = 1;
  foreach ($variables['items'] as $delta => $item) {
    if ($start == 1) {
      $variables['item_multiple_extra_class_array'][$delta] = 'first';
    }
    else {
      if ($start == $every) {
        $variables['item_multiple_extra_class_array'][$delta] = 'last';
        $start = 0;
      }
    }
    $start++;
  }
}

/**
 * Implements hook_theme_registry_alter();
 */
function field_multiple_classes_theme_registry_alter(&$theme_registry) {
  $theme_registry['field']['function'] = 'theme_field_multiple_classes';
}
function theme_field_multiple_classes($variables) {
  if (count($variables['items']) < 2) {
    return theme_field($variables);
  }
  $output = '';

  // Render the label, if it's not hidden.
  if (!$variables['label_hidden']) {
    $output .= '<div class="field-label"' . $variables['title_attributes'] . '>' . $variables['label'] . ':&nbsp;</div>';
  }

  // Render the items.
  $output .= '<div class="field-items"' . $variables['content_attributes'] . '>';
  foreach ($variables['items'] as $delta => $item) {
    $classes = array();
    $classes[] = 'field-item';
    if (isset($variables['item_multiple_extra_class_array'][$delta])) {
      $classes[] = $variables['item_multiple_extra_class_array'][$delta];
    }
    $classes[] = $delta % 2 ? 'odd' : 'even';
    $output .= '<div class="' . implode(' ', $classes) . '"' . $variables['item_attributes'][$delta] . '>' . drupal_render($item) . '</div>';
  }
  $output .= '</div>';

  // Render the top-level DIV.
  $output = '<div class="' . $variables['classes'] . '"' . $variables['attributes'] . '>' . $output . '</div>';
  return $output;
}