web-dev-qa-db-ja.com

プログラムで機能コンポーネントを元に戻す

インストールプロファイルを使用して機能をインストールしました。しかし、私は常に特定のコンポーネントを元に戻して、オーバーライドされないようにする必要があります(たとえば、機能のブロックが表示されるようにするため)。インストールプロファイルのコード自体を使用して、プログラムでこの手順を実行できるかどうかを知りたかっただけです。

下のスクリーンショットでは、プログラムで元に戻す必要があるコンポーネントを示しています(スクリーンショットでは、元に戻されているため、チェックボックスは使用できません)。

Screenshot

20
Hacker

フック関数fe_block_settings_features_revert('basic_site')を使用して問題を解決できます。ここで、fe_block_settingsはフックです。つまり、ここのコンポーネントであり、basic_siteは機能/モジュール名です。

4
Hacker

ここでは、プログラムで、またはアドオンインストールスクリプトとして機能をリセットする場合のいくつかの考えを示します。

Drushを使用して 機能 をリセットできます:

_drush features-revert [feature name]_

別の考えは、インストールプロセス中に features_revert ()を使用することです。

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

Strongarm モジュールは force にも役立つ可能性があります Feature はデフォルトの状態を維持すると思います。

あなたのOPに関するコメントで@Letharionに同意する必要があります。他の重要なものがインストールプロセス中に誤って変更されていないことを知りたいと思います。

20
Citricguy

フィーチャーのすべてのコンポーネントを元に戻す

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

features_revert_module() を使用して、単一の機能モジュールを元に戻すことができます。

features_revert_module('my_feature');
15
milkovsky
features_revert(array('module' => array('component')));

ここで、「モジュール」は特定の機能モジュール(つまり、機能をダウンロードしたときに生成されたモジュール)の名前であり、「コンポーネント」はそれらの機能のコンポーネントです。したがって、機能で定義されたフィールドを元に戻したい場合は、コンポーネントに 'field'を使用できます。

5
user1496391

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();
    }
  }
}
_

参照: drushルールを追加する-revert [#2474577] | Drupal.org

4
kenorb

インストールプロファイルのすべての機能のオーバーライドされたすべてのコンポーネントを元に戻すには、.profileファイルのhook_profile_tasks()に次を追加します。

/**
 * Rebuild & Revert all enabled features.
 */
features_rebuild();
features_revert();
2
rcourtna
    /**
     * 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)));
      }
    }
0
Alex Skrypnyk