You are here

function _content_multigroup_fieldgroup_view in Content Construction Kit (CCK) 6.3

Implementation of hook_fieldgroup_view().

1 call to _content_multigroup_fieldgroup_view()
content_multigroup_fieldgroup_view in modules/content_multigroup/content_multigroup.module
Implementation of hook_fieldgroup_view().

File

modules/content_multigroup/content_multigroup.node_view.inc, line 11
Implementation of node view functions for content multigroup.

Code

function _content_multigroup_fieldgroup_view(&$node, &$element, $group, $context) {
  drupal_add_css(drupal_get_path('module', 'content_multigroup') . '/content_multigroup.css');
  $node_copy = drupal_clone($node);
  $group_name = $group['group_name'];
  $group_class = 'content-multigroup-' . str_replace('_', '-', $group_name);
  $group_multiple = (int) $group['settings']['multigroup']['multiple'];
  $subgroup_settings = isset($group['settings']['multigroup']['subgroup']) ? $group['settings']['multigroup']['subgroup'] : array();
  $show_label = isset($subgroup_settings['label']) ? $subgroup_settings['label'] : 'above';
  $subgroup_labels = isset($group['settings']['multigroup']['labels']) ? $group['settings']['multigroup']['labels'] : array();
  $subgroup_format = isset($subgroup_settings[$context]['format']) ? $subgroup_settings[$context]['format'] : 'fieldset';
  $content_type = content_types($group['type_name']);

  // Build list of accessible fields in this group.
  $group_fields = array();
  foreach ($content_type['fields'] as $field_name => $field) {
    if (isset($group['fields'][$field_name]) && isset($element[$field_name])) {
      if (!isset($element[$field_name]['#access']) || $element[$field_name]['#access']) {
        $group_fields[$field_name] = $field;
      }
    }
  }
  switch ($group_multiple) {
    case 0:
      $group_deltas = array(
        0,
      );
      break;
    case 1:

      // Compute unique deltas from all deltas used by fields in this multigroup.
      $group_deltas = array();
      foreach (array_keys($group_fields) as $field_name) {
        if (is_array($node->content[$field_name]['field']['items'])) {
          foreach (array_keys($node->content[$field_name]['field']['items']) as $delta) {
            $group_deltas[$delta] = $delta;
          }
        }
      }
      sort($group_deltas);
      break;
    default:
      $group_deltas = range(0, $group_multiple - 1);
      break;
  }
  foreach ($group_deltas as $index => $delta) {
    $element[$delta] = array(
      '#title' => $show_label == 'above' && !empty($subgroup_labels[$index]) ? check_plain(t($subgroup_labels[$index])) : '',
      '#attributes' => array(
        'class' => 'content-multigroup-wrapper content-multigroup-' . $index,
      ),
      '#weight' => $delta,
    );

    // Create a pseudo node that only has the value we want in this group and
    // pass it to the formatter.
    // @TODO Watch this change and be sure it doesn't break anything else.
    // The delta was previously always set to '1' to keep CCK's inline label
    // from assigning a class of 'first'. But changing it back to the right
    // delta for the individual item makes the formatters easier to manage
    // since the delta is always the correct delta and not occasionally
    // a bogus value. It aslo fixes issues like http://drupal.org/node/766734
    // by keeping the layout of multigroups the same as other fieldgroups.
    foreach (array_keys($group_fields) as $field_name) {
      if (isset($node->content[$field_name])) {
        $node_copy->content[$field_name]['field']['items'] = array(
          $delta => isset($node->content[$field_name]['field']['items'][$delta]) ? $node->content[$field_name]['field']['items'][$delta] : NULL,
        );
        $element[$delta][$field_name] = $node_copy->content[$field_name];
        $element[$delta][$field_name]['#delta'] = $delta;
      }
    }
    switch ($subgroup_format) {
      case 'simple':
        $element['#attributes']['class'] = $group_class;
        $element[$delta]['#theme'] = 'content_multigroup_display_simple';
        $element[$delta]['#fields'] = $group_fields;
        break;
      case 'fieldset_collapsed':
        $element[$delta]['#collapsed'] = TRUE;
      case 'fieldset_collapsible':
        $element[$delta]['#collapsible'] = TRUE;
      case 'fieldset':
        $element['#attributes']['class'] = $group_class;
        $element[$delta]['#type'] = 'content_multigroup_display_fieldset';
        $element[$delta]['#fields'] = $group_fields;
        break;
      case 'hr':
        $element['#attributes']['class'] = $group_class;
        $element[$delta]['#theme'] = 'content_multigroup_display_hr';
        $element[$delta]['#fields'] = $group_fields;
        break;
      case 'table-single':
        $element['#theme'] = 'content_multigroup_display_table_single';
        $element['#attributes']['class'] = $group_class . ' content-multigroup-display-table-single-column';
        $element['#fields'] = $group_fields;
        break;
      case 'table-multiple':
        $element['#theme'] = 'content_multigroup_display_table_multiple';
        $element['#attributes']['class'] = $group_class . ' content-multigroup-display-table-multiple-columns';
        $element['#fields'] = $group_fields;
        break;
      case 'ul':
        $element['#theme'] = 'content_multigroup_display_ul';
        $element['#attributes']['class'] = $group_class;
        $element['#fields'] = $group_fields;
        break;
    }
  }

  // Unset the original group field values now that we've moved them.
  foreach (array_keys($group_fields) as $field_name) {
    if (isset($element[$field_name])) {
      unset($element[$field_name]);
    }
  }
}