Tidak dapat menginstal ... sudah ada dalam konfigurasi aktif

15

Pada Drupal 8.1 saya terus menjalankan pesan-pesan semacam itu ketika saya mencoba untuk mengaktifkan modul khusus atau fitur kustom yang membuat beberapa modifikasi ke halaman dasar. (tambahkan bidang).

Ini benar-benar menjengkelkan ...

Langkah:

  • Hapus database sepenuhnya
  • pergi ke /install.php dan pilih Profil standar
  • Sekarang situs berjalan, buka Extend
  • Pilih Fitur - Halaman dasar

Hasil:

Unable to install Feature - Basic Page, core.base_field_override.node.page.promote, core.entity_form_display.node.page.default, core.entity_view_display.node.page.default, core.entity_view_display.node.page.teaser, field.field.node.page.body, node.type.page already exist in active configuration.

Yah ya ... itulah yang ingin saya lakukan: Ubah pengaturan default itu!

Expexted:

Dapat menginstal fitur saya yang membuat beberapa modifikasi ke halaman dasar.

Fitur saya

Ini adalah Fitur saya buat dengan modul Fitur

Ini pada dasarnya menambahkan dua bidang, banner_image dan background_image ke halaman dasar

File:

config
    install
        core.base_field_override.node.page.changed.yml
        core.base_field_override.node.page.created.yml
        core.base_field_override.node.page.promote.yml
        core.base_field_override.node.page.status.yml
        core.base_field_override.node.page.sticky.yml
        core.base_field_override.node.page.title.yml
        core.base_field_override.node.page.uid.yml
        core.entity_form_display.node.page.default.yml
        core.entity_view_display.node.page.default.yml
        core.entity_view_display.node.page.teaser.yml
        field.field.node.page.body.yml
        field.field.node.page.field_banner_image.yml
        field.field.node.page.field_image.yml
        field.storage.node.field_banner_image.yml
        language.content_settings.node.page.yml
        node.type.page.yml
feature_basic_page.features.yml
feature_basic_page.info.yml

Mengapa hal sederhana ini tidak didukung? Apakah ini bug? Apa yang harus saya lakukan untuk dapat menggunakan fitur saya?

Guillaume Bois
sumber
1
Gunakan modul EasyInstall drupal yang digunakan untuk menghapus konfigurasi aktif
Karthikeyan Manivasagam
1
+1 modul menarik - layak dilihat - terima kasih @KarthikeyanManivasagam
therobyouknow

Jawaban:

24

Dengan mabuk Anda mungkin bisa melakukannya

drush config-delete module_name.settings

untuk menghapus konfigurasi yang mengeluh

GiorgosK
sumber
Saya juga menemukan selama pertempuran epik saya melawan Drupal bahwa Anda dapat memindahkan konfigurasi itu dalam optional/folder untuk membuatnya diam. Tapi saya tidak yakin dengan semua implikasinya ...
Guillaume Bois
@GuillaumeBois: implikasinya adalah bahwa konfigurasi optionnal ini akan diabaikan jika sudah diinstal, atau jika dependensi tidak terpenuhi. Jadi, ini dapat menyebabkan masalah lebih lanjut jika konfigurasi diperlukan agar modul dapat berfungsi.
Renrhaf
+1 terima kasih @GiorgosK (Bagian 1 dari 2): Saya menemukan solusi ini berfungsi dalam kasus saya: Saya mengalami kesalahan ini di peramban web untuk situs dev saya: Warning: in_array() expects parameter 2 to be array, null given in lightning_layout_block_alter() (line 91 of modules/contrib/lightning_layout/lightning_layout.module).setelah mengatur kode situs saya, sumber git, dan basis data di komputer lain .
therobyouknow
(Bagian 2 dari 2) Jadi untuk mengatasinya, saya mencoba menghapus instalan lightning_layout dan menginstalnya kembali. drush pm-uninstall lightning_layoutbekerja tetapi kemudian ketika saya mencoba menginstalnya kembali dengan drush en lightning_layoutsaya mendapat kesalahan baris perintah ini "Pada baris PreExistingConfigException.php 65: Objek konfigurasi (field.storage.node.panelizer) yang disediakan oleh lightning_layout sudah ada dalam konfigurasi aktif" Jadi saya menggunakan Anda solusi demikian: drush config-delete field.storage.node.panelizer dan kemudian dapat mengaktifkan kembali modul:drush en lightning_layout
therobyouknow
1
jika Anda tidak yakin "pengaturan" apa yang harus Anda hapus, Anda harus menjalankan "drush config-list" untuk mendapatkan nama konfigurasi yang tepat
Jorge Valvert
3

Hal ini tidak didukung karena modul mungkin tidak menggantikan entitas konfigurasi yang sudah ada dengan menginstal konfigurasi.

Untuk menambahkan konfigurasi bentuk dan mode tampilan untuk jenis simpul yang sudah ada, Anda harus menerapkan ini dalam kode di hook_install ().

Atau Anda harus menghapus jenis simpul terlebih dahulu di situs Anda, tetapi kemudian Anda juga harus menghapus konten.

Dan tidak, ini bukan bug, ini adalah bagaimana ia didefinisikan untuk mencegah hilangnya konfigurasi.

Berdir
sumber
Ini sangat menyedihkan. Di D7 ini dimungkinkan (tambahkan bidang ke halaman dasar melalui Fitur). Saya masih berpikir itu harus di D8 juga. Anda mengatakan itu untuk mencegah hilangnya konfigurasi, tetapi pada kenyataannya, itu hanya menambah konfigurasi (bidang, berat, label, dll.). Perhatikan bahwa saya juga mengalami masalah ini dengan modul khusus saya sendiri.
Guillaume Bois
Tidak, itu tidak hanya ditambahkan. tampilan dan tampilan formulir dibagikan di semua bidang dari jenis simpul tunggal. apa yang terjadi jika dua modul mencoba menambahkan file itu, siapa yang akan menang? Apa yang terjadi tentang bidang yang sudah ada pada tipe halaman? bagaimana jika tipe simpul dasar ada tetapi dengan pengaturan berbeda dari di bidang Anda? Skenario perilaku seperti itu tidak ditentukan. Untuk fitur mandiri, Anda lebih baik mendefinisikan jenis simpul Anda sendiri dan untuk menerapkan perubahan ini di situs Anda sendiri, Anda tidak memerlukan modul fitur seperti pada 7.x, Anda hanya dapat mengekspor konfigurasi dan mengimpornya lagi.
Berdir
@berdir ini sangat menarik. Jadi saya berasal dari masalah ini karena mencoba membuat fitur profil pengguna yang mencakup tampilan dan formulir catatan. Jadi, apakah Anda mengatakan ini tidak dapat dilakukan dalam fitur karena tipe konten pengguna sudah ada dan fitur mencoba untuk mengaktifkannya? Apakah ada cara untuk memungkinkan fitur menimpanya sehingga seseorang dapat mengaktifkan fitur profil di situs yang sudah ada?
kaleemclarkson
Pengguna @kaleemclarkson bukan tipe konten tetapi tipe entitas. Satu-satunya cara untuk melakukannya adalah apa yang saya jelaskan, Anda harus mengimplementasikan kode di hook_install () dari modul fitur Anda untuk mengatur bentuk dan melihat konfigurasi tampilan. Atau gunakan modul profil dan tentukan jenis profil Anda sendiri di sana.
Berdir
3

Modul yang ditemukan, gunakan modul Easy Install untuk membersihkan konfigurasi aktif tanpa menggunakan devel atau drush . Ini berfungsi bahkan jika Anda telah melewatkan folder opsional dan opsi yang dipaksakan dalam file konfigurasi modul Anda ( yml )

Karthikeyan Manivasagam
sumber
1
Ini pilihan yang fantastis! Saya hanya menggunakan ini hari ini dan itu menghemat banyak waktu!
rtd1123
3

Saya memiliki masalah yang sama untuk situs panteon. Saya memasukkan perintah drush

Pantheonsite: drush @ pantheon.SITENAME.ENVNAME config-delete ERRORNAME

Lokal: drush config-delete ERRORNAME

ini bekerja untuk saya.

omkar gaonkar
sumber
1

Dengan drush enitu berhasil!

[profile_test]$ drush en feature_basic_page -y
The following extensions will be enabled: feature_basic_page
Do you really want to continue? (y/n): y    
feature_basic_page was enabled successfully.   [ok]

EDIT: ada solusi yang lebih baik sekarang, lihat: Bagaimana cara menghapus objek konfigurasi dari konfigurasi aktif?

Guillaume Bois
sumber
0

Jika Anda ingin menambahkan konfigurasi ke modul khusus Anda tetapi sudah ada di konfigurasi aktif, dan untuk beberapa alasan Anda tidak dapat menggunakan drush untuk menghapus konfigurasi tersebut (dalam kasus saya karena itu adalah bagian dari profil pemasangan), dan Anda yakin tidak akan ada masalah dengan Anda menimpa konfigurasi, inilah pendekatan untuk mengganti konfigurasi tersebut.

Tambahkan folder baru di modul khusus Anda, / config / hook_install dan tambahkan file confym .yml Anda di folder itu, kemudian di hook_install modul Anda.

use Drupal\Component\Serialization\Yaml;

/**
 * Implements hook_install().
 */
function mymodule_install() {

  // Replace these configs.  We're using code to do this, as they are already
  // installed.
  $config_files = [
    'language.types',
    'language.negotiation',
  ];

  foreach ($config_files as $config_id) {
    $raw_data = file_get_contents(drupal_get_path('module', 'mymodule') . '/config/hook_install/' . $config_id . '.yml');
    \Drupal::configFactory()->getEditable($config_id)
      ->setData(Yaml::decode($raw_data))
      ->save();
  }
}
oknate
sumber