You are here

function features_override_module_component_overrides in Features Override 6.2

Same name and namespace in other branches
  1. 7.2 features_override.export.inc \features_override_module_component_overrides()

Get overrides for specific module/component.

Parameters

$module: An enabled module to find overrides for it's components.

$component: A type of component to find overrides for.

$reset: Reset the internal cache of overrides gathered.

$all: If TRUE, return all overrides, otherwise only overrides not yet in an override feature

Return value

An array of overrides found.

1 call to features_override_module_component_overrides()
features_override_get_overrides in ./features_override.export.inc
Calculautes what overrides exist for by component/element.

File

./features_override.export.inc, line 119
Helper function to export features overrides.

Code

function features_override_module_component_overrides($module, $component, $reset = FALSE, $all = TRUE) {
  static $cache = array();
  if (isset($cache[$module][$component]) && !$reset) {
    return $cache[$module][$component];
  }
  module_load_include('inc', 'features_override', 'features_override.hooks');
  features_include();
  features_include_defaults($component);

  // Allows overriding non-feature controlled code.
  $default_hook = features_get_default_hooks($component);
  if ($all) {

    // call hooks directly
    // could also do
    // $default = features_get_default($component, $module, FALSE, $reset);
    // but this is more efficient
    $default = module_invoke($module, $default_hook);
  }
  else {
    $default = features_get_default($component, $module, TRUE, $reset);
  }
  $normal = features_get_normal($component, $module, $reset);

  // This indicates it is likely not controlled by features, so fetch manually.
  if (!$normal) {
    $code = array_pop(features_invoke($component, 'features_export_render', $module, array_keys($default), NULL));
    if (!$code) {
      return FALSE;
    }
    else {
      $normal = eval($code);
    }
  }
  $context = array(
    'component' => $component,
    'module' => $module,
  );

  // Can't use _features_sanitize as that resets some keys.
  _features_override_sanitize($normal);
  _features_override_sanitize($default);

  // make a deep copy of data to prevent problems when removing recursion later
  $default_copy = unserialize(serialize($default));
  $normal_copy = unserialize(serialize($normal));
  $ignore_keys = features_get_ignore_keys($component);

  // remove keys to be ignored
  // doing this now allows us to better control which recursive parts are removed
  if (count($ignore_keys)) {
    _features_override_remove_ignores($default_copy, $ignore_keys);
    _features_override_remove_ignores($normal_copy, $ignore_keys);
  }

  // now remove any remaining recursion
  features_override_remove_recursion($default_copy);
  features_override_remove_recursion($normal_copy);
  $component_overrides = array();
  if ($normal && is_array($normal) || is_object($normal)) {
    foreach ($normal as $name => $properties) {
      $component_overrides[$name] = array(
        'additions' => array(),
        'deletions' => array(),
      );
      if (isset($default_copy[$name])) {
        drupal_alter('features_override_component_overrides', $default[$name], $normal_copy[$name], $context);
        _features_override_set_additions($default_copy[$name], $normal_copy[$name], $component_overrides[$name]['additions'], $ignore_keys);
        _features_override_set_deletions($default_copy[$name], $normal_copy[$name], $component_overrides[$name]['deletions'], $ignore_keys);
      }
      if (!array_filter($component_overrides[$name])) {
        $component_overrides[$name] = FALSE;
      }
    }
  }
  $cache[$module][$component] = $component_overrides;
  return $component_overrides;
}