(РЕШЕНО) Программное создание поля для словаря таксономии

Главные вкладки

Аватар пользователя so-lo74 so-lo74 26 октября 2012 в 19:56

Всем привет.

Среда: 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);

Не пойму, где прокол? (

С уважением,
Александр

ВложениеРазмер
Иконка изображения pdoexception.jpg152.26 КБ

Комментарии

Аватар пользователя gorr gorr 26 октября 2012 в 22:11

Думаю, что для таксономии entity_type будет taxonomy, а bundle это машинное имя словаря, к которому нужно добавить поле, также, как для полей, которые расширяют типы материалов entity_type будет node, а bundle будет тип материала.
И поле добавляется именно к словарю, а не ко всем словарям таксономии.

Аватар пользователя so-lo74 so-lo74 26 октября 2012 в 22:55

Всё верно ), спасибо!
Либо 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);
}
?>