You are here

function features_override_module_component_overrides in Features Override 7.2

Same name and namespace in other branches
  1. 6.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.

2 calls to features_override_module_component_overrides()
features_override_get_overrides in ./features_override.export.inc
Calculates what overrides exist for by component/element.
features_override_render_differences in ./features_override.admin.inc
Renders the differences for a component and element

File

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

Code

function features_override_module_component_overrides($module, $component, $reset = FALSE, $all = TRUE) {
  static $cache = array();
  if (!$reset && isset($cache[$module][$component])) {
    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 && is_array($default)) {
    $export = features_invoke($component, 'features_export_render', $module, array_keys($default), NULL);
    $code = array_pop($export);
    if (!$code) {
      return array();
    }
    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);
  $default_copy = features_remove_recursion($default);
  $normal_copy = features_remove_recursion($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_remove_ignores($default_copy, $ignore_keys);
    _features_remove_ignores($normal_copy, $ignore_keys);
  }
  $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_copy[$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;
      }
    }

    // now check for any elements that are in $default but not in $normal that we didn't process yet
    foreach ($default as $name => $properties) {
      if (!isset($normal_copy[$name])) {
        $_keys = array(
          array(
            'type' => 'array',
            'key' => $name,
          ),
        );
        $component_overrides[$name]['deletions'][features_override_make_key($name)] = array(
          'keys' => $name,
        );
      }
    }
  }
  $cache[$module][$component] = $component_overrides;
  return $component_overrides;
}