You are here

foundation_group.module in ZURB Section 7

File

foundation_group.module
View source
<?php

/**
 * Implements hook_ctools_plugin_api().
 */
function foundation_group_ctools_plugin_api($module, $api) {
  if ($module == 'field_group' && $api == 'field_group') {
    return array(
      'version' => 1,
    );
  }
}

/**
 * Implements hook_theme().
 */
function foundation_group_theme() {
  return array(
    'foundation_tabs' => array(
      'template' => 'templates/foundation-tabs',
      'variables' => array(
        'items' => array(),
        'group' => NULL,
      ),
    ),
    'foundation_accordion' => array(
      'template' => 'templates/foundation-accordion',
      'variables' => array(
        'items' => array(),
        'group' => NULL,
      ),
    ),
  );
}

/**
 * Implements hook_field_group_formatter_info().
 * @return array
 */
function foundation_group_field_group_formatter_info() {
  $group_additions = array(
    'foundation_group_tabs' => array(
      'label' => t('Foundation Tabs container'),
      'description' => t('This field group type renders the items of multiple fields in the group as single container.'),
      'format_types' => array(
        'open',
      ),
      'instance_settings' => array(
        'classes' => '',
      ),
      'default_formatter' => 'open',
    ),
    'foundation_group_tab' => array(
      'label' => t('Foundation Tab item'),
      'description' => t('This field group type renders the items of a tab within a Foundation container tab.'),
      'format_types' => array(
        'open',
      ),
      'instance_settings' => array(
        'classes' => '',
      ),
      'default_formatter' => 'open',
    ),
    'foundation_group_accordion' => array(
      'label' => t('Foundation Accordion container'),
      'description' => t('This field group type renders the items of multiple fields in the group as single container.'),
      'format_types' => array(
        'open',
      ),
      'instance_settings' => array(
        'classes' => '',
      ),
      'default_formatter' => 'open',
    ),
    'foundation_group_accordion_item' => array(
      'label' => t('Foundation Accordion item'),
      'description' => t('This field group type renders the items of an accordion within a Foundation Accordion tab.'),
      'format_types' => array(
        'open',
      ),
      'instance_settings' => array(
        'classes' => '',
      ),
      'default_formatter' => 'open',
    ),
  );
  return array(
    'display' => $group_additions,
  );
}

/**
 * Implements hook_field_group_attach_groups_alter().
 * @param $groups
 */
function foundation_group_field_group_attach_groups_alter(&$groups) {

  // if passed array is empty, do nothing
  if (!count($groups)) {
    return;
  }
  $types = _foundation_group_get_types();
  $parents = array();
  foreach ($groups as $key => $group) {
    if (in_array($group->format_type, $types)) {
      unset($groups[$key]);
      $parents[$key] = $group;
    }
  }
  if (count($parents)) {
    $groups += $parents;
  }
}

/**
 * Implements hook_field_group_pre_render().
 * @param $element
 * @param $group
 * @param $form
 */
function foundation_group_field_group_pre_render(&$element, $group, &$form) {
  field_group_pre_render_prepare($group);
  $types = _foundation_group_get_types();
  if (!in_array($group->format_type, $types)) {
    return;
  }
  $fields = array();
  foreach ($group->children as $field_name) {
    $fields[$element[$field_name]['#weight']] = $element[$field_name];
  }
  ksort($fields);
  $fields = array_values($fields);
  $element['#items'] = $fields;
  $element['#group'] = $group;
}

/**
 * Implements field_group_pre_render_<format-type>.
 * @param $element
 * @param $group
 * @param $form
 */
function field_group_pre_render_foundation_group_tabs(&$element, $group, &$form) {
  $element += array(
    '#type' => 'foundation_tabs',
    '#theme' => 'foundation_tabs',
    '#title' => check_plain(t($group->label)),
    '#attributes' => array(
      'class' => explode(' ', $group->classes),
      'id' => _foundation_group_convert_label_to_tab_id($group->label),
    ),
    '#description' => $group->description,
    '#parents' => array(
      $group->parent_name,
    ),
  );
}

/**
 * Implements field_group_pre_render_<format-type>.
 * @param $element
 * @param $group
 * @param $form
 */
function field_group_pre_render_foundation_group_tab(&$element, $group, &$form) {
  $element += array(
    '#type' => 'foundation_tab',
    '#group' => $group->parent_name,
    '#title' => check_plain(t($group->label)),
    '#attributes' => array(
      'class' => explode(' ', $group->classes),
      'id' => _foundation_group_convert_label_to_tab_id($group->label),
    ),
    '#description' => $group->description,
    '#parents' => array(
      $group->parent_name,
    ),
  );
}

/**
 * Implements field_group_pre_render_<format-type>.
 * @param $element
 * @param $group
 * @param $form
 */
function field_group_pre_render_foundation_group_accordion(&$element, &$group, &$form) {
  $element += array(
    '#type' => 'foundation_accordion',
    '#theme' => 'foundation_accordion',
    '#title' => check_plain(t($group->label)),
    '#attributes' => array(
      'class' => explode(' ', $group->classes),
      'id' => _foundation_group_convert_label_to_tab_id($group->label),
    ),
    '#description' => $group->description,
    '#parents' => array(
      $group->parent_name,
    ),
  );
}

/**
 * Implements field_group_pre_render_<format-type>.
 * @param $element
 * @param $group
 * @param $form
 */
function field_group_pre_render_foundation_group_accordion_item(&$element, $group, &$form) {
  $element += array(
    '#type' => 'foundation_accordion_item',
    '#title' => check_plain(t($group->label)),
    '#attributes' => array(
      'class' => explode(' ', $group->classes),
      'id' => _foundation_group_convert_label_to_tab_id($group->label),
    ),
    '#description' => $group->description,
    '#parents' => array(
      $group->parent_name,
    ),
  );
}

/**
 * Implements template_preprocess_foundation_tabs().
 * @param $variables
 */
function template_preprocess_foundation_tabs(&$variables) {
  $variables['tab_row_classes'] = $variables['group']->classes;
  if (preg_match('/contained/', $variables['group']->classes)) {
    $variables['tab_content_classes'] = 'contained';
  }
  foreach ($variables['items'] as $key => $item) {
    $variables['tab_parents'][] = array(
      'title' => l(check_plain($item['#title']), NULL, array(
        'fragment' => $item['#attributes']['id'],
        'external' => TRUE,
      )),
    );
    $variables['tab_children'][] = array(
      'id' => _foundation_group_convert_label_to_tab_id($item['#title'], TRUE),
      'content' => drupal_render($item),
      'class' => implode(' ', $item['#attributes']['class']),
    );
  }

  // defaults
  if (count($variables['tab_parents'])) {
    $variables['tab_parents'][0]['class'] = 'active';
  }
  if (count($variables['tab_children'])) {
    $variables['tab_children'][0]['class'] .= ' active';
  }
  if (count($variables['tab_parents']) && count($variables['tab_children'])) {
    $variables['has_tabs'] = TRUE;
  }
}

/**
 * Implements template_preprocess_foundation_accordion().
 * @param $variables
 */
function template_preprocess_foundation_accordion(&$variables) {
  $variables['extra_classes'] = $variables['group']->classes;
  foreach ($variables['items'] as $key => $item) {
    $variables['accordions'][] = array(
      'title' => check_plain($item['#title']),
      'content' => drupal_render($item),
    );
  }

  // defaults
  if (count($variables['accordions'])) {
    $variables['accordions'][0]['list_class'] = 'active';
    $variables['has_content'] = TRUE;
  }
}

/**
 * Convert a group label to a usable HTML id attribute.
 * @param $title
 * @param $target
 * @return mixed
 */
function _foundation_group_convert_label_to_tab_id($title, $target = FALSE) {
  $id = drupal_strtolower(check_plain(t($title)));
  $id = preg_replace('/[^\\da-z]/i', '', $id);
  return $target ? $id . 'Tab' : $id;
}

/**
 * Return parent group types.
 * @return array
 */
function _foundation_group_get_types() {
  return array(
    'foundation_group_tabs',
    'foundation_group_accordion',
  );
}