Setzen Sie eine Feature-Komponente programmgesteuert zurück

21

Ich habe ein Feature mit einem Installationsprofil installiert. Ich muss jedoch immer eine bestimmte Komponente zurücksetzen, damit sie nicht mehr überschrieben wird (sodass beispielsweise die Funktionsblöcke angezeigt werden). Ich wollte nur wissen, ob ich diesen Schritt mithilfe von Code im Installationsprofil programmgesteuert ausführen kann.

Im folgenden Screenshot habe ich die Komponente gezeigt, die programmgesteuert zurückgesetzt werden muss (im Screenshot ist sie bereits zurückgesetzt, sodass das Kontrollkästchen nicht verfügbar ist).

Bildschirmfoto

Hacker
quelle
Ich habe keine Antwort auf Ihre Frage, aber ich bin bereit zu wetten, dass Sie, wenn Sie einige Zeit in der Problemwarteschlange verbringen, herausfinden, warum sie als zurückgesetzt beginnt. Wenn kein Patch verfügbar ist, sind Sie zumindest näher dran, zu verstehen, wo Sie das Problem angreifen müssen.
Letharion
@ Letharion - Dies sind jedoch alle benutzerdefinierten Blöcke und Ansichten, die entwickelt wurden.
Hacker
Nach dieser Definition wäre alles , was Sie exportieren, "benutzerdefiniert", was für mich also keinen Sinn ergibt.
Letharion

Antworten:

20

Hier einige Gedanken zum programmgesteuerten Zurücksetzen Ihrer Funktionen oder als Add-On-Installationsskripts.

Sie können Drush verwenden, um die Funktion zurückzusetzen :

drush features-revert [feature name]

Ein anderer Gedanke wäre, features_revert () während des Installationsprozesses zu verwenden:

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

Das Strongarm- Modul könnte auch nützlich sein, um Ihr Feature zu zwingen , seinen Standardstatus beizubehalten.

Ich muss @Letharion in seinem Kommentar zu Ihrem OP zustimmen. Ich möchte wissen, dass andere wichtige Dinge während des Installationsprozesses nicht versehentlich geändert werden.

Citricguy
quelle
16

Setzen Sie ALLE Komponenten in der Funktion zurück

$feature = features_get_features('my_feature_machine_name');
$components = array_keys($feature->info['features']);
features_revert(array('my_feature_machine_name' => $components));
Gaydabura
quelle
4
Ich denke features_revert_module ('my_module'); macht all diese Schritte.
Elijah Lynn
5
features_revert(array('module' => array('component')));

Wobei "Modul" der Name des Moduls für bestimmte Funktionen ist (dh das Modul, das beim Herunterladen der Funktion generiert wird) und "Komponente" die Komponenten dieser Funktionen sind. Wenn Sie also nur die in der Funktion definierten Felder zurücksetzen möchten, können Sie "Feld" für die Komponente verwenden.

user1496391
quelle
4

Ich könnte das Problem mit der Hook-Funktion lösen, bei der fe_block_settings_features_revert('basic_site')fe_block_settings der Hook ist, dh die Komponente hier und basic_site der Feature- / Modulname.

Hacker
quelle
3
Kannst du ein bisschen mehr erklären? Wie benutzt man diese Funktion in .profile oder .install?
kLezer
4

Wird nur features_revert()zum Zurücksetzen bestimmter Komponenten verwendet, wenn die Syntax wie folgt lautet:

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

beispielsweise:

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

Um das gesamte Modul (mit all seinen Komponenten) zurückzusetzen, verwenden Sie features_revert_module()stattdessen zum Beispiel:

features_revert_module('module_name');

Regeln

Für Regeln ist diese Methode viel schneller (zum Zurücksetzen einer einzelnen Regel):

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

Um alle Regeln zurückzusetzen, ist es:

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

Siehe: Drush Rules-Revert hinzufügen [# 2474577] | Drupal.org

Kenorb
quelle
2

Um alle überschriebenen Komponenten aller Features in Ihrem Installationsprofil wiederherzustellen, fügen Sie Folgendes zu den hook_profile_tasks () Ihrer .profile-Datei hinzu:

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