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


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.


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));

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.


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.


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


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

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)));
      }
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.