2011-01-15 25 views
6

Estoy tratando de usar las entidades de Drupal 7 y la API de campo para construir correctamente un nuevo módulo. Lo que no he podido comprender de la documentación es la forma correcta de usar la nueva API para crear un 'tipo de contenido' (no un tipo de nodo) con una serie de campos configurados, como Body.Forma correcta de utilizar las entidades de Drupal 7 y la API de campo

Estoy tratando de configurar la entidad usando hook_entity_info, entonces creo que necesito agregar el campo de cuerpo usando field_create_instance, pero parece que no puedo hacer que funcione.

En mycontenttype.module:

/** 
* Implements hook_entity_info(). 
*/ 
function mycontenttype_entity_info() { 
    $return = array(
    'mycontenttype' => array(
     'label' => t('My Content Type'), 
     'controller class' => 'MyContentTypeEntityController', 
     'base table' => 'content_type', 
     'uri callback' => 'content_type_uri', 
     'entity keys' => array(
     'id' => 'cid', 
     'label' => 'title', 
    ), 
     'bundles' => array(
     'mycontenttype' => array(
      'label' => 'My Content Type', 
      'admin' => array(
      'path' => 'admin/contenttype', 
      'access arguments' => array('administer contenttype'), 
     ), 
     ), 
    ), 
     'fieldable' => true, 
    ), 
); 
    return $return; 
} 

/** 
* Implements hook_field_extra_fields(). 
*/ 
function mycontenttype_field_extra_fields() { 
    $return['mycontenttype']['mycontenttype'] = array(
    'form' => array(
     'body' => array(
     'label' => 'Body', 
     'description' => t('Body content'), 
     'weight' => 0, 
    ), 
    ), 
); 
    return $return; 
} 

Entonces llega esta en el archivo .install?

function mycontenttype_install() { 
    $field = array(
    'field_name' => 'body', 
    'type' => 'text_with_summary', 
    'entity_types' => array('survey'), 
    'translatable' => TRUE, 
); 
    field_create_field($field); 

    $instance = array(
    'entity_type' => 'mycontenttype', 
    'field_name' => 'body', 
    'bundle' => 'mycontenttype', 
    'label' => 'Body', 
    'widget_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', 
    ), 
    ), 
); 
    field_create_instance($instance); 
} 
+0

Esta entrada de blog puede ser útil: http://www.istos.it/blog/drupal-entities/drupal-entities-part-3-programming-hello-drupal-entity – bkildow

Respuesta

1

Creo que su problema es que si el módulo de nodo está instalado, ya hay un campo llamado 'cuerpo'. Debería cambiar el nombre de su campo por algo como 'mycontenttype_body' (comment.module usa comment_body), o reutilizar el campo 'body' y omitir la adición de la parte de campo y saltar a agregar la instancia de este. El primero se recomienda sobre el segundo.

+0

Sí, eso es lo que quiero hacer: reutilizar el campo corporal de los nodos . Entonces, ¿tengo razón al agregar la instancia en hook_install? No parece funcionar. ¿Debo esperar ver que el campo del cuerpo se agregue automáticamente a los formularios usando field_attach_form()? –

1

Cada campo tiene una propiedad de matriz, entity_types, que limita las entidades a las que se puede adjuntar el campo. La mejor solución de Drupal que puedo encontrar, hook_field_create_field, puede alterar los campos a medida que se crean, pero eso no es bueno para el campo de cuerpo que se crea en la instalación. Así que mi solución es sólo para editar la base de datos directamente en mi hook_install

 
    $data_col = db_query("SELECT data from field_config where field_name = 'body'")->fetchAssoc(); 
    $data = unserialize($data_col['data']); 
    $data['entity_types'][] = 'MY_ENTITY_TYPE'; 
    db_update('field_config') 
    ->fields(array('data' => array('data' => serialize($data)))) 
    ->condition('field_name', 'body') 
    ->execute();
Cuestiones relacionadas