使用 Drupal 7 实体和字段 API 的正确方法

发布于 2024-10-12 18:19:34 字数 2231 浏览 2 评论 0原文

我正在尝试使用 Drupal 7 的实体和字段 API 来正确构建新模块。我从文档中无法理解的是使用新 API 创建具有许多设置字段(例如 Body)的“内容类型”(而不是节点类型)的正确方法。

我正在尝试使用 hook_entity_info 设置实体,然后我相信我需要使用 field_create_instance 添加正文字段,但我似乎无法让它工作。

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

那么它会出现在 .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);
}

I'm trying to use Drupal 7's entities and field API to correctly build a new module. What I have been unable to understand from the documentation is the correct way to use the new API to create a 'content type' (not a node type) with a number of set fields, such as Body.

I'm trying to set up the entity using hook_entity_info, then I believe I need to add the body field using field_create_instance, but I can't seem to get it to work.

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

Then does this go in the .install file?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

混浊又暗下来 2024-10-19 18:19:34

我认为你的问题是,如果安装了节点模块,则已经有一个名为“body”的字段。您应该将字段重命名为“mycontenttype_body”(comment.module 使用 comment_body),或者重新使用“body”字段并跳过添加字段部分并跳过添加其实例。推荐前者而不是后者。

I think your problem is that if node module is installed, there is already a field named 'body'. You should either re-name your field to something like 'mycontenttype_body' (comment.module uses comment_body), or re-use the 'body' field and skip the adding the field part and skip to adding the instance of it. The former is recommended over the latter.

揪着可爱 2024-10-19 18:19:34

每个字段都有一个数组属性,entity_types,它限制了该字段可以附加到的实体。
我能找到的最好的 Drupal 解决方案 hook_field_create_field 可以在创建字段时更改字段,但这对于安装时创建的 body 字段没有好处。
所以我的解决方案就是直接在我的 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();

Every field has an array property, entity_types, which limits the entities to which the field can be attached.
The best Drupal solution I can find, hook_field_create_field, can alter fields as they are created, but that's no good for the body field which is created on installation.
So my solution is just to edit the database directly in my 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();
↘紸啶 2024-10-19 18:19:34

刚刚开始沿着相同的路径,这里是来自fago的视频

just started down the same path here is a video from fago

老子叫无熙 2024-10-19 18:19:34

这是一个很好的开始:Lawmakers 实体

Here's a nice repo to start: Lawmakers entity

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文