Impossibile installare ... esiste già nella configurazione attiva


15

Su Drupal 8.1 continuo a correre in quel tipo di messaggi quando provo ad attivare un modulo personalizzato o una funzione personalizzata che apporta alcune modifiche alla pagina di base. (aggiungi campi).

È davvero fastidioso ...

passi:

  • Cancella database completamente
  • vai su /install.php e scegli Profilo standard
  • Ora che il sito è in esecuzione, vai su Estendi
  • Seleziona funzione - Pagina base

Risultato:

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.

Bene sì ... questo è quello che voglio fare: modificare quelle impostazioni predefinite!

expexted:

Essere in grado di installare la mia funzione che apporta alcune modifiche alla pagina di base.

La mia caratteristica

Ecco la mia funzione crea con il modulo Caratteristiche

In sostanza aggiunge due campi, banner_image e background_image alla pagina di base

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

Perché questa cosa semplice non è supportata? è un insetto? Cosa devo fare per poter utilizzare la mia funzione?


1
Usa il modulo drupal EasyInstall che viene utilizzato per rimuovere le configurazioni attive
Karthikeyan Manivasagam

1
+1 modulo interessante - vale la pena dare un'occhiata - grazie @KarthikeyanManivasagam
therobyouknow

Risposte:


24

Con Drush probabilmente puoi farlo

drush config-delete module_name.settings

per eliminare le configurazioni che si lamentano


Durante la mia epica battaglia contro Drupal ho anche scoperto che puoi spostare quelle configurazioni in una optional/cartella per farla tacere. Ma non sono sicuro di tutte le implicazioni ...
Guillaume Bois,

@GuillaumeBois: le implicazioni sono che queste configurazioni opzionali sarebbero ignorate se già installate, o se le dipendenze non fossero soddisfatte. Pertanto, può causare ulteriori problemi se la configurazione è necessaria per il funzionamento del modulo.
Renrhaf,

+1 grazie @GiorgosK (Parte 1 di 2): ho trovato questa soluzione funzionante nel mio caso: ho riscontrato questo errore nel browser Web del mio sito di sviluppo: 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).dopo aver impostato il codice del sito sorgente git e database su un altro computer .
therobyouknow,

(Parte 2 di 2) Quindi per risolverlo ho tentato di disinstallare lightning_layout e reinstallarlo. drush pm-uninstall lightning_layoutha funzionato, ma quando ho provato a reinstallarlo drush en lightning_layoutho riscontrato questo errore da riga di comando "In PreExistingConfigException.php linea 65: Gli oggetti di configurazione (field.storage.node.panelizer) forniti da lightning_layout esistono già nella configurazione attiva" Quindi ho usato il tuo soluzione quindi: drush config-delete field.storage.node.panelizer ed è stato quindi in grado di riattivare il modulo:drush en lightning_layout
therobyouknow

1
se non sei sicuro di quali "impostazioni" devi eliminare, dovresti eseguire "drush config-list" per ottenere il nome esatto della configurazione
Jorge Valvert,

3

Questa cosa non è supportata perché un modulo potrebbe non sostituire un'entità di configurazione già esistente con la configurazione di installazione.

Per aggiungere configurazioni di modalità modulo e visualizzazione per un tipo di nodo già esistente, è necessario implementarlo nel codice in hook_install ().

Oppure devi eliminare prima il tipo di nodo sul tuo sito, ma poi devi anche eliminare il contenuto.

E no, questo non è un bug, ecco come viene definito per prevenire la perdita di configurazione.


Questo è molto triste. In D7 questo era possibile (aggiungere campi a una pagina di base tramite una funzione). Penso ancora che dovrebbe essere anche in D8. Dici che serve a prevenire la perdita di configurazione, ma in realtà aggiunge semplicemente configurazioni (campi, peso, etichetta, ecc.). Si noti che ho avuto anche questo problema con i miei moduli personalizzati.
Guillaume Bois,

No, non si limita ad aggiungere. le visualizzazioni di vista e modulo sono condivise su tutti i campi di un singolo tipo di nodo. cosa succede se due moduli provano ad aggiungere quel file, chi vincerà? Cosa succede sui campi esistenti che sono già nel tipo di pagina? cosa succede se esiste il tipo di nodo di base ma con impostazioni diverse rispetto al proprio campo? Gli scenari di comportamento del genere non sono definiti. Per una funzionalità autonoma, è meglio definire il proprio tipo di nodo e per distribuire questa modifica sul proprio sito, non è necessario un modulo di funzionalità come in 7.x, è possibile semplicemente esportare la configurazione e importarla di nuovo.
Berdir,

@berdir questo è molto interessante. Quindi vengo da questo problema provando a creare una funzione del profilo utente che include le note di visualizzazione e modulo. Quindi stai dicendo che questo non può essere fatto nelle funzionalità perché il tipo di contenuto dell'utente sarà già esistito e la funzionalità sta cercando di abilitarlo? C'è un modo per consentire a una funzionalità di sovrascriverla in modo che qualcuno possa abilitare una funzione di profilo su un sito già esistente?
Kaleemclarkson,

L'utente @kaleemclarkson non è un tipo di contenuto ma un tipo di entità. L'unico modo per farlo è quello che ho descritto, devi implementare il codice in hook_install () del tuo modulo funzionale per impostare il modulo e visualizzare la configurazione del display. Oppure usa il modulo profilo e definisci il tuo tipo di profilo lì.
Berdir,

3

Modulo trovato, utilizzare il modulo Easy Install per eliminare la configurazione attiva senza utilizzare devel o drush . Funziona anche se hai perso la cartella opzionale e l'opzione forzata nei file di configurazione del tuo modulo ( yml )


1
Questa è un'opzione fantastica! L'ho usato solo oggi e mi ha fatto risparmiare così tanto tempo!
rtd1123,

3

Ho lo stesso problema per il sito pantheon. Ho inserito il comando Drush

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

Localsite: drush config-delete ERRORNAME

è lavoro per me.



0

Se vuoi aggiungere le configurazioni al tuo modulo personalizzato ma esistono già nella configurazione attiva, e per qualche motivo non puoi usare drush per eliminare quelle configurazioni (nel mio caso perché fa parte di un profilo di installazione), e sei sicuro non ci sarà alcun problema con la sovrascrittura della configurazione, ecco un approccio per sostituire quelle configurazioni.

Aggiungi una nuova cartella nel tuo modulo personalizzato, / config / hook_install e aggiungi i tuoi file di configurazione .yml in quella cartella, quindi nella hook_install del tuo modulo.

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();
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.