Kembalikan Komponen Fitur secara terprogram

21

Saya memiliki Fitur yang diinstal menggunakan Profil Instalasi. Tapi saya selalu harus pergi dan Kembalikan Komponen tertentu sehingga tidak lagi Ditimpa (sehingga, misalnya, Blok Fitur muncul). Saya hanya ingin tahu apakah saya dapat mengambil langkah ini secara terprogram menggunakan kode itu sendiri di Profil Instalasi.

Pada tangkapan layar di bawah ini, saya telah menunjukkan komponen yang harus dipulihkan secara programatik (dalam tangkapan layar, komponen itu sudah dikembalikan kembali sehingga kotak centang tidak tersedia).

Tangkapan layar

Peretas
sumber
Saya tidak punya jawaban untuk pertanyaan Anda, tetapi saya berani bertaruh bahwa jika Anda menghabiskan waktu dalam antrian masalah, Anda akan mengetahui mengapa itu dimulai sebagai dikembalikan. Jika tidak ada tambalan yang tersedia, setidaknya Anda akan lebih dekat untuk memahami di mana Anda perlu menyerang masalah.
Letharion
@Letharion - Tapi ini semua blok dan tampilan kustom yang dikembangkan.
Peretas
Dengan definisi itu, semua yang Anda ekspor akan menjadi "kebiasaan", sehingga tidak masuk akal bagi saya.
Letharion

Jawaban:

20

Berikut adalah beberapa pemikiran tentang mengatur ulang fitur Anda secara terprogram atau sebagai add-on install scripts.

Anda dapat menggunakan Drush untuk mengatur ulang Fitur :

drush features-revert [feature name]

Pemikiran lain adalah menggunakan fitur_revert () selama proses instalasi:

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

The StrongArm modul dapat berguna juga untuk memaksa Anda Fitur untuk mempertahankan keadaan default saya pikir.

Saya harus setuju dengan @Letharion dalam komentarnya di OP Anda. Saya ingin tahu bahwa hal-hal penting lainnya tidak salah dimodifikasi selama proses instalasi.

Citricguy
sumber
16

Kembalikan SEMUA komponen dalam fitur

$feature = features_get_features('my_feature_machine_name');
$components = array_keys($feature->info['features']);
features_revert(array('my_feature_machine_name' => $components));
Gaydabura
sumber
4
Saya pikir fitur_revert_module ('my_module'); melakukan semua langkah ini.
Elijah Lynn
5
features_revert(array('module' => array('component')));

Di mana 'modul' adalah nama modul fitur spesifik (yaitu modul yang dihasilkan ketika Anda mengunduh fitur) dan 'komponen' adalah komponen dari fitur-fitur tersebut. Jadi, jika Anda hanya ingin mengembalikan bidang yang ditentukan dalam fitur Anda dapat menggunakan 'bidang' untuk komponen.

pengguna1496391
sumber
4

Saya bisa mengatasi masalah ini dengan menggunakan fungsi hook di fe_block_settings_features_revert('basic_site')mana fe_block_settings adalah hook yaitu komponen di sini dan basic_site adalah nama fitur / modul.

Peretas
sumber
3
Bisakah Anda jelaskan lebih banyak? bagaimana Anda menggunakan fungsi ini di. profil atau. instal?
kLezer
4

Gunakan features_revert()untuk mengembalikan komponen tertentu hanya jika sintaksnya adalah:

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

sebagai contoh:

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

Untuk mengembalikan seluruh modul (dengan semua komponennya), gunakan features_revert_module()sebaliknya, misalnya:

features_revert_module('module_name');

Aturan

Untuk aturan, metode ini jauh lebih cepat (untuk mengembalikan aturan tunggal):

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

Untuk mengembalikan semua aturan, ini:

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

Lihat: Tambahkan aturan drush-revert [# 2474577] | Drupal.org

kenorb
sumber
2

Untuk mengembalikan semua komponen yang ditimpa semua Fitur di Profil Instalasi Anda, tambahkan berikut ini ke file_profile hook_profile_tasks Anda ():

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