You are here

function ds_render_content in Display Suite 6.2

Same name and namespace in other branches
  1. 6.3 includes/ds.api.inc \ds_render_content()
  2. 6 ds.module \ds_render_content()

Render content for an object.

Parameters

object $object: The object to manipulate.

string $module: The module that is requesting.

array $vars: The variables required for rendering.

string $theme_function: The theming function for a field.

Return value

mixed Result of the render.

Deprecated

This function is a builder, use the statically cached ds_render

2 calls to ds_render_content()
ds_render in ./ds.module
API function to return rendered content for an item
views_plugin_ds_fields_view::ds_fields_render in views/views_plugin_ds_fields_view.inc
Render the fields.

File

./ds.module, line 573
Core functions for the Display Suite module.

Code

function ds_render_content(&$object, $module, $vars, $theme_function = DS_DEFAULT_THEME_FIELD) {

  /*
   * Basic object set up
   */

  // Object to hold our complete rendered object.
  $object_display = new stdClass();

  // Sort regions to get them in the right order for rendering.
  $object_display->active_regions = array();
  $object_display->all_regions = ds_regions('all', TRUE);
  foreach ($object_display->all_regions as $region_name => $region) {
    if (isset($vars['regions'][$region_name]) && !empty($vars['regions'][$region_name])) {
      $object_display->active_regions[$region_name] = $vars['regions'][$region_name];
    }
  }

  // Only themed regions.
  $object_display->themed_regions = array();

  // Classes for regions.
  $object_display->region_classes = array();

  // Build mode for this object.
  $object_display->build_mode = $object->build_mode;

  // API info for this module and type. This doesn't cost a lot
  // since it will be cached already in ds_build_fields_and_regions().
  $object_display->api_info = ds_api_info($module, $object->type);

  // Display settings for this module and object.
  $object_display->display_settings = ds_get_settings($module, $object->type, $object->build_mode);
  $object_display->region_styles = ds_default_value($object_display->display_settings, 'region_styles');

  /*
   * Give field types an opportunity to change settings before we sort groups
   */
  foreach ($object->ds_fields as $key => $field) {
    switch ($field['field_type']) {
      case DS_FIELD_TYPE_PREPROCESS:
        if (!empty($field['preprocess_settings']['key'])) {
          $object->ds_fields[$key]['content'] = $vars[$key][$object->preprocess_fields[$key]['key']];
        }
        else {
          $object->ds_fields[$key]['content'] = $vars[$key];
        }
        break;
      case DS_FIELD_TYPE_IGNORE:
        $object->ds_fields[$key]['content'] = isset($object->content[$key]['#value']) ? $object->content[$key]['#value'] : '';
        break;
    }
  }

  /*
   * Pack groups
   */
  if (!empty($object->ds_groups)) {
    foreach ($object->ds_groups as $group_key => $group) {
      foreach ($group as $field_key => $field) {
        $object->ds_fields[$group_key]['fields'][$field_key] = $object->ds_fields[$field_key];
        unset($object->ds_fields[$field_key]);
      }
    }
  }

  /*
   * Iterate over the active regions to build the display object
   *
   * Instead of iterating over groups first, we iterate over active regions
   * and build groups only when required.
   */
  $count = 0;
  foreach (array_keys($object_display->active_regions) as $region_name) {
    $region_fields = array();

    // Loop through all fields after ordering on weight.
    asort($object_display->active_regions[$region_name]);
    foreach (array_keys($object_display->active_regions[$region_name]) as $key) {
      $region_fields[$key] = $object->ds_fields[$key];

      /*
       * Choose a field rendering pipeline based on the type.
       *
       * Groups get content and render within wrapper functions.
       * Fields get content then call the renderer directly.
       */
      switch ($object->ds_fields[$key]['field_type']) {
        case DS_FIELD_TYPE_GROUP:
          $region_fields[$key]['rendered'] = ds_render_group($object, $key, $vars);
          break;
        case DS_FIELD_TYPE_MULTIGROUP:
          $region_fields[$key]['rendered'] = ds_render_multigroup($object, $key, $vars);
          break;
        default:

          // Set content for this item.
          $object->ds_fields[$key]['content'] = ds_get_content($object->ds_fields[$key], $vars, $key);
          $region_fields[$key]['rendered'] = ds_render_item($object->ds_fields[$key]);
          break;
      }

      // Support for tabs. We need to create an additional field and unset
      // the existing group field.
      if (!empty($object->ds_fields[$key]['theme'])) {
        if ($object->ds_fields[$key]['theme'] == 'ds_tabs') {
          $object_display->active_regions[$region_name]['tab_' . $region_name] = $object->ds_fields[$key]['weight'];
          $region_fields['tab_' . $region_name] = array(
            'tab' => TRUE,
            'name' => $region_name,
            'fields' => array(
              $object->ds_fields[$key]['weight'] => $object->ds_fields[$key],
            ),
          );
          $region_fields['tab_' . $region_name]['fields'][$object->ds_fields[$key]['weight']]['content'] = $object->ds_fields[$key]['rendered'];
          unset($object->ds_fields[$key]);
          unset($region_fields[$key]);
        }
      }
    }

    // Store content from a region and add classes if necessary.
    if (is_array($region_fields) && !empty($region_fields)) {
      if ($region_name == 'left' || $region_name == 'right') {
        $object_display->region_classes[$region_name] = $region_name;
      }
      $style = isset($object_display->region_styles[$region_name]) ? ' ' . $object_display->region_styles[$region_name] : '';
      $rendered_region = '';
      foreach ($region_fields as $region_field) {
        if (!empty($region_field['rendered'])) {
          $rendered_region .= $region_field['rendered'];
        }
      }
      $object_display->themed_regions[$region_name] = array(
        'content' => $rendered_region,
        'extra_class' => $style,
        'count' => $count,
        'fields' => $region_fields,
        'hidden' => FALSE,
      );
      if (empty($rendered_region)) {
        $object_display->themed_regions[$region_name]['hidden'] = TRUE;
      }
    }
    $count++;
  }

  /*
   * Do some final configuration and pass the complete display object off to
   * theme_ds_regions for final rendering.
   */

  // Plugins.
  ds_plugins_process($object_display, $object, $vars);

  // Cleanup:
  // Remove any regions which are hidden before rendering.
  foreach ($object_display->themed_regions as $key => $region) {
    if ($region['hidden'] == TRUE) {
      unset($object_display->themed_regions[$key]);
    }
  }

  // Add classes based on regions.
  if (isset($object_display->themed_regions['middle'])) {
    $middle_class = $module . '-no-sidebars';
    if (isset($object_display->themed_regions['left']) && isset($object_display->themed_regions['right'])) {
      $middle_class = $module . '-two-sidebars';
    }
    elseif (isset($object_display->themed_regions['left'])) {
      $middle_class = $module . '-one-sidebar ' . $module . '-sidebar-left';
    }
    elseif (isset($object_display->themed_regions['right'])) {
      $middle_class = $module . '-one-sidebar ' . $module . '-sidebar-right';
    }
    $object_display->themed_regions['middle']['extra_class'] .= ' ' . $middle_class;
  }

  // Theme the regions with their content.
  return theme(DS_DEFAULT_THEME_REGIONS, $object_display, $module);
}