function features_override_module_component_overrides in Features Override 7.2
Same name and namespace in other branches
- 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;
}