Создайте экземпляр поля программно в словаре таксономии
Я пытаюсь создать модуль, который создает словарь таксономии при установке модуля и создает одно текстовое поле в словаре/термине таксономии. Но я получаю следующую ошибку, когда включаю свой модуль:
[ошибка] Исключение fieldexception: Попытка создать экземпляр поля field_flickr_photoset для запрещенного типа сущности taxonomy_term. в field_create_instance() (строка 468 из /var/www/www.пример.com/htdocs/модули/поле/поле.crud.inc).
Прежде всего, почему запрещенный тип сущности? Разве невозможно создать поле в словаре таксономии с помощью кода? Или мне не хватает некоторых параметров?
Я использовал очень похожий код для создания типа узла и прикрепления к нему полей, который в настоящее время работает без каких-либо проблем. Я не думал, что изменение типа сущности вызовет такие проблемы.
Я попытался выполнить поиск в Google и здесь о том, как это сделать, но все, что я получаю, - это люди, которые спрашивают, как прикрепить поле ссылки на термин таксономии к типу узла, а это не то, о чем я спрашиваю. Это прикрепление текстового поля к термину/словарю таксономии.
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;
}
Друпал 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');"
).