Añadir campo en hook_node_info ();

9

¿Es posible agregar campos a un tipo de nodo declarado usando hook_node_info? ¿Tengo que agregar los campos por separado? Si es así, ¿qué gancho usaría para eso?

Gaelan
fuente

Respuestas:

8

Debe adjuntar los campos por separado, no se pueden agregar hook_node_info(). Por lo general, haría esto en una hook_install()función en el archivo .install de su módulo.

Un buen ejemplo simple de Drupal core está en el archivo de instalación del módulo de blog:

function blog_install() {
  // Ensure the blog node type is available.
  node_types_rebuild();
  $types = node_type_get_types();
  node_add_body_field($types['blog']);
}

La función simplemente reconstruye los tipos de nodo (por lo que el tipo recién agregado está disponible), luego agrega un campo de cuerpo utilizando la node_add_body_field()función. Esta función en sí misma ofrece un excelente ejemplo de cómo crear un campo, una instancia de ese campo, y luego adjuntarlo a un tipo de contenido utilizando las funciones field_create_field()y field_create_instance().

El código no es tan largo, así que lo incluiré aquí como ejemplo:

function node_add_body_field($type, $label = 'Body') {
  // Add or remove the body field, as needed.
  $field = field_info_field('body');
  $instance = field_info_instance('node', 'body', $type->type);
  if (empty($field)) {
    $field = array(
      'field_name' => 'body', 
      'type' => 'text_with_summary', 
      'entity_types' => array('node'),
    );
    $field = field_create_field($field);
  }
  if (empty($instance)) {
    $instance = array(
      'field_name' => 'body', 
      'entity_type' => 'node', 
      'bundle' => $type->type, 
      'label' => $label, 
      'widget' => array('type' => 'text_textarea_with_summary'), 
      'settings' => array('display_summary' => TRUE), 
      'display' => array(
        'default' => array(
          'label' => 'hidden', 
          'type' => 'text_default',
        ), 
        'teaser' => array(
          'label' => 'hidden', 
          'type' => 'text_summary_or_trimmed',
        ),
      ),
    );
    $instance = field_create_instance($instance);
  }
  return $instance;
}
Clive
fuente
Gracias. ¿Necesito hacer algo en mi hook_uninstall?
Gaelan
Realmente depende de usted ... si desea eliminar cualquier contenido / tipos de contenido / campos que haya creado, entonces sí, si no lo hace, entonces no :)
Clive
¿Entonces mi tipo de contenido no desaparecerá cuando mi módulo se apague?
Gaelan
2
Su tipo de contenido personalizado no desaparecerá cuando su módulo se deshabilite (en Drupal 7), ni siquiera si desinstala el módulo deshabilitado. Si escribe código para eliminar los Tipos de contenido que creó durante la instalación durante el hook_uninstall () de su módulo, entonces sí, el Tipo de contenido desaparecerá cuando desinstale su módulo (pero aún no cuando simplemente lo deshabilite).
Tío Code Monkey