Annuler un composant d'entité par programme

21

J'ai une fonctionnalité installée à l'aide d'un profil d'installation. Mais je dois toujours aller et inverser un composant particulier afin qu'il ne soit plus remplacé (pour que, par exemple, les blocs de la fonctionnalité apparaissent). Je voulais juste savoir si je pouvais effectuer cette étape par programme en utilisant le code lui-même dans le profil d'installation.

Dans la capture d'écran ci-dessous, j'ai montré le composant qui doit être annulé par programme (dans la capture d'écran, il est déjà rétabli, donc la case à cocher n'est pas disponible).

Capture d'écran

Pirate
la source
Je n'ai pas de réponse à votre question, mais je suis prêt à parier que si vous passez du temps dans la file d'attente des problèmes, vous découvrirez pourquoi cela commence comme inversé. S'il n'y a pas de correctif disponible, au moins vous serez plus près de comprendre où vous devez attaquer le problème.
Letharion
@Letharion - Mais ce sont tous des blocs et des vues personnalisés développés.
Hacker
Selon cette définition, tout ce que vous exportez serait "personnalisé", donc cela n'a pas de sens pour moi.
Letharion

Réponses:

20

Voici quelques réflexions sur la réinitialisation de vos fonctionnalités par programme ou en tant que scripts d'installation de module complémentaire.

Vous pouvez utiliser Drush pour réinitialiser la fonctionnalité :

drush features-revert [feature name]

Une autre idée serait d'utiliser features_revert () pendant le processus d'installation:

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

Le module Strongarm pourrait également être utile pour forcer votre fonctionnalité à conserver son état par défaut, je pense.

Je suis d'accord avec @Letharion dans son commentaire sur votre OP. Je voudrais savoir que d'autres choses importantes ne sont pas modifiées par erreur pendant le processus d'installation.

Citricguy
la source
16

Rétablir TOUS les composants dans la fonction

$feature = features_get_features('my_feature_machine_name');
$components = array_keys($feature->info['features']);
features_revert(array('my_feature_machine_name' => $components));
Gaydabura
la source
4
Je pense que features_revert_module ('my_module'); fait toutes ces étapes.
Elijah Lynn
5
features_revert(array('module' => array('component')));

Où «module» est le nom du module de fonctionnalités spécifiques (c'est-à-dire le module généré lorsque vous téléchargez la fonctionnalité) et «composant» sont les composants de ces fonctionnalités. Donc, si vous souhaitez simplement rétablir les champs définis dans la fonctionnalité, vous pouvez utiliser «champ» pour le composant.

user1496391
la source
4

Je pourrais résoudre le problème en utilisant la fonction hook fe_block_settings_features_revert('basic_site')où fe_block_settings est le hook, c'est-à-dire que le composant ici et basic_site est le nom de la fonction / du module.

Pirate
la source
3
Pouvez-vous expliquer un peu plus? comment utilisez-vous cette fonction dans .profile ou .install?
kLezer
4

Utilisez features_revert()pour rétablir des composants spécifiques uniquement lorsque la syntaxe est:

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

par exemple:

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

Pour rétablir le module entier (avec tous ses composants), utilisez à la features_revert_module()place, par exemple:

features_revert_module('module_name');

Règles

Pour les règles, cette méthode est beaucoup plus rapide (pour rétablir une seule règle):

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

Pour revenir à toutes les règles, c'est:

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

Voir: Ajouter des règles de drush-revert [# 2474577] | Drupal.org

kenorb
la source
2

Pour rétablir tous les composants remplacés de toutes les fonctionnalités de votre profil d'installation, ajoutez les éléments suivants à hook_profile_tasks () de votre fichier .profile:

/**
 * Rebuild & Revert all enabled features.
 */
features_rebuild();
features_revert();
rcourtna
la source
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
la source