Правильный способ использования Drupal 7 Entities и Field API - PullRequest
6 голосов
/ 15 января 2011

Я пытаюсь использовать сущности и полевые API Drupal 7 для правильной сборки нового модуля.Из документации я не смог понять, как правильно использовать новый API для создания «типа контента» (а не типа узла) с несколькими заданными полями, например, «Тело».

Iя пытаюсь настроить сущность с помощью 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);
}

Ответы [ 4 ]

1 голос
/ 12 марта 2011

Каждое поле имеет свойство массива 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();
1 голос
/ 24 марта 2011

только что пошли по тому же пути, вот видео от fago

1 голос
/ 16 января 2011

Я думаю, что ваша проблема в том, что если установлен модуль узла, уже есть поле с именем 'body'. Вы должны либо переименовать свое поле в что-то вроде «mycontenttype_body» (comment.module использует comment_body), либо повторно использовать поле «body» и пропустить добавление части поля и перейти к добавлению его экземпляра. Первое рекомендуется поверх второго.

0 голосов
/ 29 июля 2014

Вот хороший репо для начала: Законодательный орган

...