Adicionar campo em hook_node_info ();

9

É possível adicionar campos a um tipo de nó declarado usando hook_node_info? Tenho que adicionar os campos separadamente? Se sim, qual gancho eu usaria para isso?

Gaelan
fonte

Respostas:

8

Você precisa anexar os campos separadamente, eles não podem ser adicionados hook_node_info(). Você normalmente faria isso em uma hook_install()função no arquivo .install do seu módulo.

Um bom exemplo simples do núcleo do Drupal está no arquivo de instalação do módulo do 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']);
}

A função simplesmente reconstrói os tipos de nó (para que o tipo adicionado recentemente esteja disponível) e adiciona um campo de corpo a ele usando a node_add_body_field()função Essa função, por si só, oferece um excelente exemplo de como criar um campo, uma instância desse campo e, em seguida, anexá-lo a um tipo de conteúdo usando as funções field_create_field()e field_create_instance().

O código não é tão longo, por isso vou incluí-lo aqui como exemplo:

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
fonte
Obrigado. Preciso fazer alguma coisa no meu hook_uninstall?
Gaelan
Depende de você realmente ... se você deseja remover qualquer conteúdo / tipos / campos de conteúdo que você criou, então sim, se não o fizer, não :) :)
Clive
Portanto, meu tipo de conteúdo não desaparecerá quando meu módulo for desligado?
Gaelan
2
Seu tipo de conteúdo personalizado não desaparecerá quando seu módulo for desativado (no Drupal 7), nem mesmo se você desinstalar o módulo desativado. Se você escrever um código para excluir os Tipos de Conteúdo que você criou durante a instalação durante o hook_uninstall () do seu módulo, sim, o Tipo de Conteúdo desaparecerá quando você Desinstalar o módulo (mas ainda não quando o desativa).
Uncle Code Monkey