Программный возврат компонента функции
У меня установлена функция с использованием профиля установки. Но мне всегда приходится идти и отменять определенный компонент, чтобы он больше не переопределялся (чтобы, например, появлялись блоки функции). Я просто хотел знать, могу ли я выполнить этот шаг программно, используя сам код в профиле установки.
На скриншоте ниже я показал компонент, который должен быть возвращен программно (на скриншоте он уже возвращен, так что флажок недоступен).
8 answers
Вот несколько мыслей о том, как сбросить ваши функции программно или в виде сценариев установки надстроек.
Вы можете использовать Drush для сброса функции :
drush features-revert [feature name]
Другой мыслью было бы использовать features_revert() во время процесса установки:
features_revert(array('module' => array('component')));
Модуль Strongarm также может быть полезен для заставить вашу функцию сохранить ее состояние по умолчанию, я думаю.
Я должен согласиться с @Letharion в его комментарии к вашей операции. Я хотел бы знать, что другие важные вещи не были ошибочно изменены в процессе установки.
Вы можете вернуть один модуль функций с помощью модуля features_revert_module().
features_revert_module('my_feature');
Возврат ВСЕХ компонентов в функции
$feature = features_get_features('my_feature_machine_name');
$components = array_keys($feature->info['features']);
features_revert(array('my_feature_machine_name' => $components));
features_revert(array('module' => array('component')));
Где "модуль" - это имя модуля конкретных функций (т. Е. модуля, созданного при загрузке функции), а "компонент" - это компоненты этих функций. Поэтому, если вы просто хотите вернуть поля, определенные в функции, вы можете использовать "поле" для компонента.
Я мог бы решить проблему с помощью функции hook fe_block_settings_features_revert('basic_site')
, где fe_block_settings - это крючок, т.Е. Компонент здесь, а basic_site - имя функции/модуля.
Использовать 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- отменить [#2474577]| Drupal.org
Чтобы отменить все переопределенные компоненты всех функций в вашем профиле установки, добавьте следующее в hook_profile_tasks() вашего файла .profile:
/**
* Rebuild & Revert all enabled features.
*/
features_rebuild();
features_revert();
/**
* 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)));
}
}