2011-01-15 23 views
6

Tôi đang cố gắng sử dụng các thực thể và API trường của Drupal 7 để xây dựng chính xác một mô-đun mới. Những gì tôi đã không thể hiểu được từ tài liệu là cách chính xác để sử dụng API mới để tạo 'loại nội dung' (không phải là loại nút) với một số trường được đặt, chẳng hạn như Nội dung.Cách đúng để sử dụng Drupal 7 Thực thể và Field API

Tôi đang cố gắng thiết lập thực thể bằng hook_entity_info, sau đó tôi tin rằng tôi cần thêm trường body bằng cách sử dụng field_create_instance, nhưng dường như tôi không thể làm việc đó.

Trong 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; 
} 

Sau đó thực hiện điều này đi trong file .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

bài viết trên blog này có thể có ích: http://www.istos.it/blog/drupal-entities/drupal-entities-part-3-programming-hello-drupal-entity – bkildow

Trả lời

1

Tôi nghĩ rằng vấn đề của bạn là nếu mô-đun nút được cài đặt, đã có trường có tên 'body'. Bạn nên đặt tên lại trường của bạn thành một cái gì đó như 'mycontenttype_body' (chú thích.module sử dụng comment_body), hoặc tái sử dụng trường 'body' và bỏ qua phần thêm trường và bỏ qua để thêm thể hiện của trường đó. Các cựu được khuyến khích trên sau này.

+0

Vâng, đó là những gì tôi muốn làm - sử dụng lại trường nội dung từ các nút . Vậy tôi có phải thêm cá thể của nó vào hook_install không? Nó dường như không hoạt động. Tôi có nên mong đợi để xem lĩnh vực cơ thể tự động thêm vào các hình thức bằng cách sử dụng field_attach_form()? –

1

Mọi trường đều có thuộc tính mảng, entity_types, giới hạn các thực thể mà trường có thể được đính kèm. Giải pháp Drupal tốt nhất tôi có thể tìm thấy, hook_field_create_field, có thể thay đổi các trường khi chúng được tạo ra, nhưng điều đó không tốt cho trường nội dung được tạo khi cài đặt. Vì vậy, giải pháp của tôi chỉ là để chỉnh sửa cơ sở dữ liệu trực tiếp trong hook_install tôi

 
    $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();
1

chỉ mới bắt đầu xuống con đường tương tự ở đây là một video from fago

Các vấn đề liên quan