以编程方式还原功能组件


21

我有一个使用安装配置文件安装的功能。但是我总是必须去还原一个特定的组件,以使其不再被覆盖(例如,出现功能块)。我只是想知道是否可以使用安装配置文件中的代码本身以编程方式执行此步骤。

在下面的屏幕截图中,我显示了必须以编程方式还原的组件(在屏幕截图中,该组件已经还原,因此该复选框不可用)。

屏幕截图


对于您的问题,我没有答案,但是我敢打赌,如果您花一些时间在问题队列中,您会发现为什么它以还原状态开始。如果没有可用的补丁程序,那么您至少会更了解需要在哪里解决该问题。
Letharion

@Letharion-但是这些都是开发的自定义块和视图。
黑客

按照这个定义,您导出的所有内容都是“自定义”的,因此对我而言这没有意义。
Letharion

Answers:


20

尽管有一些关于以编程方式或作为附加安装脚本重置功能的想法。

您可以使用Drush重置功能

drush features-revert [feature name]

另一个想法是在安装过程中使用features_revert():

features_revert(array('module' => array('component')));

StrongARM的模块可能是有用的,以及给功能我认为保持其默认状态。

我必须同意@Letharion对您的OP的评论。我想知道,在安装过程中不会错误地修改其他重要内容。


16

还原功能中的所有组件

$feature = features_get_features('my_feature_machine_name');
$components = array_keys($feature->info['features']);
features_revert(array('my_feature_machine_name' => $components));

4
我认为features_revert_module('my_module'); 完成所有这些步骤。
伊利亚·林恩


5
features_revert(array('module' => array('component')));

其中“模块”是特定功能模块的名称(即下载功能时生成的模块),“组件”是这些功能的组件。因此,如果您只想还原功能中定义的字段,则可以对组件使用“字段”。


4

我可以使用钩子函数解决问题,fe_block_settings_features_revert('basic_site')其中fe_block_settings是钩子,即此处的组件,而basic_site是功能/模块名称。


3
你能再解释一下吗?如何在.profile或.install中使用此功能?
kLezer

4

使用features_revert()要还原特定组件仅在句法是:

features_revert(array($module => $components));

例如:

features_revert(array('module_name' => array('taxonomy', 'node')));

要还原整个模块(及其所有组件),请features_revert_module()改用,例如:

features_revert_module('module_name');

规则

对于规则,此方法更快(还原单个规则):

$rule_name = 'my_custom_rule';
if ($rule = rules_config_load($rule_name)) {
  $rule->delete();
}

要还原所有规则,它是:

if ($rules = rules_config_load_multiple(FALSE)) {
  foreach($rules as $rule) {
    if ($rule->hasStatus(ENTITY_OVERRIDDEN) && !$rule->hasStatus(ENTITY_FIXED)) {
      $rule->delete();
    }
  }
}

请参阅:添加重载规则-还原[#2474577] | Drupal.org


2

要还原安装配置文件中所有功能的所有覆盖的组件,请将以下内容添加到.profile文件的hook_profile_tasks()中:

/**
 * Rebuild & Revert all enabled features.
 */
features_rebuild();
features_revert();

0
    /**
     * Reverts all components of a feature.
     */
    function YOURMODULE_helpers_install_features_revert($module, $component = NULL) {
      module_load_include('inc', 'features', 'features.export');
      features_include();
      if (($feature = feature_load($module, TRUE)) && module_exists($module)) {
        $components = array();
        if (is_null($component)) {
          // Forcefully revert all components of a feature.
          foreach (array_keys($feature->info['features']) as $component) {
            if (features_hook($component, 'features_revert')) {
              $components[] = $component;
            }
          }
        }
        else {
          // Use the $component argument of this function.
          $components[] = $component;
        }
        foreach ($components as $component) {
          features_revert(array($module => array($component)));
        }

        drush_print(format_string('Reverted "!module" feature components !components.', array(
          '!module' => $module,
          '!components' => implode(', ', $components),
        )));
      }
      else {
        drush_print(format_string('Unable to revert "!module" feature.', array('!module' => $module)));
      }
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.