¿Cómo elimino un objeto de configuración de la configuración activa?

41

Estoy escribiendo un módulo personalizado para Drupal 8. Define un objeto de configuración de almacenamiento de campo, en un archivo llamado modules / mymod / config / install / field.storage.bloom_stem.bs_twitter_ac.yml.

El problema es que esto no se elimina cuando desinstalo el módulo; aparentemente se queda atrás porque, cuando reinstalo el módulo, me cuelgo.

drush -y pm-uninstall mymod
drush cr
drush -y en mymod

excepción 'Drupal \ Core \ Config \ PreExistingConfigException' con el mensaje 'Los objetos de configuración (field.storage.bloom_stem.bs_twitter_ac) proporcionados por mymod ya existen en la configuración activa'

Así que parece que necesito eliminar manualmente este objeto de configuración. ¿Debo proporcionar más código que lo elimine cuando se desinstale el módulo?

artfulrobot
fuente
Parece un problema similar: drupal.stackexchange.com/questions/173684/…
othermachines
El módulo Easy Install está allí para solucionar y evitar este problema por completo drupal.org/project/easy_install
Karthikeyan Manivasagam

Respuestas:

53

La forma más fácil de hacer esto en este momento es usar drush php(o core-cli) para abrir una sesión interactiva.

Luego use:

Drupal::configFactory()->getEditable('system.menu.devel')->delete();

Esta funcionalidad también se agregará a la consola de Drupal .

lexicante
fuente
1
Esto resolvió perfectamente el problema. Cambie 'system.menu.devel' a 'the_setting.you.want.to.delete'
Eric Steinborn el
¿Qué pasa con la eliminación de múltiples configuraciones? por ejemplomigrate_plus.migration.*
Nic
@Nic no es bonito, pero mira mi solución en tu otra pregunta para eliminar múltiples: drupal.stackexchange.com/questions/214132/…
CR47
Si tiene acceso directo a la base de datos, elimine cuidadosamente las entradas ofensivas de la configtabla.
Naidim
30

Drush mando a objeto de configuración de borrado: drush config-delete <config_name>.

ya.teck
fuente
en casos de sitios múltiples,drush -l your.site.domain config-delete <config_name>
muskie9
2
formato abreviado esdrush cdel <config_name>
Sharique
Sea consciente, si elimina cualquier configuraciones, se debe también hacer un drush crdespués para eliminar cualquier configuración caché dependencias de lo contrario puede conseguir algo que es similar al siguiente:Error: Call to a member function getConfigDependencyKey() on null
Wilco
13

Puedes usar los siguientes métodos. Use el siguiente código en hook_uninstall

Drupal::configFactory()->reset('field.storage.bloom_stem.bs_twitter_ac');

O

en el archivo yml puedes poner las dependencias como


dependencies:
  module:
    - yourmodule
  enforced:
    module:
      - yourmodule

entonces drupal eliminará automáticamente estas configuraciones al desinstalar su módulo como lo describe Berdir aquí https://drupal.stackexchange.com/a/173879/10436

Ahmad
fuente
55
Esto podría haber cambiado últimamente, pero ahora es ligeramente diferente. dependencias: forzado: módulo: - yourmodule
hw.
1
@hw tu comentario es muy importante. Considere agregarlo a la respuesta, con un enlace al registro de cambios relevante si es posible. No pude encontrarlo.
rudolfbyker
GAH !! Sabía que había una manera de hacer esto, pero no podía recordar la parte "forzada". Esta es la forma más simple y limpia de hacerlo, especialmente al crearlos en archivos yml.
UnsettlingTrend
usando este enfoque e intentando instalar el módulo, Drupal arroja el error: Módulo custom_module no se puede habilitar porque depende de los siguientes módulos que no se pudieron encontrar:
John
Hola, John, en caso de que no lo hayas resuelto, suena como si hubieras puesto la dependencia de tu módulo en el lugar equivocado. La configuración descrita en esta respuesta está destinada a ir en archivos YML en el directorio config / install de su módulo. En el caso del OP, esto estaría en su archivo config / install / field.storage.bloom_stem.bs_twitter_ac.yml. Parece que puede haber puesto la dependencia en el archivo mymodule.info.yml de su módulo en su lugar (eso evitará que su módulo pueda instalarse)
Daniel Scott
9

Usando la consola drupal :

$ drupal config:delete 'the_config_to_delete'
VincentLalieu
fuente
1
Documentos en: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/… ¿ Pero puede hacer comodines? por ejemplodrupal config:delete 'migrate_plus.migration.*'
Nic
2
En la última consola de drupal, config: delete espera que especifiques primero el tipo de configuración , por ejemplo, drupal config:delete active 'name'o `drupal config: delete staging 'name' (con solo un parámetro suministrado, asumirá que le has dado el tipo y te lo pedirá) para el nombre de configuración.)
William Turrell
6

Drupal :: configFactory () -> reset () no elimina el objeto de configuración. Para esta carreraDrupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()

balagan
fuente
2

Puede usar la consola de Drupal para eliminar la configuración activa, con drupal config:delete active config_to_delete.

Umed Godd
fuente
1

Busque todas las configuraciones enumeradas usando drush config-list. Luego identifique la configuración que desea eliminar. Utilice el siguiente comando para eliminar la configuración drush config-delete

Manikanta
fuente
0

Dejo aquí un pequeño script de Python (aunque un poco excesivamente diseñado) que elimina las sobras de configuración. Se basa en drush config-delete.

# 'batch_config_delete.py'
# 'drush' has to be available in the current directory

import os
import argparse
import subprocess

MODULES_ROOT = "/var/www/html/MYSITE/web/modules/custom"

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Batch config delete.")
    parser.add_argument("-m", "--module", required=True, help="Module name")
    args = parser.parse_args()
    install_path = os.path.join(MODULES_ROOT, args.module, 'config/install')

    for f in os.listdir(install_path):
        if f.endswith('.yml'):
            config_name = os.path.splitext(f)[0]
            print "Delete config:", config_name
            subprocess.call(['drush', 'config-delete', config_name])

Debería ejecutarse así:

python ../scripts/batch_config_delete.py -m foobar
turdus-merula
fuente
1
¿Está pidiendo a los desarrolladores de PHP que usen un script de Python? Parece un poco tonto.
Patrick
0

Use el módulo Easy Install para evitar estos problemas de configuración, este módulo permitirá eliminar configuraciones mientras desinstala un módulo, funciona incluso si las configuraciones de un módulo no contienen configuraciones forzadas en yml o configuraciones no agregadas en la carpeta opcional .

Configuración en la imagen de desinstalación

Karthikeyan Manivasagam
fuente
0

Desinstalar la configuración activa del módulo personalizado

Me encontré con el mismo problema al intentar desinstalar archivos de configuración de un módulo personalizado. Tengo un módulo personalizado utilizado para pasar archivos de configuración personalizados para el formulario web. Como no soy perfecto, quiero poder desinstalar el módulo, editar el código y reinstalarlo. Descubrí que si hacía referencia a mi módulo personalizado (my_module) en la sección de dependencias / forzadas en el archivo config / install yml, cuando desinstalé mi módulo, los archivos de configuración también se desinstalarían.

   langcode: en
    status: true
    dependencies:
        enforced:
            module:
                - webform
                - my_module // reference your module here
Robert Ben Parkinson
fuente
0

Todas estas respuestas recomiendan eliminar el objeto de configuración subyacente directamente, pero la forma correcta es eliminar la entidad a través del sistema de almacenamiento de la entidad.

Por ejemplo, si tiene un estilo de imagen con ID "grande" y desea eliminarlo, debe hacer esto:

\Drupal::entityTypeManager()->getStorage('image_style')->load('large')->delete();

Al hacerlo de esta manera, core invocará "predelete" antes de que se elimine la configuración y se enganche "delete" después de que se elimine la configuración, en la que otros módulos pueden confiar para realizar varias operaciones de limpieza.

Brian
fuente
0

Use hook_uninstall para eliminar la configuración, cuando se desinstala el módulo.

Luego elimine la configuración:

function hook_uninstall() {
  \Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
Jdrupal
fuente