Impossible d'installer… existe déjà dans la configuration active

15

Sur Drupal 8.1, je continue d'exécuter ce type de messages lorsque j'essaie d'activer un module personnalisé ou une fonctionnalité personnalisée qui apporte des modifications à la page de base. (ajouter des champs).

C'est vraiment ennuyeux ...

Pas:

  • Effacer entièrement la base de données
  • allez dans /install.php et choisissez Profil standard
  • Maintenant que le site est en cours d'exécution, accédez à Étendre
  • Sélectionnez Fonction - Page de base

Résultat:

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.

Eh bien oui ... c'est ce que je veux faire: changez ces paramètres par défaut!

Expexted:

Pouvoir installer ma fonctionnalité qui apporte quelques modifications à la page de base.

Ma fonction

Voici ma fonctionnalité créer avec le module fonctionnalités

Il ajoute essentiellement deux champs, banner_image et background_image à la page de base

Des dossiers:

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

Pourquoi cette chose simple n'est pas prise en charge? Est-ce un bug? Que dois-je faire pour pouvoir utiliser ma fonction?

Guillaume Bois
la source
1
Utilisez le module drupal EasyInstall qui est utilisé pour supprimer les configurations actives
Karthikeyan Manivasagam
1
+1 module intéressant - mérite le détour - merci @KarthikeyanManivasagam
therobyouknow

Réponses:

24

Avec drush, vous pouvez probablement faire

drush config-delete module_name.settings

supprimer les configurations qui se plaignent

GiorgosK
la source
J'ai également découvert lors de ma bataille épique contre Drupal que vous pouvez déplacer ces configurations dans un optional/dossier pour le fermer. Mais je ne suis pas sûr de toutes les implications ...
Guillaume Bois
@GuillaumeBois: les implications sont que ces configurations optionnelles seraient ignorées si elles sont déjà installées, ou si les dépendances ne sont pas respectées. Ainsi, cela peut entraîner d'autres problèmes si la configuration est nécessaire au fonctionnement du module.
Renrhaf
+1 merci @GiorgosK (Partie 1 sur 2): J'ai trouvé cette solution fonctionner dans mon cas: j'ai eu cette erreur dans le navigateur Web de mon site de développement: 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).après avoir configuré mon code de site git source et base de données sur une autre machine .
therobyouknow
(Partie 2 sur 2) Donc, pour le résoudre, j'ai essayé de désinstaller lightning_layout et de le réinstaller. drush pm-uninstall lightning_layouta fonctionné mais quand j'ai essayé de le réinstaller avec drush en lightning_layoutj'ai obtenu cette erreur de ligne de commande "Dans la ligne 65 de PreExistingConfigException.php: les objets de configuration (field.storage.node.panelizer) fournis par lightning_layout existent déjà dans la configuration active" J'ai donc utilisé votre solution ainsi: drush config-delete field.storage.node.panelizer et a ensuite pu réactiver le module:drush en lightning_layout
therobyouknow
1
si vous n'êtes pas sûr des "paramètres" que vous devez supprimer, vous devez exécuter "drush config-list" pour obtenir le nom exact de la configuration
Jorge Valvert
3

Cette chose n'est pas prise en charge car un module ne peut pas remplacer une entité de configuration qui existe déjà avec l'installation de configuration.

Pour ajouter des configurations de mode formulaire et affichage pour un type de nœud déjà existant, vous devez l'implémenter dans le code dans hook_install ().

Ou vous devez d'abord supprimer le type de nœud sur votre site, mais vous devez également supprimer le contenu.

Et non, ce n'est pas un bug, c'est ainsi qu'il est défini pour éviter toute perte de configuration.

Berdir
la source
C'est très triste. En D7, cela était possible (ajouter des champs à une page de base via une fonctionnalité). Je pense toujours que ça devrait aussi être en D8. Vous dites que c'est pour éviter la perte de configuration, mais en réalité, cela ajoute simplement des configurations (champs, poids, étiquette, etc.). Notez que j'ai également eu ce problème avec mes propres modules personnalisés.
Guillaume Bois
Non, cela ne fait pas qu'ajouter. les affichages de vue et de formulaire sont partagés entre tous les champs d'un type de nœud unique. que se passe-t-il si deux modules tentent d'ajouter ce fichier, qui va gagner? Que se passe-t-il avec les champs existants qui sont déjà sur le type de page? que faire si le type de nœud de base existe mais avec des paramètres différents de ceux de votre domaine? Les scénarios de comportement comme celui-ci ne sont pas définis. Pour une fonctionnalité autonome, il vaut mieux définir votre propre type de nœud et pour déployer cette modification sur votre propre site, vous n'avez pas besoin d'un module de fonctionnalité comme dans 7.x, vous pouvez simplement exporter la configuration et l'importer à nouveau.
Berdir
@berdir c'est très intéressant. Je viens donc de ce problème en essayant de créer une fonction de profil utilisateur qui inclut des notes de vue et de formulaire. Alors, dites-vous que cela ne peut pas être fait dans les fonctionnalités, car le type de contenu utilisateur aura déjà existé et la fonctionnalité tente de l'activer? Existe-t-il un moyen d'autoriser une fonctionnalité à remplacer cela afin que quelqu'un puisse activer une fonctionnalité de profil sur un site déjà existant?
kaleemclarkson
L'utilisateur @kaleemclarkson n'est pas un type de contenu mais un type d'entité. La seule façon de le faire est ce que j'ai décrit, vous devez implémenter du code dans hook_install () de votre module de fonctionnalité pour définir le formulaire et afficher la configuration d'affichage. Ou utilisez le module de profil et définissez-y votre propre type de profil.
Berdir
3

Module trouvé, utilisez Easy Install pour purger la configuration active sans utiliser devel ou drush . Cela fonctionne même si vous avez manqué le dossier facultatif et l'option appliquée dans les fichiers de configuration de votre module ( yml )

Karthikeyan Manivasagam
la source
1
C'est une option fantastique! Je viens de l'utiliser aujourd'hui et cela m'a fait gagner beaucoup de temps!
rtd1123
3

J'ai le même problème pour le site du panthéon. J'ai entré la commande drush

Panthéon: drush @ pantheon.SITENAME.ENVNAME config-delete ERRORNAME

Localsite: drush config-delete ERRORNAME

c'est du travail pour moi.

omkar gaonkar
la source
0

Si vous souhaitez ajouter des configurations à votre module personnalisé mais qu'elles existent déjà dans la configuration active, et pour une raison quelconque, vous ne pouvez pas utiliser drush pour supprimer ces configurations (dans mon cas, car cela fait partie d'un profil d'installation), et vous êtes sûr il n'y aura pas de problème avec l'écrasement de la configuration, voici une approche pour remplacer ces configurations.

Ajoutez un nouveau dossier dans votre module personnalisé, / config / hook_install et ajoutez vos fichiers config .yml dans ce dossier, puis dans hook_install de votre module.

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
la source