Всем привет.
Среда: Drupal 7.16
Подскажите пожалуйста, в чем может быть дело?
Программно создаётся словарь таксономии, на основе выборки из БД, т.е. до запроса его нет.
К терминам словаря необходимо добавить поле, содержащее, скажем, uid пользователя.
<?php
$voc_name = 'voc_by_rid';
$vocabulary = taxonomy_vocabulary_machine_name_load($voc_name);
if (!$vocabulary) {
$vocabulary = array(
'machine_name' => $voc_name,
'name' => 'somebody voc',
);
$vocabulary = (object) $vocabulary;
taxonomy_vocabulary_save($vocabulary);
// добавление поля user_id (uid) к термину словаря таксономии
$field = field_info_field('user_id');
if ($field == NULL) {
$field = array(
'field_name' => 'user_id',
'type' => 'number_integer',
'settings' => array(),
'entity_types' => array('taxonomy'),
);
field_create_field($field);
// создаём экземпляр поля
$instance = array(
'field_name' => 'user_id',
'entity_type' => 'taxonomy',
'bundle' => 'taxonomy', //? вот здесь ошибка ?
'label' => 'uid пользователя',
'weight' => 1,
'widget' => array(
'type' => 'text_textfield',
'label' => t('Some text'),
),
);
$field = field_create_instance($instance);
debug($field);
?>
Пытаюсь делать по аналогии с http://ado.io/blog/drupal-7/working-programmatically-with-fields-in-drup...,
но при этом поле формально создаётся, т.е. таблица с именем поля сформирована, а экземпляр поля к сущности не подключён (из анализа структуры созданного словаря). Судя по всему неверно определён подтип сущности (bundle)?
И еще, правильно ли я понимаю, что созданное поле ассоциируется с любым словарем таксономии (структурно), а надо, чтобы поле (его экземпляр) было только в созданном словаре.
При попытке удалить созданное поле вылетает ошибка:
$field = field_info_field('user_id');
if ($field != NULL) field_delete_field($field);
Не пойму, где прокол? (
С уважением,
Александр
Вложение | Размер |
---|---|
![]() | 152.26 КБ |
Комментарии
Заранее прошу прощения за неоформленный код (
Думаю, что для таксономии entity_type будет taxonomy, а bundle это машинное имя словаря, к которому нужно добавить поле, также, как для полей, которые расширяют типы материалов entity_type будет node, а bundle будет тип материала.
И поле добавляется именно к словарю, а не ко всем словарям таксономии.
Всё верно ), спасибо!
Либо taxonomy, либо taxonomy_term — как раз нашел решение, глядя вот на эти материалы.
Быть может кому-нибудь пригодится:
http://drupal.stackexchange.com/questions/36178/create-a-field-instance-...
http://api.drupal.org/api/drupal/modules!taxonomy!taxonomy.module/functi...
фрагмент рабочего кода:
<?php
$field = field_info_field('user_id');
if ($field == NULL) {
$field = array(
'field_name' => 'user_id',
'type' => 'number_integer',
'cardinality' => 1, /* not necessary as it's the default.*/
'settings' => array(),
'entity_types' => array('taxonomy_term'),
);
field_create_field($field);
// создаём экземпляр поля
$instance = array(
'field_name' => 'user_id',
'entity_type' => 'taxonomy_term',
'bundle' => $voc_name,
'label' => 'uid пользователя',
'description' => t('You can enter some text here.'),
'weight' => 1,
'widget' => array(
'type' => 'number',
'label' => t('Some text'),
),
);
$field = field_create_instance($instance);
}
?>