No se puede eliminar el tipo de contenido de la función después de desinstalarla

Respuestas:

15

Solución

Usando un hook_uninstall()archivo de instalación en FEATURE_NAME.y cambiando el estado del tipo de contenido, por lo que el sistema cree que es un tipo de contenido personalizado desbloqueado.

Publiqué esto también en d.org .

<?php
/**
 * Implements hook_uninstall().
 */
function FEATURE_NAME_uninstall() {

  // List custom content types added by this feature
  $custom_ctypes = array(
    'blog',
  );

  // Go through each and unlock the content type
  foreach ($custom_ctypes as $ctype) {
    db_query("UPDATE {node_type} SET `custom` = 1, locked = 0 WHERE type = :ctype", array(':ctype' => $ctype));
  }

  // Clean Drupal cache; this is necessary for the "Delete" link to appear
  // next to the content type created by the feature.
  drupal_flush_all_caches();

}

Esto hará que aparezca el botón "Eliminar" para ese tipo de contenido, por lo que puede eliminarlo del administrador.

¡Espero que esto ayude a alguien!

Aram Boyajyan
fuente
1
Para aclarar, esto no elimina el tipo de contenido; hace que el enlace 'eliminar' esté disponible en la página de listado de tipos de contenido. Gracias @ Ivanhoe123!
doub1ejack
1
Además, no pude hacer esto mientras mi módulo de funciones estaba habilitado, pero después de deshabilitarlo y desinstalarlo (usé drush) funcionó de maravilla. Atajo: use el módulo de desarrollo colocando el contenido de esta función en / devel / php. Para eliminar contenido de forma programática, agregue node_type_delete($ctype); después de la consulta en el bucle for.
duda1ejack 01 de
Gracias por ese código. Después de ver este código, edité mi base de datos usando phpMyAdmin y edité la tabla "node_type". Luego encontré el tipo de contenido que quería eliminar y establecí el valor "Personalizado" en "1". Y finalmente lo eliminé de la Administración de Drupal.
ANDiTKO
2
mysql> UPDATE node_type SET custom = 1, locked = 0 WHERE type = '<content type machine name>';
Marco Lazzeri
La solución de @ MarcoLazzeri funcionó perfectamente para mí y fue mucho mejor que tener que actualizar mi módulo de funciones solo para desinstalarlo.
donut
11

Para mí, la solución era cargar la página de eliminación manualmente, ya que no hay un enlace de "eliminación" en la página de tipos de contenido. Para hacer esto, solo necesita construir la URL usted mismo siguiendo la misma estructura de URL que la página de eliminación para otros tipos de contenido:

admin / structure / types / manage / YOUR_CONTENT_TYPE_MACHINE_NAME / delete

Esto hizo aparecer la página de confirmación de eliminación del tipo de contenido, que luego me permitió eliminar el tipo de contenido.

Para referencia, vea este hilo en Drupal.org:

https://drupal.org/node/1055460#comment-7297680

Saludos,

@cmsdave

cmsdave
fuente
Acabo de cambiar el enlace para mostrar el tipo de contenido al final para eliminar y podría eliminar el tipo de contenido sin ningún problema. ¡Esta solución funciona!
cateye
Nota : Antes de que esto funcionara, tuve que editar el .infoarchivo de la función y eliminar el tipo de contenido, luego lo eliminaría.
Duncanmoo
3

El método anterior no elimina las taxonomías, pero esto se puede lograr agregando lo siguiente después de deshabilitar y desinstalar el módulo:

// Delete taxonomies.
$machine_names = array('taxonomy_a', 'taxonomy_b');
foreach ($machine_names as $machine_name) {
  $taxonomy = taxonomy_vocabulary_machine_name_load($machine_name);
  taxonomy_vocabulary_delete($taxonomy->vid);
}
Juampy NR
fuente
1

Otra solución que funcionó para mí directamente a la base de datos en mi sitio de desarrollo. Recuerde siempre hacer una copia de seguridad de su base de datos.

Para eliminar manualmente un tipo de contenido creado por una función # 16, lo que Nedjo sugiere es lo siguiente:

  • Deshabilita la función. A veces he tenido problemas con esto: una función no se deshabilitará. En este caso, elimine el código del módulo de funciones.
  • Determine el nombre de la máquina del tipo de contenido que se va a eliminar, por ejemplo, 'mytype'.
  • En la base de datos, revierta los valores de la tabla node_type a los valores predeterminados como si el tipo de contenido se creara manualmente a través de la IU:

mysql> UPDATE node_type SET module = 'node', custom = 1, modified = 1, locked = 0 WHERE type = 'mytype';

  • Borrar cachés para garantizar que el cambio de tipo de contenido esté disponible.
  • A través de la interfaz de usuario en admin / structure / types, elimine el tipo de contenido.
cayerdis
fuente
0

Si utiliza el módulo admin_menu , seguirá viendo los enlaces de eliminación en el menú desplegable Estructura / Tipos de contenido / [nombre de tipo de contenido] / Eliminar, incluso si no se muestran en la página de tipos de contenido.

Diría que es bastante seguro usar este enlace de eliminación si se asegura de que ya no hay otras referencias a este tipo de contenido.

Mirsoft
fuente