Создайте экземпляр поля программно в словаре таксономии


Я пытаюсь создать модуль, который создает словарь таксономии при установке модуля и создает одно текстовое поле в словаре/термине таксономии. Но я получаю следующую ошибку, когда включаю свой модуль:

[ошибка] Исключение fieldexception: Попытка создать экземпляр поля field_flickr_photoset для запрещенного типа сущности taxonomy_term. в field_create_instance() (строка 468 из /var/www/www.пример.com/htdocs/модули/поле/поле.crud.inc).

Прежде всего, почему запрещенный тип сущности? Разве невозможно создать поле в словаре таксономии с помощью кода? Или мне не хватает некоторых параметров?

Я использовал очень похожий код для создания типа узла и прикрепления к нему полей, который в настоящее время работает без каких-либо проблем. Я не думал, что изменение типа сущности вызовет такие проблемы.

Я попытался выполнить поиск в Google и здесь о том, как это сделать, но все, что я получаю, - это люди, которые спрашивают, как прикрепить поле ссылки на термин таксономии к типу узла, а это не то, о чем я спрашиваю. Это прикрепление текстового поля к термину/словарю таксономии.

Author: Beebee, 2012-07-06

2 answers

Если вы заглянете в taxonomy_entity_info() вы увидите этот код, который определяет тип сущности taxonomy_vocabulary:

$return['taxonomy_vocabulary'] = array(
  'label' => t('Taxonomy vocabulary'),
  'controller class' => 'TaxonomyVocabularyController',
  'base table' => 'taxonomy_vocabulary',
  'entity keys' => array(
    'id' => 'vid',
    'label' => 'name',
  ),
  'fieldable' => FALSE,
);

Важно отметить, что 'fieldable' => FALSE... вот почему "запрещено" добавлять поля к этому типу.

taxonomy_term Тип сущности доступен для заполнения, поэтому у вас не возникнет проблем с добавлением экземпляров полей в один из них.

Если вы действительно хотите добавить поле в словарь, вам необходимо реализовать hook_entity_info_alter() чтобы изменить сущность словаря на 'fieldable' => TRUE (Я уже делал это раньше, это совершенно безопасно):

function MYMODULE_entity_info_alter(&$info) {
  $info['taxonomy_vocabulary']['fieldable'] = TRUE;
}
 3
Author: Clive, 2012-07-06 09:11:08

Друпал 7

Если вы проверите код, вызывающий это исключение, вы увидите следующее условие:

  // Check that the field can be attached to this entity type.
  if (!empty($field['entity_types']) && !in_array($instance['entity_type'], $field['entity_types'])) {
    throw new FieldException(t('Attempt to create an instance of field @field_name on forbidden entity type @entity_type.', array('@field_name' => $instance['field_name'], '@entity_type' => $instance['entity_type'])));
  }

Это означает, что поле, которое вы пытаетесь определить, имеет ограниченный атрибут entity_types, который содержит список сущностей, к которым может быть присоединено поле.

Поэтому либо вам нужно определить свою сущность с помощью следующего свойства вашего поля:

  'entity_types' => array(0 => 'allowed_entity_type'),

Оставьте его пустым или просто попробуйте удалить атрибут entity_types из определения поля в все.


Не забудьте очистить кэш при выполнении.

Если проблема не устранена, вы можете попытаться удалить поле, чтобы иметь возможность воссоздать его снова (например, drush eval "field_delete_field('field_which_is_broken');").

 0
Author: kenorb, 2014-08-05 13:43:50