I feautres normalmente reverter usando o drush feature-revert
de drush feature-revert-all
comandos depois de executar atualizações de banco de dados (usando drush updatedb
). Mas, às vezes, você precisa garantir que os Feautres sejam revertidos antes de executar algumas atualizações do banco de dados, e às vezes você precisa reverter todos os feautres. Claro, se o hook_update_N
que precisa ser executado após a reversão dos recursos for de um módulo diferente, você precisará de uma hook_update_dependencies
implementação.
function MODULE_update_N(&$sandbox) {
module_load_include('inc', 'features', 'features.export');
$messages = array();
if (!isset($sandbox['features_to_revert'])) {
$sandbox['features_to_revert'] = array();
foreach (features_get_features(NULL, TRUE) as $module) {
if ($module->status) {
$sandbox['features_to_revert'][] = $module->name;
}
}
$sandbox['revered_features'] = array();
}
if ($sandbox['features_to_revert']) {
$module = array_shift($sandbox['features_to_revert']);
$dt_args['@module'] = $module;
if (($feature = features_load_feature($module, TRUE)) && module_exists($module)) {
$components = array();
// Forcefully revert all components of a feature.
foreach (array_keys($feature->info['features']) as $component) {
if (features_hook($component, 'features_revert')) {
$components[] = $component;
}
}
foreach ($components as $component) {
$dt_args['@component'] = $component;
if (features_feature_is_locked($module, $component)) {
$messages[] = format_string('Skipping locked @module.@component.', $dt_args);
}
else {
features_revert(array($module => array($component)));
$messages[] = format_string('Reverted @module.@component.', $dt_args);
}
}
}
$sandbox['revered_features'] = $module;
if ($sandbox['features_to_revert']) {
$sandbox['#finished'] = count($sandbox['revered_features']) / (count($sandbox['features_to_revert']) + count($sandbox['revered_features']));
}
else {
$sandbox['#finished'] = 1;
drupal_flush_all_caches();
}
}
return implode("n", $messages);
}