Восстановить компонент компонента программно

21

У меня есть функция, установленная с помощью профиля установки. Но мне всегда нужно идти и возвращать определенный компонент, чтобы он больше не переопределялся (например, чтобы появлялись блоки компонента). Я просто хотел узнать, смогу ли я сделать этот шаг программно, используя сам код в профиле установки.

На снимке экрана ниже я показал компонент, который необходимо программно перевернуть (на скриншоте он уже возвращен обратно, поэтому флажок недоступен).

Скриншот

взломщик
источник
У меня нет ответа на ваш вопрос, но я готов поспорить, что, если вы проведете какое-то время в очереди на выпуск, вы узнаете, почему она начинается как обратная. Если патча нет, по крайней мере, вы будете ближе к пониманию того, где нужно атаковать проблему.
Летарион
@Letharion - Но это все пользовательские блоки и разработанные виды.
Хакер
По этому определению все , что вы экспортируете, будет «нестандартным», так что для меня это не имеет смысла.
Летарион

Ответы:

20

Вот несколько соображений по поводу сброса ваших функций программно или в виде дополнительных сценариев установки.

Вы можете использовать Drush для сброса функции :

drush features-revert [feature name]

Другой мыслью было бы использовать features_revert () во время процесса установки:

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

Strongarm модуль может быть также полезным заставить ваш Feature , чтобы сохранить свое состояние по умолчанию , я думаю.

Я должен согласиться с @Letharion в его комментарии к вашему OP. Я хотел бы знать, что другие важные вещи не изменяются по ошибке в процессе установки.

Citricguy
источник
16

Вернуть ВСЕ компоненты в функцию

$feature = features_get_features('my_feature_machine_name');
$components = array_keys($feature->info['features']);
features_revert(array('my_feature_machine_name' => $components));
Gaydabura
источник
4
Я думаю, feature_revert_module ('my_module'); делает все эти шаги.
Элайджа Линн
5
features_revert(array('module' => array('component')));

Где «модуль» - это название модуля конкретных функций (т. Е. Модуль, сгенерированный при загрузке функции), а «компонент» - компоненты этих функций. Поэтому, если вы просто хотите вернуть поля, определенные в функции, вы можете использовать «поле» для компонента.

user1496391
источник
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();
    }
  }
}

Смотрите: Добавить правила drush-revert [# 2474577] | Drupal.org

kenorb
источник
2

Чтобы отменить все переопределенные компоненты всех компонентов в вашем профиле установки, добавьте следующее в hook_profile_tasks () вашего файла .profile:

/**
 * Rebuild & Revert all enabled features.
 */
features_rebuild();
features_revert();
rcourtna
источник
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)));
      }
    }
Алекс Скрипник
источник