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


21

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

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

スクリーンショット


あなたの質問に対する答えはありませんが、問題のキューでしばらく時間を過ごすと、なぜそれが元に戻されたのがわかります。利用可能なパッチがない場合は、少なくとも、問題を攻撃する必要がある場所を理解することに近づきます。
レサリオン

@Letharion-しかし、これらはすべて開発されたカスタムブロックとビューです。
ハッカー

その定義では、エクスポートするものはすべて「カスタム」になるため、私には意味がありません。
レサリオン

回答:


20

ただし、プログラムによる機能のリセットまたはアドオンインストールスクリプトとしての機能については、いくつかの考えがあります。

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

drush features-revert [feature name]

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

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

StrongARMのモジュールをするにも有用である可能性強制あなたの機能を私が考えるそのデフォルト状態を保持します。

あなたのOPについての彼のコメントで、@ Letharionに同意しなければなりません。他の重要な事項がインストールプロセス中に誤って変更されていないことを知りたいと思います。


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)));
      }
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.