Crear nuevo tipo de contenido en hook_install


11

¿Alguien puede mostrarme un ejemplo adecuado de cómo crear un nuevo tipo de contenido en el método hook_install de un módulo ?

También me gustaría saber si / qué debo hacer durante hook_uninstall para limpiar mi desorden; Leí que hay un debate sobre simplemente eliminar el contenido.

No he podido encontrar un ejemplo del método adecuado para realizar esta tarea, ¡se agradecería cualquier ayuda!

Respuestas:


7

Para responder a sus preguntas exactamente:

Creación de un tipo de contenido en la instalación de enlace : utiliza node_type_save () para crear el tipo de contenido, aquí hay un ejemplo de webform.install:

  // Create the default webform type.
  $webform_type = array(
    'type' => 'webform',
    'name' => st('Webform'),
    'base' => 'node_content',
    'description' => st('Create a new form or questionnaire accessible to users. Submission results and statistics are recorded and accessible to privileged users.'),
    'custom' => TRUE,
    'modified' => TRUE,
    'locked' => FALSE,
  );

  $webform_type = node_type_set_defaults($webform_type);
  node_type_save($webform_type);
  node_add_body_field($webform_type);

Qué hacer en hook_uninstall : Básicamente, simplemente limpie después de usted mismo, así que elimine las variables creadas por su módulo (usando variable_del () ), elimine los archivos cargados por el módulo (usando file_unmanaged_delete_recursive () ), elimine los tipos de contenido definidos (usando node_type_delete () ), etc.

¡Espero que esto ayude!


Gracias, también es bueno conocer la forma de codificación para hacerlo, y necesitaba encontrar buena información sobre el uso de la desinstalación
Jane Panda

no hay problema, me alegro de ayudar! :)
Alex Weber

11

Una de las mejores formas de mantener esta información en el código es usar funciones . Las características se pueden poner en código:

  • Tipos de contenido
  • Campos CCK
  • Permisos
  • Roles

La lista continua.

Una buena característica de las características es la integración drush

drush featuresle dará una lista de todas las características en el sitio, y su estado
drush features revert allrevertirá todas las características a lo que está en el código (realmente útil para ejecutar después de las implementaciones)

Ayuda esto ayuda


De acuerdo, aunque no responde la pregunta directamente ...
Alex Weber

Sí, sé que esto no es exactamente la solución exacta solicitada, pero en última instancia ambos lograrán el mismo objetivo, es solo que uno será una pesadilla de mantener, y el otro será fácil con apuntar y hacer clic y una integración impresionante. . Bob puede decidir lo que funciona para él
wiifm

1
De acuerdo de nuevo! Las características de Drush + pueden ser intimidantes al principio, pero es muy útil una vez que te acostumbras :)
Alex Weber

Le doy una oportunidad, creo que ahorrará tiempo si puedo exportar un tipo de contenido personalizado para no tener que atascar todos los campos. ¡Gracias!
Jane Panda

3

Consulte el módulo de ejemplos D7 . node_example tiene instalación y desinstalación.

Es posible que pueda desarrollar el tipo con las herramientas de interfaz y luego crear una función (con el módulo de funciones) y extraer partes relevantes en la función de instalación de su módulo personalizado.


0

Si desea crear un nuevo tipo de contenido con algunos campos, puede usar el siguiente código.

Este código me funciona perfectamente.

function HOOK_install() {

 /* CREATE THE CONTENT TYPE */
 $t = get_t();
 $node_example = array(
    'type' => 'slider',
    'name' => $t('Slider Content'),
    'base' => 'node_content',
    'description' => $t('Add slider content.'),
    'body_label' => $t('Slider Description')
 );
 $content_type = node_type_set_defaults($node_example);

// Create a custom Field with our required field-type.
$field = array(
  'field_slider_images' => array (
    'field_name' => 'field_slider_images',
    'type' => 'image',
  ),
 'field_slider_links' => array (
   'field_name' => 'field_slider_links',
   'type' => 'text',
   'entity_types' => array('node'),
  ),

);
foreach ($field as $fields) {
  field_create_field($fields);
}

// Create a instances of that Field.
$instance = array(
'field_slider_images' => array (
  'field_name' => 'field_slider_images',
  'entity_type' => 'node',
  'bundle' => 'slider',
  'label' => t('Slider Image'),
  'description' => 'Add Slider Image.',
  'settings' => array(
    'file_directory' => 'field/document',
    'file_extensions' => 'png PNG jpg jpeg JPG JPEG',
    'max_filesize' => '10MB',
    'title_field' => '',
  ),
  'widget' => array(
     'type' => 'image_image',
     'weight'=> 10,
  ),
  'formatter' => array(
    'label' => t('label'),
    'format' => 'image'
  ),
  'settings' => array(
    'file_directory' => 'slider-image', // save inside "public://photos"
    'max_filesize' => '4M',
    'preview_image_style' => 'thumbnail',
    'title_field' => TRUE,
    'alt_field' => FALSE,
  )
),
'field_slider_links' => array (
  'field_name' => 'field_slider_links',
  'entity_type' => 'node',
  'bundle' => 'slider',
  'label' => t('Slider Link'),
  'widget' => array('type' => 'text_textfield'),
 ),
);

foreach ($instance as $fieldinstance) {
 field_create_instance($fieldinstance);
}

$status = node_type_save($content_type);
node_add_body_field($content_type);

// Replacement rule for the messages.
$t_args = array('%name' => $content_type->name);
if ($status == SAVED_UPDATED) { // update case
 drupal_set_message($t('The content type %name has been updated.', $t_args));
} 
 elseif ($status == SAVED_NEW) { // create case
   drupal_set_message($t('The content type %name has been added.', $t_args));
   watchdog('node', 'Added content type %name.', $t_args, WATCHDOG_NOTICE, l($t('view'), 'admin/structure/types')); 
}

}

-1

Lo hice en el módulo MySpace Sync .
Recuerdo juntar eso de varias fuentes, pero no recuerdo cuáles eran todas las fuentes. Puede navegar por el repositorio git allí para ver lo que hice, pero es básicamente una exportación de cada tipo de contenido con el módulo Content Copy de CCK en la instalación, y luego elimina todos los nodos antes de eliminar el tipo de contenido en la desinstalación.


44
Si bien la pregunta está etiquetada como drupal-7, el módulo MySpace Sync solo está disponible para Drupal 6. La API utilizada para crear el tipo de contenido ha cambiado mucho entre Drupal 6 y Drupal 7.
Pierre Buyle

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.