Como criar programaticamente campos para tipos de conteúdo e adicioná-los ao formulário do tipo de conteúdo

8

Digamos que eu tenho esse campo "map_description". Eu sei que eu teria essa função para definir o campo:

$field = array(
  'field_name' => 'map_description',
  'cardinality' => 1,
  'type' => 'text',
);
field_create_field($field);

E eu tenho esse código que não tenho certeza do que ele faz, mas me disseram que precisarei:

 $instance = array(
    'field_name' => 'map_description',
    'label' => 'The map description.',
    'bundle' => 'my_content_type',
    'entity_type' => 'node',
    'widget' => array(
    'type' => 'text_textfield',
 );
 field_create_instance($instance)

Esses dois bits de código estão no gancho de instalação e são executados quando instalo o módulo. Mas enquanto os campos são criados, preciso atribuí-los manualmente ao tipo de conteúdo por meio de "gerenciar campos". Existe uma maneira de atribuir os campos automaticamente ao tipo de conteúdo?

Rugbert
fonte

Respostas:

10

Você está quase lá.

Do seu código:

'bundle' => 'my_content_type',

Substitua my_content_type pelo nome do tipo de conteúdo ao qual você deseja que ele esteja anexado.

Aqui está um exemplo completo de como adicionar um campo de texto Alias ao tipo de conteúdo Artigo . (de monarchdigital.com )

/**
 * Update hook to add a field to a node.
 */
function my_module_update_7000() {
  $field_name = 'field_alias';
  // Make sure the field doesn't already exist.
  if (!field_info_field($field_name)) {
    // Create the field.
    $field = array(
      'field_name' => $field_name,
      'type' => 'text',
      'settings' => array('max_length' => 64),
    );
    field_create_field($field);

    // Create the instance.
    $instance = array( 'field_name' => $field_name,
      'entity_type' => 'node',
      'bundle' => 'article',
      'label' => 'Alias',
      'description' => 'The article alias.',
      'required' => TRUE,
    );
    field_create_instance($instance);

    watchdog('my_module', t('!field_name was added successfully.', array('!field_name' => $field_name)));
  }
  else {
    watchdog('my_module', t('!field_name already exists.', array('!field_name' => $field_name)));
  }
}
Merrick
fonte
0

Faça pequenas alterações no seu código.

$t = get_t();
$field = array(
   'field_name' => 'map_description',
    'label' => $t('My Description'),
    'type' => 'text',

);
field_create_field ($ field);

& Write this in Instance

$t = get_t();
return array(
  'map_description' => array(
    'field_name' => 'map_description',
    'type' => 'text',
    'label' => $t('Map Description'),
    'bundle' => 'your_custom_content_type',
    'entity_type' => 'node',
    'widget' => array(
      'type' => 'text_textfield'
    ),
    'display' => array(
      'example_node_list' => array(
        'label' => $t('Map Description'),
        'type' => 'text'
      )
    )
  ),
Vikram Singh Shekhawat
fonte