Reverter um componente de recurso programaticamente

21

Eu tenho um recurso instalado usando um perfil de instalação. Mas sempre tenho que ir e reverter um componente específico para que ele não seja mais substituído (para que, por exemplo, os blocos do recurso apareçam). Eu só queria saber se posso executar esta etapa programaticamente usando o próprio código no perfil de instalação.

Na captura de tela abaixo, mostrei o componente que precisa ser revertido programaticamente (na captura de tela, ele já foi revertido, portanto, a caixa de seleção não está disponível).

Captura de tela

Hacker
fonte
Não tenho uma resposta para sua pergunta, mas estou disposto a apostar que, se você passar algum tempo na fila de problemas, descobrirá por que ela começa como revertida. Se não houver um patch disponível, pelo menos você estará mais perto de entender onde precisa atacar o problema.
Letharion
@ Letharion - Mas estes são todos os blocos e visualizações personalizados desenvolvidos.
Hacker
Por essa definição, tudo o que você exporta seria "personalizado", para que não faça sentido para mim.
Letharion

Respostas:

20

Aqui estão algumas reflexões sobre como redefinir seus recursos de forma programática ou como scripts de instalação de complemento.

Você pode usar o Drush para redefinir o recurso :

drush features-revert [feature name]

Outro pensamento seria usar features_revert () durante o processo de instalação:

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

O módulo Strongarm também poderia ser útil para forçar seu recurso a manter seu estado padrão, eu acho.

Eu tenho que concordar com @Letharion no comentário dele sobre o seu OP. Gostaria de saber que outras coisas importantes não estão sendo modificadas por engano durante o processo de instalação.

Citricguy
fonte
16

Reverter TODOS os componentes no recurso

$feature = features_get_features('my_feature_machine_name');
$components = array_keys($feature->info['features']);
features_revert(array('my_feature_machine_name' => $components));
Gaydabura
fonte
4
Eu acho que features_revert_module ('my_module'); faz todas essas etapas.
Elias Lynn
5
features_revert(array('module' => array('component')));

Onde 'module' é o nome do módulo de recursos específicos (ou seja, o módulo gerado quando você baixa o recurso) e 'component' são os componentes desses recursos. Portanto, se você quiser apenas reverter os campos definidos no recurso, poderá usar 'campo' para o componente.

user1496391
fonte
4

Eu poderia resolver o problema usando a função hook, fe_block_settings_features_revert('basic_site')onde fe_block_settings é o hook, ou seja, o componente aqui e basic_site é o nome do recurso / módulo.

Hacker
fonte
3
Você pode explicar um pouco mais? como você usa essa função em .profile ou .install?
KLezer 13/09/12
4

Use features_revert()para reverter componentes específicos apenas onde a sintaxe é:

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

por exemplo:

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

Para reverter o módulo inteiro (com todos os seus componentes), use em seu features_revert_module()lugar, por exemplo:

features_revert_module('module_name');

Regras

Para regras, esse método é muito mais rápido (para reverter regra única):

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

Para reverter todas as regras, é:

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

Veja: Adicionar drush rules-revert [# 2474577] | Drupal.org

kenorb
fonte
2

Para reverter todos os componentes substituídos de todos os Recursos no seu Perfil de instalação, adicione o seguinte ao hook_profile_tasks () do arquivo .profile:

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